数字统计问题

本文介绍了一个C++程序,用于计算从1到任意指定页码的所有数字中每个数字(0-9)出现的次数。程序首先将输入转换为双精度浮点数,然后根据不同长度的数字采用不同的计算策略来统计0到9各数字的出现频率。
  1. #include <iostream>
  2. #include <string>
  3. #include <sstream>
  4. #include <cmath>
  5. #include <vector>
  6. using namespace std;
  7. double string_to_num(string str)
  8. {
  9.     double back;
  10.     istringstream instr(str);
  11.     instr>>back;
  12.     return back;
  13. }
  14. int main()
  15. {
  16.     int len;
  17.     double mm; 
  18.     int countNum[10] = {0};
  19.     vector<int> posNum;
  20.     string pageNum;
  21.     
  22.     cin>>pageNum;
  23.     double num = string_to_num(pageNum);
  24.     len = pageNum.size();
  25.     
  26.     if( len <= 1 )
  27.     {
  28.         for(int i = 1; i <= int(num); i++)
  29.             countNum[i] += 1;
  30.     }
  31.     else{
  32.         const char* p = pageNum.c_str();
  33.                 for(int i = 0; i < len; i++)
  34.                 {
  35.                         int highPosNum = int( *(p+i) ) - 48;
  36.                             
  37.                         mm = pow(10.0,len-i-2) * (len-i-1);
  38.                         if( mm != 0)
  39.                         {
  40.                                 for(int j = 0; j < highPosNum; j++)
  41.                                 {
  42.                                         for(int k = 0; k < 10; k++)
  43.                                             countNum[k] += mm;
  44.                                         countNum[j] += pow(10.0,len-i-1);
  45.                                         
  46.                                 }
  47.                                 
  48.                                 if( !posNum.empty() )
  49.                                 {
  50.                                     for(int m = 0; m < posNum.size(); m++)
  51.                                     {
  52.                                         int tt = posNum.at(m);
  53.                                         
  54.                                         countNum[tt] += ( pow(10.0,len-i-1)*highPosNum );
  55.                                     }       
  56.                                 }   
  57.                                 posNum.push_back(highPosNum);
  58.                                 if( i == 0)
  59.                                 {
  60.                                     for(int j = 0; j < len-1; j++)
  61.                                         countNum[0] = countNum[0] - (len-j-1)*pow(10.0,j)*9.0;
  62.                                     countNum[0] -= len;
  63.                                 }                       
  64.                         }
  65.                         else{
  66.                                 countNum[0] += 1;
  67.                                 for(int m = 0; m < posNum.size(); m++)
  68.                                 {
  69.                                     int tm = posNum.at(m);
  70.                                     countNum[tm] += 1;
  71.                                 }
  72.                                 
  73.                                 for(int n = 1; n <= highPosNum; n++)
  74.                                 {
  75.                                     countNum[n] += 1;
  76.                                     for(int mn = 0; mn < posNum.size(); mn++)
  77.                                     {
  78.                                         int tmn = posNum.at(mn);
  79.                                         countNum[tmn] += 1;
  80.                                     }
  81.                                 }
  82.                             }
  83.                 }
  84.     }
  85.     
  86.     for(int i = 0; i < 10; i++)
  87.         cout<<countNum[i]<<endl;
  88.     return 0;
  89. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值