问题描述
给定 n 个整数 a1,a2,⋅⋅⋅,an ,求它们两两相乘再相加的和,即:
S=a1⋅a2+a1⋅a3+⋯+a1⋅an+a2⋅a3+⋯+an−2⋅an−1+an−2⋅an+an−1⋅an
输入格式输入的第一行包含一个整数 nn。
第二行包含 n 个整数 a1,a2,⋯,an。
输出格式
输出一个整数 SS,表示所求的和。请使用合适的数据类型进行运算。
样例输入
4
1 3 6 9
样例输出
117
题解
用数学知识解,同时用long类型,防止超时和爆容量。
假如有5个数:a0,a1,a2,a3,a4
求解:
// sum0 = a0 + a1 + a2 + a3 + a4
// 用乘法分配律进行分组求和
// sum1 = ( a1 + a2 + a3 + a4 ) * a0 = (sum0 - a0 ) * a0
// sum2 = ( a2 + a3 + a4 ) * a1 = (sum0 - a0 - a1 ) * a1
// sum3 = ( a3 + a4 ) * a2 = (sum0 - a0 - a1 - a2 ) * a2
// sum4 = ( a4 ) * a3 = (sum0 - a0 - a1 - a2 - a3 ) * a3
// res = sum1 + sum2 + sum3 + sum4
//可以看到非常的有规律
//我们求出数组的和(sum)后,在遍历求和时,依次减去当前索引所指的数,再与这个被减的数相乘
*/
不确定可以用草稿简单计算一下
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
// 接收第一个参数
int n = scan.nextInt();
//声明一个第一个参数长度数组
long[] nums = new long[n];
long sum = 0;
long res = 0;
for(int i = 0;i < n;i++) {
//动态存入重控制台输入的参数
nums[i] = scan.nextLong();
sum += nums[i];
}
for(int i = 0;i < nums.length-1;i++) {
sum -= nums[i];
res += sum * nums[i];
}
System.out.println(res);
}