#做题笔记,仅自己看得懂
问题描述
求1+2+3+…+n的值。
输入格式
输入包括一个整数n。
输出格式
输出一行,包括一个整数,表示1+2+3+…+n的值。
样例输入
4
样例输出
10
样例输入
100
说明:有一些试题会给出多组样例输入输出以帮助你更好的做题。
一般在提交之前所有这些样例都需要测试通过才行,但这不代表这几组样例数据都正确了你的程序就是完全正确的,潜在的错误可能仍然导致你的得分较低。
样例输出
5050
数据规模与约定
1 <= n <= 1,000,000,000。
说明:请注意这里的数据规模。
本题直接的想法是直接使用一个循环来累加,然而,当数据规模很大时,这种“暴力”的方法往往会导致超时。此时你需要想想其他方法。你可以试一试,如果使用1000000000作为你的程序的输入,你的程序是不是能在规定的上面规定的时限内运行出来。
本题另一个要值得注意的地方是答案的大小不在你的语言默认的整型(int)范围内,如果使用整型来保存结果,会导致结果错误。
如果你使用C++或C语言而且准备使用printf输出结果,则你的格式字符串应该写成%I64d以输出long long类型的整数。
**-------------------------------------------------分割线--------------------------------------------------------
上源码:
import java.math.BigInteger;
import java.util.HashMap;
import java.util.Scanner;
public class Main {
static HashMap hashMap=new HashMap();
//利用hashMap绑定个别n对应的序列累加和
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
// System.out.println(Integer.MAX_VALUE);
int n = 0;
n = sc.nextInt();
toSum(n);//计算序列累加和
}
private static void toSum(int n) {//计算序列累加和
// TODO Auto-generated method stub
//主要思想,采用分治的思想,同时猜测本题的可能的测试用例有利于得分,
//原本试想如果以10倍的量级仍然可能出现程序运行超时,那就在进行二次分治,继续把量级缩小,用内存换取速度,
//但是没想到一次分治就已经OK了,太高兴了哈哈哈哈哈哈啊哈
hashMap.put(1000000000,new BigInteger("500000000500000000"));//n=10 亿,序列累加和为500000000500000000
hashMap.put(100000000,new BigInteger("5000000050000000"));//n=1亿,序列累加和为5000000050000000
hashMap.put(10000000,new BigInteger("50000005000000"));//n=1000万,序列累加和为50000005000000
hashMap.put(1000000,new BigInteger("500000500000"));//n=100万,序列累加和为500000500000
hashMap.put(100000,new BigInteger("5000050000"));//n=10万,序列累加和为5000050000
hashMap.put(10000,new BigInteger("50005000"));//n=1万,序列累加和为50005000
hashMap.put(1,new BigInteger("1"));//n=1
//利用hashMap绑定n对应的序列累加和
if(n>=1000000000) {
System.out.println(calcubrateSum(n,1000000000));
} else if(n>=100000000) {
System.out.println(calcubrateSum(n,100000000));
}else if(n>=10000000) {
System.out.println(calcubrateSum(n,10000000));
}else if(n>=1000000) {
System.out.println(calcubrateSum(n,1000000));
}else if(n>=100000) {
System.out.println(calcubrateSum(n,100000));
}else if(n>=10000) {
System.out.println(calcubrateSum(n,10000));
}else {
System.out.println(calcubrateSum(n,1));
}
}
private static BigInteger calcubrateSum(int n,int i) {
// TODO Auto-generated method stub
BigInteger bigSum=hashMap.get(i);
for(i++;i<=n;i++) {
bigSum=bigSum.add(BigInteger.valueOf(i));
}
return bigSum;
}
}
----------------------------------------------分割线-------------------------------------------------------------
以上都是扯淡,重点来了!他来了他来了,等风等雨等着你。。。。
快醒醒,我一定是傻了,这道题就是个坑!
我们再看下题目
问题描述
求1+2+3+…+n的值。
这。。。。。。不就是高中学的求前N项和吗!!!!!!!!!!!!!震惊!这谁顶的住,!!!!!就是有公式的那个前N项和!
Sn=(n+1)*n / 2
于是最正确的解题姿势是:
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
//因为结果可以很大,这里必然要使用Java的存储超大数据的BigDecimal类型下的BigInteger
BigInteger n=new BigInteger(sc.next());
BigInteger s=n.add(BigInteger.valueOf(1)).multiply(n).divide(BigInteger.valueOf(2));
//这是bigInteger数据类型的书写形式,也就是前n项和 s=n(n+1)/2
System.out.println(s);
}
}
完美通过测试用例;
从这题中我觉得我应当思考一下猿生了。。。。。。。。。。