lanqiaobei14
[每周例题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即可
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具