序列求和入门训练
题目介绍:求1+2+3+…+n的值,(1 <= n <= 1,000,000,000)
公式:[n*(n+1)]/2
实现思路:用String接收键盘输入,然后打散存入a[]、b[]两个数组(此时两个数组数据相同)。一个数组作“n/2”部分,一个作“n+1”部分。创建一个二维数组存储a[]*b[]……这是比较笨却很容易理解的做法值得记录一下。写完猛然发现十亿的数据规模还没超出long……【无语】
import java.util.Scanner;
/**
* 通过数组实现大数累加求和
* [n*(n+1)]/2
* <p>Title: Main.java</p>
* <p>Description: </p>
* @author Wither
* @date 2019年12月15日
*/
public class Main {
public static void main(String[] args) {
/**
* 用字符串接收输入,然后打散存入数组a[],b[]
*/
Scanner sc=new Scanner(System.in);
String str=sc.nextLine();
int []a=new int[str.length()];
int []b=new int[str.length()+1];
for (int i = 0; i < a.length; i++) {
a[i]=Integer.parseInt(str.substring(i,i+1));
b[i+1]=Integer.parseInt(str.substring(i,i+1));
}
//(n+1)部分存入b[]
b[b.length-1]+=1;
//n/2部分,为避免出现小数用偶数除2
if(a[a.length-1]%2==0) {
for (int i = 0; i < a.length-1; i++) {
if(a[i]==0) {
a[i]=0;
}else {
if(a[i]%2==0) {
a[i]/=2;
}else {
a[i]=0;
a[i+1]+=10;
}
}
}
a[a.length-1]/=2;
}else {
for (int i = 0; i < b.length-1; i++) {
if(b[i]==0) {
b[i]=0;
}else {
if(b[i]%2==0) {
b[i]/=2;
}else {
b[i]=0;
b[i+1]+=10;
}
}
}
b[b.length-1]/=2;
}
/**
* 用二维数组c[][]存储a[]*b[]的矩阵
*/
int [][]c=new int[a.length][a.length+b.length-1];
int d=b.length-1;
for (int i = 0; i < c.length; i++) {
if(d>=0) {
int e=a.length-1;
for (int j = c[i].length-1; j >= 0; j--) {
if(e>=0) {
c[i][j-i]=a[e]*b[d];
e--;
}
}
d--;
}
}
/**
* c[0][]这一行用来存储最后结果
*/
for (int i = c[0].length-1; i >=0 ; i--) {
for (int j = 1; j < c.length; j++) {
c[0][i]+=c[j][i];
}
}
/**
* 前面乘法、加法计算没考虑满十进一,放到这里解决
*/
for (int i = c[0].length-1; i >=0 ; i--) {
if(c[0][i]>10) {
c[0][i-1]+=c[0][i]/10;
c[0][i]=c[0][i]%10;
}
}
/**
* 输出结果
*/
int flag=-1;
for (int i = 0; i < c[0].length; i++) {
if(c[0][i]==0&&flag==-1) {//跳过开头的0
continue;
}else {
flag=0;
System.out.print(c[0][i]);
}
}
}
}