NYOJ:458小光棍数

来源:互联网 发布:两组数据平均值比较 编辑:程序博客网 时间:2024/04/29 21:31

小光棍数

描述
最近Topcoder的XD遇到了一个难题,倘若一个数的三次方的后三位是111,他把这样的数称为小光棍数。他已经知道了第一个小光棍数是471,471的三次方是104487111,现在他想知道第m(m<=10000000000)个小光棍数是多少?
输入
有多组测试数据。第一行一个整数n,表示有n组测试数据。接下来的每行有一个整数m。
输出
输出第m个小光棍数。
样例输入
11
样例输出
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]<0
m2[3]=m2[3]+10=-1+10=9;
m2[2]=m2[2]-1=-1;
m2[2]<0
m2[2]=m2[2]+10=-1+10=9;
m2[1]=m2[1]-1=0-1=-1;
m2[1]<0
m2[1]=m2[1]+10=-1+10=9;
m2[0]=m2[0]-1=1-1=0
此时整型数组m2中的值变为{0,9,9,9}
然后将整型数组m2从第一位非零位全部输出,在之间printf("471\n");即为答案。
0 0