例32.1
解题思路如下:
1.读取小明需要游到的目标距离x
2.定义变量sum记录单位时间,temp记录每次游的距离
3.设小明第一步能游2米,temp初始化为2
4.使用while循环判断当前游过的距离是否小于目标距离:
5.每次循环 temp表示当前能游的距离
6.从目标距离中减去当前能游的距离,更新剩余距离
7.temp乘以0.98,模拟每次能游距离减少
8.循环次数sum加1
9.循环结束时,sum记录了小明达到目标距离需要的单位时间
10.输出sum
#include <iostream>
using namespace std;
int main() {
double n, sum, temp = 2.0; //声明变量n存储目标距离,sum存储单位时间,temp存储每次游的距离
cin >> n; //读取目标距离
while (n > 0) { //使用循环计算单位时间
n -= temp; //目标距离减去每次游的距离
temp *= 0.98; //每次游的距离递减
sum++; //单位时间加1
}
cout << sum; //输出单位时间
return 0;
}
例32.2
解题思路:
1.读取输入x和y
2.从1000开始遍历到1,逐个判断当前数i:
3.判断i是否能整除x,如果能则不是答案,继续下一个数
4.判断i是否能整除y,如果能则不是答案,继续下一个数
5.如果i不能整除x和y,则i就是满足条件的最大数
6.输出i
#include <iostream>
using namespace std;
int main() {
int n, m;
cin >> n >> m; // 读取输入的x和y
for (int i = 1000; i; i--) { // 从1000开始递减遍历
if (i % n and i % m) { // 判断是否既不是x的倍数也不是y的倍数
cout << i; // 输出结果
return 0;
}
}
}
例32.3
解题思路:
1.读取测试用例个数T
2.使用循环处理T组测试数据
3.对每个测试数n:
A,如果n为0,直接返回0
B,否则,定义临时变量temp存储乘积初始值1
C,使用循环遍历n的每一位数字:
D,求余和除法提取每一位数字
E,将每一位数字乘入temp
F,循环结束返回temp,即各位数字乘积
#include <iostream>
using namespace std;
//定义long long类型避免int溢出
typedef long long l;
//函数计算一个数各位数字乘积
l ans(l n) {
//如果为0直接返回0
if(n == 0)
return 0;
//定义临时变量存储乘积
l temp = 1;
//使用while循环遍历n每一位数字
while(n) {
//提取每一位数字
temp *= (n % 10);
//去掉最后一位准备下一次循环
n /= 10;
}
//返回乘积
return temp;
}
int main() {
//声明变量存储测试次数和每个数字
l n, t;
//读取测试次数
cin >> t;
//使用while循环处理多组测试用例
while(t--) {
//读取每个数字
cin >> n;
//调用函数计算乘积并输出
cout << ans(n) << '\n';
}
//返回0
return 0;
}
练32.1
解题思路如下:
1.读取输入n
2.定义变量sum记录立方和,从1开始累加每个数的立方
3.使用循环累加:
A,每次循环计算i的立方后加到sum
B,判断sum是否大于n
4.如果sum大于n,则上一个i-1就是最大的m
5.输出m,结束程序
#include <iostream>
using namespace std;
//定义long long类型防止溢出
typedef long long l;
int main() {
l n, sum = 0; //声明变量n存储输入值,sum存储立方和
cin >> n; //读取n
for(l i = 1; ; i++) { //使用无限循环
sum += i * i * i; //计算每一项立方和并累加到sum
if(sum > n) { //如果和大于n
cout << i-1; //输出最大的m
return 0; //返回结束程序
}
}
return 0;
}
练32.2
解题思路:
1.读取收获高度k
2.定义变量sum记录竹笋当前高度,从1开始累加每天生长量
3.使用1-365天的循环计算:
A,每天生长量为16/i
B,将生长量加到sum
C,判断sum是否大于等于k
4.如果满足条件,输出天数i,否则循环结束输出-1
#include <bits/stdc++.h>
using namespace std;
//定义double类型变量避免精度问题
typedef double l;
int main() {
l n, sum = 0; //声明变量n存储输入高度,sum记录竹笋当前高度
cin >> n; //读取收获高度
for(l i = 1; i <= 365; i++) {//使用1-365天循环
//每天生长量为16/i
sum += 16.0 / i;
if(sum >= n){ //如果当前高度大于等于收获高度
cout << i; //输出天数
return 0; //返回结束
}
}
cout << -1;//循环结束后没有达标输出-1
return 0;
}
练32.3
解题思路是:
1.读取输入的年薪n和房价年增长率m
2.定义变量sum记录小明每年累计收入,sum2记录房价
3.如果第一年收入就能买得起,输出1
4.否则,使用循环计算2-20年:
A,每年收入增加年薪加到sum
B,房价按增长率公式增加赋值给sum2
C,判断sum是否大于sum2,大于等于则是能买得起的年份
5.循环结束后,如果20年内还买不起,输出"Impossible"
#include <bits/stdc++.h>
using namespace std;
typedef double l;
// 声明全局变量n, m, sum,以及初始化sum2为200。
l n, m, sum, sum2 = 200;
int main() {
// 从标准输入读取两个double类型的值赋予n和m,分别代表本金和增长率。
cin >> n >> m;
// sum初始化为本金n。
sum = n;
// 如果本金n本身就大于或等于200,则直接输出1并结束程序。
if (n >= 200) {
cout << 1;
return 0;
}
// 使用for循环来模拟最多20年的增长情况。
for (l i = 2; i <= 20; i++) {
// 每年本金sum都增加n。
sum += n;
// sum2按照复利公式增长,即每年都增加m%。
sum2 *= (1 + m / 100.0);
// 如果在某一年sum超过了sum2,则输出这一年的年份i并结束程序。
if (sum >= sum2) {
cout << i;
return 0;
}
}
// 如果20年都没有超过,输出"Impossible"。
cout << "Impossible";
return 0;
}