给定一个任意的10进制数N,从1开始到N,计算所有数中1出现的次数
2014-03-24 17:17
295 查看
首先可以对分别对1位数,2位数,3位数,每一位出现1的个数,分别寻找规律,通过仔细查看可以看到,每位1的个数与当前位上的数有关系,并且与他高位的数有关系,低位的数也有关系。
具体如下:
假设N(个,十,百,千……)位上的数字为0,那么N位上为1的个数为其高位的数字乘以当前的位(个,十,百,千,万……)
假设N(个,十,百,千……)位上的数字为1,那么N位上为1的个数为其高位的数字乘以当前的位(个,十,百,千,万……),加上低位数+1(因为从0开始的)
N位上的数字为其他的数字的时候,则其相当于高位的数字乘以当前的位,因为当前位大于1,因此会多出来0-99……个数来,所以高位应该是(高位数+1)*当前位
具体如下:
假设N(个,十,百,千……)位上的数字为0,那么N位上为1的个数为其高位的数字乘以当前的位(个,十,百,千,万……)
假设N(个,十,百,千……)位上的数字为1,那么N位上为1的个数为其高位的数字乘以当前的位(个,十,百,千,万……),加上低位数+1(因为从0开始的)
N位上的数字为其他的数字的时候,则其相当于高位的数字乘以当前的位,因为当前位大于1,因此会多出来0-99……个数来,所以高位应该是(高位数+1)*当前位
#include<stdio.h> void count(int n) { int sum=0,iCurNum,iLowNum,iHighNum; int iFactor=1;//因子 while(n/iFactor!=0) { iLowNum = n-(n / iFactor) * iFactor; iCurNum = (n / iFactor) % 10; iHighNum = n / (iFactor * 10); switch(iCurNum) { case 0:sum += iHighNum*iFactor;break; case 1:sum += iHighNum * iFactor + iLowNum + 1;break; default: sum += (iHighNum+1) * iFactor;break ; } iFactor *=10; } printf("%d\n",sum); } void main(void) { int n; scanf("%d",&n); count(n); }
相关文章推荐
- 给定一个十进制的正整数N,计算从1开始到N的的所有整数中1出现的个数
- 给定一个十进制正整数N,求出从1开始,到N的所有整数,数字1出现的次数(java实现)
- 写正确函数需要注意的地方:给定一个十进制整数N,计算从1开始到N的所有整数出现的“1”的个数
- 给定一个十进制的整数,写下从1开始到N的所有整数,计算其中出现的所有"1"的个数
- 给定一个字符串S,求所有长度小于等于3的子串出现的次数,输出结果按出现次数从大到小
- 给定一个非负整数n,统计1~n中所有数中1出现的次数
- <编程之美>给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有1的个数
- 给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1”的个数
- 给定任意一个字符串,找出所有重复字符的重复的次数
- 给定一个正整数N,从1到N所有整数,计算出现1的个数
- 计算数组中任意一个单词出现的次数(HashMap)
- 给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。
- hdu 1806 Frequent values(给定一个非降序数组,求任意区间内出现次数最多的数的次数)
- 课堂练习:给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。
- 给定一个十进制n,从1开始,到n的所有整数,求出现1的个数
- 给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1”的个数
- sql 计算子字符串在父字符串中出现次数的一个非常简单的办法
- 给定一个字符串,统计一下哪个字符出现次数最大
- 去除一个字符串中出现的重复字符,并计算出出现最多次的字符的出现次数
- 计算数字k在0到n中的出现的次数,k可能是0~9的一个值