超级加法

问题描述

输入一个正整数N,让计算机从0开始循环做加99999运算,直到和的位数达到N为止。例如:

 

输入

5

输出

99999

 

数据范围

5<=N<=20

分析:本道题似乎要用高精度,但其实不用。


1.朴素的算法是一位一位排。不写代码了。反正过不掉(也可能是懒)


2.用一下递归思想。

例如:7位

999990

99999*?>10

?=1

999990+99999

所以先填(n/5)*5个9,然后补0,最后加上99999;代码如下:

#include<bits/stdc++.h>
using namespace std;
long long ok( int x)
{
     int i;
     long long s=1;
     for (i=1;i<=x;++i) s*=10;
     return s;
}
int main()
{
     int x,n,y,i;
     cin>>n;
     x=1;
     if (n==5) cout<< "99999" ;
     if (n>5) cout<<(ok(((n/5)*5))-1)*(ok(n-(n/5)*5-1))+99999;      
但当我输入20的时候还是过不掉,也不知道是不是我写的有问题(望大犇指点)
我用这个程序,虽然过不了20,19还是可以的,于是我生成了一下
7位——————1099989
8位——————10099899
9位——————100098999
.......
.......
15位——————100000000089999
16位——————1000000000099998
你会发现,除前面两个外,后面的全是前面一个1,后面跟好多好多个0,外加一个有规律的五位数。剩下的就不用我说了,打表的小伙伴们都开始坏笑了。代码如下:
#include<bits/stdc++.h> 
using namespace std; 
int main() 

    int x,n,y,i; 
    cin>>n; 
    if(n==5) cout<<99999;
    else if(n==6) cout<<199998;
    else switch(n%5)
    {
    case 0:
    {
    cout<<"1";
    for(i=1;i<=5*(n/5-1)-1;++i) cout<<"0";
    cout<<"89999";
    break;
}
case 1:
    {
    cout<<"1";
    for(i=1;i<=5*(n/5-1);++i) cout<<"0";
    cout<<"99998";
    break;
}
case 2:
    {
    cout<<"1";
    for(i=1;i<=5*(n/5-1)+1;++i) cout<<"0";
    cout<<"99989";
    break;
}
case 3:
    {
    cout<<"1";
    for(i=1;i<=5*(n/5-1)+2;++i) cout<<"0";
    cout<<"99899";
    break;
}
case 4:
    {
    cout<<"1";
    for(i=1;i<=5*(n/5-1)+3;++i) cout<<"0";
    cout<<"98999";
    break;
}
}
    

最终完美AC



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值