序列求和 出错的一点心得

来源:互联网 发布:windows 连接ecs 编辑:程序博客网 时间:2024/06/18 14:03

除了大二开始,在校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);


     就这么干,准没错。果然AC了。

 不过发现我这算法也太渣了。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位长整形没形成一个统一的标准。很简单的一道题,大神勿喷~ 哈哈


0 0
原创粉丝点击