您的位置:首页 > 其它

NYOJ:458小光棍数

2016-09-06 17:07 183 查看


小光棍数

描述最近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");即为答案。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: