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

例34.1

解题思路如下:

1.了解评分规则:分数随着解题量的增加而递增,但每题分值会逐步递减,以避免分数差距过大。

2.输入处理:使用while循环反复输入学生解题数量。

3.应用评分规则:使用if/else语句检查解题量区间,并应用相应区间内的分值计算方式。

4.输出结果:打印每个测试用例对应的得分。

#include <bits/stdc++.h>

using namespace std; 

typedef long long l;

int main() {

 //声明变量存储输入和结果
 l n, sum;  

 //使用while循环读取多个测试用例
 while(cin >> n) {

 //如果题数在0-10之间
 if(n <= 10){

   //计算并输出0-10题范围内的分数
   cout << n * 6;

 //如果题数在11-20之间
 }else if(n <= 20){  

   //计算并输出11-20题范围内的分数  
   cout << 60 + 2 * (n - 10);

 //如果题数在21-40之间
 }else if(n <= 40){
  
   //计算并输出21-40题范围内的分数
   cout << 80 + n - 20;

 //如果题数大于40
 }else{

   //输出40题以上的最大分数
   cout << 100;

 }

 //每个用例输出换行
 cout << '\n';

 }

 //结束主函数
 return 0;

}

例34.2

算法思路
1.使用cin读取输入的单链序列存入字符串a
2.定义一个空字符串b来存放输出结果
3.使用for循环遍历字符串a
4.根据a中每个碱基,利用if-else判断将其互补碱基添加到b中
5.A->T, T->A, G->C, C->G
6.循环结束后,b中存储的就是互补链的序列
7.将b输出

#include<bits/stdc++.h>
using namespace std;

int main() {
  //读取输入存入a 
  string a, b;   

  //定义输出结果字符串b
  cin >> a;

  for(int i = 0;i<a.size();i++) {  
  //遍历a
   //根据每个碱基得到互补碱基添加到b   
   if(a[i] == 'A') b += 'T';   
   if(a[i] == 'T') b += 'A';
   if(a[i] == 'G') b += 'C';
  //循环结束后b中是互补链序列 
   if(a[i] == 'C') b += 'G';   
  }

  //输出结果
  for(int i = 0;i<b.size();i++) cout << b[i];

  return 0;
}

例34.3

解题思路:
1.使用getline函数读取一行字符串存入字符串a

2.定义一个变量sum来统计数字字符个数

3.使用for循环遍历a

4.调用isdigit函数判断每个字符是否为数字

5.如果是数字则sum++

6.循环结束后输出sum

#include<bits/stdc++.h>
using namespace std;

int main() {

  //读取输入字符串
  string a;
  getline(cin, a);  

  //定义统计变量
  int sum = 0;

  for(int i = 0; i <= a.size(); i++) {

  //使用isdigit判断每个字符是否为数字
  if(isdigit(a[i]))  
    sum++;
  }

  //输出结果
  cout << sum;

  return 0;
}

练34.1

解题思路:
1.使用while循环读取输入,直到为0 0时退出

2.定义sum统计进位次数,temp记录当前位数字和是否大于10

3.使用while循环处理个位,十位,百位相加

4.如果个位和大于等于10,sum++,同时更新n、m和temp

5.否则直接更新n、m和temp

6.循环结束后输出sum

#include <iostream>
using namespace std;

int main() {

  //输入两个数,统计进位次数
  int n, m, sum, temp;  

  while(cin >> n >> m and n and m) { //使用while循环读取多组测试数据

  sum = 0; //定义统计进位次数变量

  while(n) { //while循环处理个位相加

    if(n%10 + m%10 + temp >= 10) { //如果个位和大于等于10
    sum++; //进位次数+1
    n /= 10; //更新n
    m /= 10; //更新m 
    temp = 1; //更新temp标记进位
    }
    else { //否则只更新状态
    n /= 10;
    m /= 10;
    temp = 0; 
    }
  }

  cout << sum << '\n'; //输出结果
  }

  return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值