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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值