一本通编程启蒙例28及练习题解

例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;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值