在每一个数位上计算[0:9]的出现次数;e=1,2…依次代表个位、十位…;则在e位上i出现次数为(左边整数部分的值+余数的值),详见代码。
#include<iostream>
#include<fstream>
using namespace std;
long long n,a[10],t,e=1,m;
int main()
{
ifstream fin("C:\\Users\\DELL\\Desktop\\input.txt");
fin>>n;
fin.close();
m=n;
while(m)
{
t=m%10;
m=m/10;
/*i出现次数加上左边整数部分值*/
/*如n=121 e=10时,a[i]+1*10 */
for(int i=0;i<10;i++)
a[i]+=m*e;
/*余数部份 此数位值加e*/
/*如n=121 e=10时 i∈[0,2),不包括上限数字2,a[i]+e;*/
for(int i=0;i<t;i++)
{
if(i==0&&m==0)continue;
a[i]+=e;
}
/*n=121 , e=10 时,2作为上限数字,加上模值+1(模值为1,20,21中2出现2次),即加上2*/
a[t]+=(n%e+1);
e*=10;
}
/*减去首位0,计算时是从[0,9],而计数从1开始*/
a[0]--;
ofstream fout("C:\\Users\\DELL\\Desktop\\output.txt");
for(int i=0;i<10;i++)fout<<a[i]<<endl;
fout.close();
return 0;
}
文件输入输出检查控制面板里面文件名设置是否隐藏扩展名