小光棍数

小光棍数

时间限制:1000 ms  |  内存限制:65535 KB
难度:1
描述
最近Topcoder的XD遇到了一个难题,倘若一个数的三次方的后三位是111,他把这样的数称为小光棍数。他已经知道了第一个小光棍数是471,471的三次方是104487111,现在他想知道第m(m<=10000000000)个小光棍数是多少?
输入
有多组测试数据。第一行一个整数n,表示有n组测试数据。接下来的每行有一个整数m。
输出
输出第m个小光棍数。
样例输入
             1
             1
样例输出
             471

 

 我最初的想法该方法过于复杂了,该代码一直无法AC,最后我发现应该是超时,但提交却为编译错误

#include<stdio.h>
int main()
{
	int n,i;
	__int64 m,t,j,k,s;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%I64d",&m);
		if(m==1)
			printf("471
");
		else
		{
			for(j=2,k=1;j<=m;k++)
			{
				t=471+k;
				s=t%1000;
				s=(s*s*s)%1000;
				if(s%1000==111)
				{
					j++;
				}
			}
		    printf("%I64d
",t);
		}	
	}
	return 0;

}



只要这个数的后三位是471就可以,该方法较为简洁.但仍然无法AC,错误提示为编译错误,一直很困惑。

#include<stdio.h>
int main()
{
    int n;
    __int64 s,m;
    scanf("%d",&n);
    while(n--)
	{
     scanf("%I64d",&m);
	 s=(m-1)*1000+471;
     printf("%I64d
",s);
	 }
   return 0;
}


最后看了一下优秀代码,才发现问题之所在,是long long与__int64的区别(http://blog.csdn.net/hongxdong/article/details/5559312

#include<stdio.h> 
int main() 
{   long long a,b;    
    scanf("%lld",&a);     
    while(a--)     
	{ 
		scanf("%lld",&b);        
        printf("%lld
",(b-1)*1000+471);     
	} 
    return 0; 
} 

int ,long , long long类型的范围 (借鉴)

unsigned   int   0~4294967295  
int   2147483648~2147483647
unsigned long 0~4294967295
long   2147483648~2147483647
long long的最大值:9223372036854775807
long long的最小值:-9223372036854775808
unsigned long long的最大值:18446744073709551615

__int64的最大值:9223372036854775807
__int64的最小值:-9223372036854775808
unsigned __int64的最大值:18446744073709551615


 

原文地址:https://www.cnblogs.com/NYNU-ACM/p/4237346.html