lanqiaobei14

发布时间 2023-04-09 22:26:32作者: 风起鹤归

[每周例题1]蓝桥杯c++ 2080.求和

*问题描述*

给定 n 个整数 a1,a2,⋅⋅⋅,an求它们两两相乘再相加的和,即:

S=a1*a2+a1*a3+...+a1*an+a2*a3+...+an-1*an

*输入格式*

输入的第一行包含一个整数 n。

第二行包含 n个整数 a1,a2,⋯,an.

*输出格式*

输出一个整数 S,表示所求的和。请使用合适的数据类型进行运算。

#include <iostream>
using namespace std;
int main()
{
	// 请在此输入您的代码
	int S = 0;
	int sum=0;
	int num;
	int arr[10000];
	cin >> num;
	for (int i = 0; i < num; i++)
	{
		cin >> arr[i];
	}
	//方法一:该方法暴力遍历两次arr[]
	//第一次拿到第i个数
	//第二次拿到i往后的每一个数
	//两数相乘加到S
	//缺点:超时了
	/*for (int i = 0; i < num; i++)
	{
		for (int j = i+1; j < num; j++)
		{
			S+=arr[i] * arr[j];
		}
	}*/
    //方法二:考虑到a1(a2+a3+a4+...+an)+a2(a3+a4+...+an)+a3(a4+...+an)
    //遍历一次arr[]拿到总和
    for (int i = 0; i < num; i++)
    {
        sum += arr[i];
    }
    for (int i = 0; i < num; i++)
    {
        sum = sum - arr[i];//相当于(a1+a2+a3+...+an)-a1,每进行一次计算减一次最前面的数
        S += arr[i] * sum;
    }

    cout << S << endl;
    return 0;
    }

思路:

方法一:


​ 先定义一个数组记录放入的值,本来我想外层遍历一次拿到对应的a[i],再对内存遍历一次拿到(a[i+1]+a[i+2]+…+a[n]),

再对a[i]*(a[i+1]+a[i+2]+…+a[n])进行累加再将结果打印出来,但是,它又超了……

方法二:


​ 考虑到a1(a2+a3+a4+...+an)+a2(a3+a4+...+an)+a3(a4+...+an)于是我遍历一次数组把他们都加起来记为sum,当计算a1(a2+a3+a4+...+an)时就将sum-去a1,再用a1*减去a1后的sum,往后都是这样将他们累加到S里,最后再打印S即可