观察规律:
从个位到最高位,我们判断每一位1出现的次数。比如
对于数23, 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 20 2 1 22 23
个位为1的数为01,11,21。次数为3
十位为1的次数,10,11,12.13 14 15 16 17 18 19 次数为10次
总结规律得到:
在个位出现1的个数=n/10+(个位=0,0;个位>1,1;个位=1,低0位+1);
十位位出现1的个数=n/100*10+(十位=0,0;十位>1,10,;十位=1,低一位+1);
百位出现1的个数=n/1000*100+(百位=0,0;百位>1,100;百位=1,低两位+1);
手工求解:
125
个位=12+1
十位=10+10
百位=0+26
59个1
算法描述:
(1)求出所给正整数a的位数,假设为N,num保存1的个数
(2)另p=a,num+=p/10 i *10 i-1 ;(i=1...N-1);
(3)令p=a/10 i-1 ;p=p%10,if(p==1) num+=a%10 i-1 +1;if(p>1) num+=10 i-1;(i=1....N)
(4)printf(num);
#include <stdio.h>
int function(int a){
int p=a;
int num=0;
int N=0;
int temp;
int i;
while(p!=0)
{
p=p/10;
N++;
}
p=a;
for(i=1;i<=N;i++){
num+=p/pow(10,i)*pow(10,i-1);
temp=a/pow(10,i-1)%10; //temp是每一位的数
if(temp==1)
num+=a%pow(10,i-1)+1;
if(temp>1)
num+=pow(10,i-1);
}
return num;
}
void main(){
printf("%d\n",function(88888));
}