问题描述
输入一个正整数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;
}
}
}
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