除了大二开始,在校OJ上做过几十道ACM题后,真心虐心,后来变没怎么接触了。今天闲暇时,看了一道菜菜的题,结果被虐了好几遍,大神勿喷。
题目很简单,求1+2+3+...+n的值。
起初,不管三七二十一,就有了以下的代码:
int main(int argc, char* argv[])
{
long sum =0;
long i;
long end;
scanf("%ld",&end);
for(i=1;i<=end;i++)
{
sum+=i;
}
printf("%ld",sum);
return 0;
}
很显然,没有AC,很显然注意到了数据规模 1 <= n <= 1,000,000,000。
神码,long int 显然不能满足数据长度了,那就使用64位的int ,在VC6.0里,就用_int64 来定义,OK,测试了下没问题。
提交代码后,报错了!!编译错误。查了下系统用的是GCC编译器。
百度了后,应该这么写
//C/C++中怎样使用64位整数?
64位整数的类型定义为:long long
使用scanf读的操作为:scanf("%I64d", &x);
使用printf写的操作为:printf("%I64d", x);
不过发现我这算法也太渣了。cpu使用843ms,果断想起初中时候数学多项和公式:首项加尾项乘以项数除以2,再改进下:
int main()
{
long long end;
scanf("%I64d",&end);
printf("%I64d",(1 + end) * end / 2);
return 0;
}
CPU使用0ms,完美解决。在VC中定义64位整形_int64,使用long long 则会报错,一种语言的语法和编译器有关,其实也可以理解,在C语言最初,没有64位的机器,到后来出现64位,64位长整形没形成一个统一的标准。很简单的一道题,大神勿喷~ 哈哈