zoukankan      html  css  js  c++  java
  • 编程算法

    从1到n整数中1出现的次数 代码(C)


    本文地址: http://blog.csdn.net/caroline_wendy


    题目: 输入一个整数n, 求从1到n这n个整数的十进制表示中1出现的次数.


    把拆分为最高位数字, 其余数字, 最后数字求解.

    21345 -> 1346-21345[10000-19999, 最高位 + 1346-x1345其余位数] + 1-1345;


    代码:

    /*
     * main.cpp
     *
     *  Created on: 2014年6月29日
     *      Author: wang
     */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <limits.h>
    
    using namespace std;
    
    int PowerBase10(size_t n) {
    	int result = 1;
    	for (size_t i=0; i<n; ++i)
    		result *= 10;
    	return result;
    }
    
    int NumberOf1(const char* strN) {
    	if (!strN || *strN<'0' || *strN>'9' || *strN == '
    ')
    		return 0;
    	int first = *strN - '0';
    	size_t length = strlen(strN);
    
    	if (length == 1 && first == 0)
    		return 0;
    	if (length == 1 && first > 0)
    		return 1;
    
    	//最高位数字
    	int numFirstDight = 0;
    	if (first > 1)
    		numFirstDight = PowerBase10(length-1);
    	else if (first == 1)
    		numFirstDight = atoi(strN+1) + 1; //+1去除最高位, 在加1
    
    	//其余数字
    	int numOtherDights = first*(length-1)*PowerBase10(length-2);
    
    	//最后剩余
    	int numRecursive = NumberOf1(strN + 1);
    
    	return numFirstDight + numOtherDights + numRecursive;
    }
    
    int NumberOf1Between1AndN (int n) {
    	if (n<=0)
    		return 0;
    	char strN[50];
    	sprintf(strN, "%d", n);
    
    	return NumberOf1(strN);
    }
    
    int main(void)
    {
        int result = NumberOf1Between1AndN(12);
        printf("result = %d
    ", result);
        return 0;
    }
    
    
    

    输出:

    result = 5








  • 相关阅读:
    CSS 备忘
    header操作cookie
    定时器传参数
    Display 和Visible 区别
    php 笔记
    概要设计要求
    iOS 之 UITextView
    iOS 按钮设置图片和事件
    iOS 设置控件圆角、文字、字体
    iOS 之 UIScrollView
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6790004.html
Copyright © 2011-2022 走看看