给定一个正整数N,从1到N所有整数,计算出现1的个数
2014-04-08 16:15
127 查看
给定一个正整数N,从1到N所有整数,计算出现1的个数
最简单方法是计算每个数中1的个数然后相加,但是这么做效率随着数字增大超线性增长。f(N)为要求值,N为正整数。
改进方法 规律分析:计算f(N)转换到计算N每一位出现1的个数,这种情况最大好处就是避免了重复计算个数问题。
举例子说明:
如果百位为0 ,百位上出现1的个数有其高位决定,12013 百位出现1 情况 100-199 ,1100-1199,2100-2199 ......11100-11199 共1200个 。也就是高位12决定,即为 12*100(百位)。
如果为百位为1 ,百位出现1次数不仅由高位决定也由低位影响。12113 除了像上面那样高位分析外还增加低位 12100-121113 共 低位数字+1个。
数字为2-9 为高位数+1再乘以当前位数。
#include <iostream> using namespace std; long SumofOne(long num) { long count=0; long factor=1; long lownum=0,currentnum=0,highnum=0; while (num/factor!=0) { highnum=num/(factor*10); currentnum=(num/factor)%10; lownum=num-(num/factor)*factor; switch(currentnum){ case 0: count+=highnum*factor; break; case 1: count+=highnum*factor+lownum+1; break; default: count+=(highnum+1)*factor; break; } factor=factor*10; } return count; } int main() { long num=10000; cout<<"包含1的数目为:"<<SumofOne(num)<<endl; return 0; }
相关文章推荐
- 给定一个十进制的正整数N,计算从1开始到N的的所有整数中1出现的个数
- 写正确函数需要注意的地方:给定一个十进制整数N,计算从1开始到N的所有整数出现的“1”的个数
- 给定一个十进制的整数,写下从1开始到N的所有整数,计算其中出现的所有"1"的个数
- 课堂练习:给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。
- 正整数序列Q中的每个元素都至少能被正整数a和b中的一个整除,现给定a和b,需要计算出Q中的前几项
- 输出一个整数的每一位,计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,编写程序数一下 1到 100 的所有整数中出现多少次数字 9
- 面试题:正整数序列Q中的每个元素都至少能被正整数a和b中的一个整除,给定a和b,需要计算出Q中的前几项
- C#l练习(用方法来实现:①判断一个给定的整数是否为“质数”。②计算1-100之间的所有质数(素数)的和
- 给定一个正整数N,统计从1到N的整数中,出现“1”的个数(11这个数算出现两次)
- 给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1”的个数
- 给定一个整数数组,1≤a [i]≤n(n =数组的大小),一些元素出现两次,其他出现一次 查找在该数组中出现两次的所有元素
- 谷歌:正整数序列Q中的每个元素都至少能被正整数a和b中的一个整除,现给定a和b,需要计算出Q中的前几项
- 16、正整数序列Q中的每个元素都至少能被正整数a和b中的一个整除,现给定a和b, 需要计算出Q中的前几项
- 给定一个十进制n,从1开始,到n的所有整数,求出现1的个数
- 给定一个任意的10进制数N,从1开始到N,计算所有数中1出现的次数
- 给定一个十进制正整数N,求出从1开始,到N的所有整数,数字1出现的次数(java实现)
- 给定一个十进制整数N,求出从1到N的所有整数中出现”1”的个数
- 给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。
- <编程之美>给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有1的个数
- 给定一个集合和一个正整数c,判定是否存在该集合的子集,使其所有元素的和等于给定的正整数c?