小光棍数
-
描述
-
最近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 num,sum=0,i,len,m2[15];char m1[15];scanf("%d",&num);getchar();while(num--){gets(m1);len=strlen(m1);for(i=0;i<len;i++)m2[i]=m1[i]-'0';m2[len-1]=m2[len-1]-1;for(i=len-1;i>0;i--){if(m2[i]<0){m2[i]=m2[i]+10;m2[i-1]=m2[i-1]-1;}}for(i=0;i<len;i++)if(m2[i])break;for(;i<len;i++)printf("%d",m2[i]);printf("471\n");}return 0;}
解题思路:发现一个数的三次方最后三位为111的数结尾都含有471.所以第一个小光棍数是0471;第二个小光棍数是1471;第三个小光棍数是2471;。。。那么第n个小光棍数是(n-1)471;注意这里的(n-1)代表的是个串;因为最后m会很大,我们将这个数当成字符串输入,然后给每一位都放入整形数组里面,然后求m-1;如要求第1000个光棍数,第1000个光棍数为999471则字符数组m1为{'1','0','0','0'}然后每位都减去字符'0',放到整型数组里面则整型数组m2为{1,0,0,0}然后从最后一位开始减去1则m2[3]=m2[3]-1=-1;m2[3]<0m2[3]=m2[3]+10=-1+10=9;m2[2]=m2[2]-1=-1;m2[2]<0m2[2]=m2[2]+10=-1+10=9;m2[1]=m2[1]-1=0-1=-1;m2[1]<0m2[1]=m2[1]+10=-1+10=9;m2[0]=m2[0]-1=1-1=0此时整型数组m2中的值变为{0,9,9,9}然后将整型数组m2从第一位非零位全部输出,在之间printf("471\n");即为答案。