给定一个十进制正整数N,写下从1开始,到N所有的整数,然后数一下其中出现的所有“1”的个数。
例如:N=2,写下1,2,这样只出现了1个“1”
N=12,写下1,2,3,4........,12.这样出现了5个“1”
假设N=abcde
1 如果百位上的数字为0,则可以知道,百位上可能出现1的次数由更高位决定,比如12013,则可以知道百位出现1的情况为100-199,
1100-1199,2100-2199,........,11100-11199,一共有1200个。由更高位的数字(12)决定,并等于12(高位数字)x100(当前位数)
2 如果百位上的数为1,则可以知道,百位上可能出现1的次数不仅受高位的影响也会受到低位的影响。
受高位影响:与情况1类似
受低位影响:等于低位数字+1
3 如果百位上数字大于1,则百位上可能出现1的次数仅由更高位决定
(高位数字+1)x当前位数
icont=0;
ifactor=1;
ilowernum=0;
icurrnum=0;
ihighernum=0;
while(n/ifactor!=0)
{
ilowernum=n-(n/ifactor)*ifactor;
icurrnum=(n/ifactor)%10;
ihighernum=n/(ifactor*10);
switch(icurrnum)
{
case 0:
icount+=ihighernum*ifactor;
break;
case 1:
icount+=ihighernum*ifactor+ilowernum-1;
break;
case 2:
icount+=(ihighernum+1)*ifactor;
break;
}
ifactor+=10;
}
ifactor=1;
ilowernum=0;
icurrnum=0;
ihighernum=0;
while(n/ifactor!=0)
{
ilowernum=n-(n/ifactor)*ifactor;
icurrnum=(n/ifactor)%10;
ihighernum=n/(ifactor*10);
switch(icurrnum)
{
case 0:
icount+=ihighernum*ifactor;
break;
case 1:
icount+=ihighernum*ifactor+ilowernum-1;
break;
case 2:
icount+=(ihighernum+1)*ifactor;
break;
}
ifactor+=10;
}
posted on
浙公网安备 33010602011771号