首页 » 编程之美 » 正文

[编程之美_2.4]1的数目

题意很简单,给定一个正整数n,求1-n中,1出现在各个数中的位数的次数之和。
比如针对特定的数12312,global count += 2;因为出现了两个1,输入n,要统计1-n的情况。

int VerifyCountOneNumberAns(int n)
{
   int ans = 0;
   for (int i = 1; i <= n;i++)
   {
       int tmp = i;
       while(tmp)
       {
           if (1 == tmp%10) ans++;
           tmp /= 10;
       }
   }
   return ans;
}
int CountOneNumber(int n)
{
   if (n == 0)
       return 0;
   if (n <</span> 10)
       return 1;
   vector<</span>int> vNumber;
   vNumber.clear();
   int tmp = n;
   while(tmp)
   {
       vNumber.push_back(tmp%10);
       tmp /= 10;
   }
   int count = 0;
   int vSize = vNumber.size();
   count = (vSize - 1) * vNumber[vSize - 1] * (int)pow(10.0, (int)(vSize - 2));
   if (vNumber[vSize - 1] > 1)
   {
       count += (int)pow(10.0, (int)(vSize - 1));
   }
   else
   {
       count += n - vNumber[vSize - 1] * (int)pow(10.0, vSize - 1) + 1;
   }
   count += CountOneNumber(n - vNumber[vSize - 1] * (int)pow(10.0, vSize - 1));
   return count;
}
int main()
{
   vector<</span>int> ids;
   for (int i = 1;i <= 10000;i++)
   {
       int count = CountOneNumber(i);
       int ans = VerifyCountOneNumberAns(i);
       if (ans != count)
           cout &lt;&lt; i &lt;&lt; '\t' &lt;&lt; ans &lt;&lt; '\t' &lt;&lt; count &lt;&lt; endl;</p>

<p>}
   return 0;
}

代码中有验证程序,验证程序的正确性是不用怀疑的,然后题目给出了一种递归的方法,时间上还可以接受,应该和数的位数成正比。
PS:自己果然不擅长数学,做起来挺吃力的。不过逻辑还挺好使的。

发表评论