每日一题(10)——统计连续数字中1的个数

问题:

输入十进制数字N,统计从1到N的连续数字中,所有的1出现的次数。

 

例如:

•N = 3,   f(3) = 1 (只有一位数字的情况)
•(两位数字的情况)
•N = 13, f(13) = 6           2+4
•N = 23 ,f(23) = 13         3+10
•N = 33, f(33) = 14        10+4
•……
•N = 99, f(99) = 20        10+10
 
•N = 123
•个位出现1个数:13
•十位数出现1个数:20
•百位出现1个数:24
•同理,我们可以分析4位数、5位数。。。
 
 
总结规律:
计算方法:可以通过分别计算每一位上出现1的次数,最后加和统计一共出现的次数
 
引出问题:
怎样计算某一特定位上1出现的次数?
假设N=abcde,要计算其百位上1出现的次数,
它受到 三个因素的影响: 百位以上的数字,百位以下的数字,百位上的数字
 
当百位数字c=0时,百位上出现1的次数只受 百位以上的数字影响
12045:百位上1出现的次数为12*100=1200 次
当百位数字c=1时,百位上出现1的次数只受 百位以上的数字,百位以下的数字共同影响
12145:百位上1出现的次数为12*100+45+1 次
当百位数字c>1时,百位上出现1的次数只受 百位以上的数字影响
12345:百位上1出现的次数(12+1)*100=1300次
 
其他各位也是依然这样计算。
 
[cpp]  view plain copy print ?
  1. #include   
  2.   
  3. using namespace std;  
  4.   
  5. void fun(int N)  
  6. {  
  7.     int factor=1;  
  8.     int count=0;  
  9.     int low,cur,high;  
  10.     while (N/factor)  
  11.     {  
  12.         low = N - (N/factor)*factor;  
  13.         cur = (N/factor)%10;  
  14.         high = N/(factor*10);  
  15.           
  16.         switch(cur)  
  17.         {  
  18.         case 0:  
  19.             count += high*factor;  
  20.             break;  
  21.         case 1:  
  22.             count += high*factor+low+1;  
  23.             break;  
  24.         default:  
  25.             count += (high+1)*factor;  
  26.             break;  
  27.         }  
  28.   
  29.         factor *=10;  
  30.     }  
  31.     cout<
  32. }  
  33.   
  34. int main()  
  35. {  
  36.     int n;  
  37.     while(cin>>n)  
  38.     {  
  39.         if(n==-1) break;  
  40.         fun(n);  
  41.     }  
  42. }  

你可能感兴趣的:(笔试题/面试题)