一、题目
给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。
要求:
写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数。例如 f(12) = 5。
在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。
二。设计思路
我打算寻找一种通用算法,能算所有数的算法。具体是,对于各个数位的1做分别计算,比如个位的1是最大数N/10的商乘上1加上对于余数的判断;而十位的1是最大数N/100*10加上对于两位余数的判断,以此类推就能推广到所有数,但是我目前还未实现,先附上大致代码思路(PS:结果并不正确)
三、代码
#include<iostream.h> int f(int N) { int x,y,sum=0,fu=1; do{ x=N/(fu*10); y=N%(fu*10); if(x==0) { if(y>fu) { sum=sum+fu; } } sum=sum+x*fu; fu=fu*10; }while(x>0); return sum; } void main() { int N=10; cout<<f(N); }