-
描述
-
最近Topcoder的XD遇到了一个难题,倘若一个数的三次方的后三位是111,他把这样的数称为小光棍数。他已经知道了第一个小光棍数是471,471的三次方是104487111,现在他想知道第m(m<=10000000000)个小光棍数是多少?
-
输入
- 有多组测试数据。第一行一个整数n,表示有n组测试数据。接下来的每行有一个整数m。 输出
- 输出第m个小光棍数。 样例输入
-
1 1
样例输出
-
471
代码:#include<stdio.h> #include<string.h> int main() { int n; scanf("%d",&n); while(n--) { char a[12]; scanf("%s",a); if(!strcmp(a,"1")) printf("471\n"); else { int b[12]; int len=strlen(a)-1; int m=0; for(int i=0;i<=len;i++) b[i]=a[i]-48; if(b[len]>0) b[len]=b[len]-1; else { for(int i=len;i>=0;i--) { if(b[i]>0) { m=i; break; } } b[m]=b[m]-1; for(int i=m+1;i<=len;i++) b[i]=9; if(b[0]==0) { for(int i=0;i<=len;i++) { b[i]=b[i+1]; } len=len-1; } } for(int i=0;i<=len;i++) { printf("%d",b[i]); } printf("471\n"); } } }
总结:所求的即为(m-1)471.
-
另一种:
#include<stdio.h> #include<string.h> int main() { long long int n; scanf("%lld",&n); while(n--) { long long int a; scanf("%lld",&a); printf("%lld\n",(a-1)*1000+471); } }
第二种方法昨晚想过了,不知道怎么没运行成功,后来才想到用第一个方法,现在想想,估计是当时忘记换行符了,看没通过就直接否定了。 -
坑爹。
小光棍数
最新推荐文章于 2021-03-14 22:52:17 发布