统计数字
统计数字
| Time Limit: 1000MS | Memory Limit: 65535KB |
| Submissions: 102 | Accepted: 15 |
Sample Input
999
Sample Output
0 189 1 300 2 300 3 300 4 300 5 300 6 300 7 300 8 300 9 300
解析:
题意很好理解,这里我想写的原因是,分享一种思想,因为这道题的n中任何一位不同,结果就会发生一定变化,那么就对每一位进行讨论,因此从首位开始,用递归就简便多了,最后的结果再减去多加的数,如一开始没讨论的首位为0的情况,代码如下:
# include<stdio.h> # include<math.h> long long nPage; long long solve(long long n,int e,int power) { long long hun,th,sum; if(power==0) { if(n>=e)return 1; else return 0; } hun=(int)pow((double)10,(double)power);//得到10的power次方 th=n/hun;//th相当于高power位所在的数 if(th<e) { sum=(th+1)*power*hun/10+solve(n%hun,e,power-1); } else if(th==e) { sum=(th+1)*power*hun/10+n%hun+1+solve(n%hun,e,power-1); } else { sum=(th+1)*power*hun/10+hun+solve(n%hun,e,power-1); } return sum; } long long Dec(int power,int e)//前面多加的数 { if(power==0&&e)return 0; else if(power==0&&e==0)return 1; else if(e==0) return power*(int)pow((double)10,(double)(power-1))+(int)pow((double)10,(double)power)+Dec(power-1,e);//0不能在首位,因此要特殊处理 else return power*(int)pow((double)10,(double)(power-1))+Dec(power-1,e); } int main() { long long sum; int i,power; scanf("%lld",&nPage); for(i=0;i<=9;i++) { power=(int)log10((double)nPage);//得到nPage的位数 sum=solve(nPage,i,power)-Dec(power,i); printf("%d %lld\n",i,sum); } return 0; }
浙公网安备 33010602011771号