入门训练 序列求和

来源:互联网 发布:淘宝详情页图片模板 编辑:程序博客网 时间:2024/05/02 02:38

原题网址:http://lx.lanqiao.org/problem.page?gpid=T2

题目:

问题描述
求1+2+3+...+n的值。
输入格式
输入包括一个整数n。
输出格式
输出一行,包括一个整数,表示1+2+3+...+n的值。


/*时间限制:1.0s   内存限制:256.0MB问题描述求1+2+3+...+n的值。输入格式输入包括一个整数n。输出格式输出一行,包括一个整数,表示1+2+3+...+n的值。数据规模与约定1 <= n <= 1,000,000,000。*/#include <stdio.h>int main(){__int64 n;scanf("%I64d", &n);printf("%I64d", n*(n+1)>>1);return 0;}/*总结:一般PC(for me): int(4byte)-2^31~2^31-1 (最大为10长度)<span style="white-space:pre"></span>即:-2147483648 ~ 2147483647 __int64-2^63~2^63-1 (最大为19长度)<span style="white-space:pre"></span>即:-9223372036854775808 ~  9223372036854775807*/


如题目介绍:

说明:请注意这里的数据规模。

本题直接的想法是直接使用一个循环来累加,然而,当数据规模很大时,这种“暴力”的方法往往会导致超时。此时你需要想想其他方法。你可以试一试,如果使用1000000000作为你的程序的输入,你的程序是不是能在规定的上面规定的时限内运行出来。

本题另一个要值得注意的地方是答案的大小不在你的语言默认的整型(int)范围内,如果使用整型来保存结果,会导致结果错误。

如果你使用C++或C语言而且准备使用printf输出结果,则你的格式字符串应该写成%I64d以输出long long类型的整数。

所以不能直接循环累加(没有尝试,但想来也没有意义去尝试),使用的公式如上。这样的代码是可以通过的,且对于最大的输入:1000000000,结果是刚好19位:500000000500000000。再大点的话就要用大整数乘法了!

0 0
原创粉丝点击