CSU 1642 Problem B

来源:互联网 发布:阿里云服务器动态ip 编辑:程序博客网 时间:2024/05/17 09:22

转自:http://blog.csdn.net/lizhaowei213/article/details/48091947

其实就是打表。现在看来也挺水的一道题。

可为什么当时没做出来呢,因为那时候水平还达不到。

方法:先从1到最大值打表。上一个状态1出现的个数,加上当前数字1的个数。然后区间两个值一减即可。

代码:

  1. #include <stdio.h>  
  2. #define N 1000005  
  3. int dp[N];  
  4. int getcnt(int x)  
  5. {  
  6.     int cnt=0;  
  7.     while(x>0)  
  8.     {  
  9.         if(x%10==1)  
  10.             cnt++;  
  11.         x/=10;  
  12.     }  
  13.     return cnt;  
  14. }  
  15. void gettable()  
  16. {  
  17.         for(int i=1;i<=1000000;i++)  
  18.                 dp[i]=getcnt(i)+dp[i-1];  
  19. }  
  20. int main()  
  21. {  
  22.         gettable();  
  23.         int a,b;  
  24.         while(scanf("%d%d",&a,&b)>0)  
  25.                 printf("%d\n",b>a?dp[b]-dp[a-1]:dp[a]-dp[b-1]);  
  26.         return 0;  



原创粉丝点击