TJU1067

有谁这道题用搜索的么?
注意分段分析。譬如对于123456789,我们这样来计算:
分析1~99999999;
分析100000000~119999999;
分析120000000~123999999;
……
这样做有什么好处呢?注意0~10^n-1的话,每一个数字出现的次数都是相同的(首位0另外考虑),而且可以通过简单的计算就能得到。我们把一个数分段,分成几个0~10^n-1的段,然后再计算。注意100000000~119999999的时候要记住不要忘记加上首位20000000个1哦~~~
None.gif #include < iostream >
None.gif
using   namespace  std;
None.gif
None.gif
void  Init( long  _result[]);
None.gif
long  pow10( int  exp);
None.gif
long  times( long  num, int  digit, int  pos);
None.gif
int  main()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
long i,result[10];
InBlock.gif    
while(cin>>i)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        Init(result);
InBlock.gif        
int c,flag=0;
InBlock.gif        
long temp=i;
InBlock.gif        
while(temp>0)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            flag
++;
InBlock.gif            temp
/=10;
ExpandedSubBlockEnd.gif        }

InBlock.gif        
for(c=0;c<10;c++)
InBlock.gif            
for(int d=0;d<flag;d++)
InBlock.gif                result[c]
+=times(i,c,d);
InBlock.gif        
for(c=0;c<10;c++)
InBlock.gif            cout
<<result[c]<<endl;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
return 0;
ExpandedBlockEnd.gif}

None.gif
void  Init( long  _result[])
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
for(int i=0;i<10;i++) _result[i]=0;
ExpandedBlockEnd.gif}

None.gif
long  pow10( int  exp)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
if(-1==exp) return 0;
InBlock.gif    
long result=1;
InBlock.gif    
for(;exp>0;exp--) result*=10;
InBlock.gif    
return result;
ExpandedBlockEnd.gif}

None.gif
long  times( long  num, int  digit, int  pos)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
long factor1,factor2,d,result,temp=pow10(pos);
InBlock.gif    factor1
=num/temp/10;
InBlock.gif    factor2
=num%temp+1;
InBlock.gif    d
=(num/temp)%10;
InBlock.gif    result
=factor1*temp;
InBlock.gif    
if(d==digit) result+=factor2;
InBlock.gif    
if(0==digit) result-=temp;
InBlock.gif    
if(d>digit) result+=temp;
InBlock.gif    
return result;
ExpandedBlockEnd.gif}

转载于:https://www.cnblogs.com/FancyMouse/articles/243210.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值