一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如,第6 页用数字6 表示,而不是06 或006 等。数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1,2,…,9。
编程任务:给定表示书的总页码的10 进制整数n (1≤n≤10^9) 。编程计算书的全部页码中分别用到多少次数字0,1,2,…,9。
输入: 每个输入只有1 行,给出表示书的总页码的整数n。
输出: 程序运行结束时,输出有10行,在第k行输出页码中用到数字k-1 的次数,k=1,2,…,10。
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include<iostream>
#include<string>
#include<sstream>
#include<cmath>
#include<vector>
usingnamespacestd;
doublestring_to_num(stringstr)
{//字符串转换为double
doubleback;
istringstreaminstr(str);
instr>>back;
returnback;
}
intmain()
{
intlen;
doublemm;
intcountNum[10]={0};//保存统计结果
vector<int>posNum;
stringpageNum;
cin>>pageNum;
doublenum=string_to_num(pageNum);
len=pageNum.size();
if(len<=1)
{//个位数
for(inti=1;i<=int(num);i++)
countNum[i]+=1;
}
else
{
constchar*p=pageNum.c_str();
for(inti=0;i<len;i++)
{
intcurPosNum=int(*(p+i))-48;//当前处理位置上的数字
mm=pow(10.0,len-i-2)*(len-i-1);//由书上公式得f(n-1)=(n-1)pow(10,n-2)
if(mm!=0)
{//还不是个位
//对低于当前位的位置先统计,当前位留到下一次
for(intj=0;j<curPosNum;j++)
{
for(intk=0;k<10;k++)
countNum[k]+=mm;
countNum[j]+=pow(10.0,len-i-1);
}
if(!posNum.empty())
{
for(intm=0;m<posNum.size();m++)
{
inttt=posNum.at(m);
countNum[tt]+=(pow(10.0,len-i-1)*curPosNum);
}
}
posNum.push_back(curPosNum);
if(i==0)
{
//去掉多余的0
for(intj=0;j<len-1;j++)
countNum[0]=countNum[0]-(len-j-1)*pow(10.0,j)*9.0;
//去掉全0,包括一个0的情况
countNum[0]-=len-1;
}
}
else
{//位置来到个位上了
for(intm=0;m<posNum.size();m++)
{
inttm=posNum.at(m);
countNum[tm]+=1;
}
for(intn=1;n<=curPosNum;n++)
{
countNum[n]+=1;
for(intmn=0;mn<posNum.size();mn++)
{
inttmn=posNum.at(mn);
countNum[tmn]+=1;
}
}
}
}
}
for(inti=0;i<10;i++)
{
cout<<countNum[i]<<endl;
}
return0;
}
#include<string>
#include<sstream>
#include<cmath>
#include<vector>
usingnamespacestd;
doublestring_to_num(stringstr)
{//字符串转换为double
doubleback;
istringstreaminstr(str);
instr>>back;
returnback;
}
intmain()
{
intlen;
doublemm;
intcountNum[10]={0};//保存统计结果
vector<int>posNum;
stringpageNum;
cin>>pageNum;
doublenum=string_to_num(pageNum);
len=pageNum.size();
if(len<=1)
{//个位数
for(inti=1;i<=int(num);i++)
countNum[i]+=1;
}
else
{
constchar*p=pageNum.c_str();
for(inti=0;i<len;i++)
{
intcurPosNum=int(*(p+i))-48;//当前处理位置上的数字
mm=pow(10.0,len-i-2)*(len-i-1);//由书上公式得f(n-1)=(n-1)pow(10,n-2)
if(mm!=0)
{//还不是个位
//对低于当前位的位置先统计,当前位留到下一次
for(intj=0;j<curPosNum;j++)
{
for(intk=0;k<10;k++)
countNum[k]+=mm;
countNum[j]+=pow(10.0,len-i-1);
}
if(!posNum.empty())
{
for(intm=0;m<posNum.size();m++)
{
inttt=posNum.at(m);
countNum[tt]+=(pow(10.0,len-i-1)*curPosNum);
}
}
posNum.push_back(curPosNum);
if(i==0)
{
//去掉多余的0
for(intj=0;j<len-1;j++)
countNum[0]=countNum[0]-(len-j-1)*pow(10.0,j)*9.0;
//去掉全0,包括一个0的情况
countNum[0]-=len-1;
}
}
else
{//位置来到个位上了
for(intm=0;m<posNum.size();m++)
{
inttm=posNum.at(m);
countNum[tm]+=1;
}
for(intn=1;n<=curPosNum;n++)
{
countNum[n]+=1;
for(intmn=0;mn<posNum.size();mn++)
{
inttmn=posNum.at(mn);
countNum[tmn]+=1;
}
}
}
}
}
for(inti=0;i<10;i++)
{
cout<<countNum[i]<<endl;
}
return0;
}
627

被折叠的 条评论
为什么被折叠?



