例28.1
sum1,sum2,sum3,sum4分别表示
金、银、铜、总和
#include <iostream>
using namespace std;
int n, a, b, c, sum1, sum2, sum3, sum4;
int main() {
cin >> n;
while (n--) {
cin >> a >> b >> c;
sum1 += a, sum2 += b, sum3 += c, sum4 += a + b + c;
}
cout << sum1 << ' ' << sum2 << ' ' << sum3 << ' ' << sum4;
return 0;
}
例28.2
解题思路:
1.首先定义变量n、e和fac,分别表示输入的数、e的值和阶乘的累乘结果,初始值都为1。
2.从输入中获取n的值。
3.使用for循环,从1到n,每次循环将i乘以fac,并将1/fac加到e中。
4.使用fixed和setprecision(10)设置输出格式,保留小数点后10位。
5.输出e的值。
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
// 定义变量n、e和fac,分别表示输入的数、e的值和阶乘的累乘结果,初始值都为1
int n;
double e = 1, fac = 1;
// 从输入中获取n的值
cin >> n;
// 使用for循环,从1到n,每次循环将i乘以fac,并将1/fac加到e中
for (int i = 1; i <= n; i++)
fac *= i, e += 1 / fac;
// 使用fixed和setprecision(10)设置输出格式,保留小数点后10位
cout << fixed << setprecision(10) << e;
return 0;
}
例28.3
解题思路:
1.首先定义变量n、m、a、ans、sum,分别表示数列的长度、每段和的最值、当前数、最少划分的段数、当前段的和,初始值都为1。
2.从输入中获取n和m的值。
3.使用for循环,从1到n,每次循环将当前数a加到sum中。
4.判断sum是否小于等于m,如果是,则当前段的和不超过m,继续累加sum。
5.如果sum大于m,则当前段的和超过m,需要重新开始一段,将sum更新为当前数a,并将ans加1。
6.循环结束后,输出ans的值,即最少划分的段数。
#include <iostream>
using namespace std;
typedef long long l;
int main() {
// 定义变量n、m、a、ans、sum,分别表示数列的长度、每段和的最值、当前数、最少划分的段数、当前段的和,初始值都为1
l n, a, ans = 1, sum, m;
cin >> n >> m;
// 使用for循环,从1到n,每次循环将当前数a加到sum中
for (int i = 1;i <= n;i++) {
cin >> a;
// 判断sum是否小于等于m,如果是,则当前段的和不超过m,继续累加sum
if (sum + a <= m)
sum += a;
// 如果sum大于m,则当前段的和超过m,需要重新开始一段,将sum更新为当前数a,并将ans加1
else
sum = a, ans++;
}
// 循环结束后,输出ans的值,即最少划分的段数
cout << ans;
return 0;
}
练28.1
直接根据公式写代码啦
#include <iostream>
using namespace std;
int n, a, sum, temp;
int main() {
cin >> n;
temp = n;
while (--temp) {
cin >> a;
sum += a;
}
n = (n - 2) * 180;
cout << n - sum;
return 0;
}
练28.2
遍历区间,满足条件则累加
#include <iostream>
using namespace std;
int main() {
int m, n, sum = 0;
cin >> m >> n;
for (int i = m;i <= n;i++)
if (i % 17 == 0)
sum += i;
cout << sum;
return 0;
}
练28.3
解题思路:
1.首先定义变量n、a和ans,分别表示当月发送短信的总次数、每次短信的字数和短信总资费,初始值都为0。
2.从输入中获取n的值。
3.使用for循环,从1到n,每次循环将当前短信的字数a加到ans中。
4.判断a是否能被70整除,如果不能,则表示该短信超过了70个字,需要按照每70个字一条短信的限制分割成多条短信发送,将ans加1。
5.循环结束后,输出ans除以10的整数部分和余数部分,表示短信总资费,单位为元,精确到小数点后1位。
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main(){
// 定义变量n、a和ans,分别表示当月发送短信的总次数、每次短信的字数和短信总资费,初始值都为0
int n, a, ans = 0;
cin >> n;
// 使用for循环,从1到n,每次循环将当前短信的字数a加到ans中
for (int i = 1;i <= n;i++){
cin >> a;
// 判断a是否能被70整除,如果不能,则表示该短信超过了70个字,需要按照每70个字一条短信的限制分割成多条短信发送,将ans加1
ans += a / 70;
if (a % 70 != 0)
ans ++;
}
// 循环结束后,输出ans除以10的整数部分和余数部分,表示短信总资费,单位为元,精确到小数点后1位
cout << ans / 10 << "." << ans % 10;
return 0;
}
练28.4
(本题运用巧妙的解决方法)
解题思路:
1.首先定义变量n、sum和m,分别表示需要到位的学生个数、学生学号的累加和和当前学生的学号,初始值都为0。
2.从输入中获取n的值。
3.使用for循环,从1到n-1,每次循环将当前学生的学号m加到sum中。
4.输出n * (n + 1) / 2 减去sum的值,即为没有到位的学弟的学号。
为什么n * (n + 1) / 2 减去sum的值就能找到学号呢?
在输入的学生学号中,每个学生的学号都是从1到n的连续整数。所以,如果没有学生缺席,那么所有学生的学号加起来的总和就是从1到n的等差数列的和,可以使用等差数列求和公式来计算,即n * (n + 1) / 2。
而如果有学生缺席,那么缺席的学生的学号就不会被加到sum中。所以,计算n * (n + 1) / 2 减去sum的值,就能得到缺席学生的学号。因为等差数列求和公式减去实际到位学生的学号累加和,剩下的就是缺席学生的学号。
举个例子,假设n=3,学生学号分别为1、3,那么实际到位学生的学号累加和为1+3=4。根据等差数列求和公式,总和应为3 * (3 + 1) / 2 = 6。所以,缺席学生的学号为6-4=2。
#include <iostream>
using namespace std;
int main() {
// 定义变量n、sum和m,分别表示需要到位的学生个数、学生学号的累加和和当前学生的学号,初始值都为0
long long n, sum = 0, m;
cin >> n;
// 使用for循环,从1到n-1,每次循环将当前学生的学号m加到sum中
for (int i = 1;i < n;i++) {
cin >> m;
sum += m;
}
// 输出n * (n + 1) / 2 减去sum的值,即为没有到位的学弟的学号
cout << n * (n + 1) / 2 - sum;
return 0;
}