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








  • 相关阅读:
    收集一些特殊的符号
    腾讯笔试有感
    Lazy Load, 延迟加载图片的 jQuery 插件
    腾讯实习生笔试题
    IE捉迷藏bug详解(躲猫猫)
    使用SQL Server 2000 全文检索
    一篇比较不错的关于masterpage的文章
    ASP.NET中对表单输入行有选择验证
    在WSS中高亮显示搜索结果
    WebPart安装位置对FrontPager的影响
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6790004.html
Copyright © 2011-2022 走看看