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