【ACM专项练习#02】输入整行字符串、输入值到vector、取输入整数的每一位
输入整行字符串
平均绩点
题目描述
每门课的成绩分为A、B、C、D、F五个等级,为了计算平均绩点,规定A、B、C、D、F分别代表4分、3分、2分、1分、0分。
输入
有多组测试样例。每组输入数据占一行,由一个或多个大写字母组成,字母之间由空格分隔。
输出
每组输出结果占一行。如果输入的大写字母都在集合{A,B,C,D,F}中,则输出对应的平均绩点,结果保留两位小数。否则,输出“Unknown”。
样例输入
A B C D F
B F F C C A
D C E F
样例输出
2.00
1.83
Unknown
输入输出知识点
如果要一次性获取一行字符串作为输入,请使用getline函数+cin
#include <iostream>
#include <string>
//获取一行字符串输入
string s;//用于保存输入字符串
getline(cin, s);//用于从输入流读取一行文本
string s;
cin >> s;
//获取一个字符输入
char c;
c = cin.get();
代码
#include <iostream>
#include <string>
using namespace std;
int main(){
string inputLevel;
while(getline(cin, inputLevel)){
float sum = 0;
int count = 0;
int f = 1;
for(int i = 0; i < inputLevel.size(); ++i){
if(inputLevel[i] == 'A') {sum += 4; count++;}
else if(inputLevel[i] == 'B') {sum += 3; count++;}
else if(inputLevel[i] == 'C') {sum += 2; count++;}
else if(inputLevel[i] == 'D') {sum += 1; count++;}
else if(inputLevel[i] == 'F') {sum += 0; count++;}
else if(inputLevel[i] == ' ') continue;
else{
f = 0;
cout << "Unknown" << endl;
break;
}
}
if(f) printf("%.2f\n", sum / count);
}
return 0;
}
输入值并放入vector中
摆平积木
题目描述
小明很喜欢玩积木。一天,他把许多积木块组成了好多高度不同的堆,每一堆都是一个摞一个的形式。然而此时,他又想把这些积木堆变成高度相同的。但是他很懒,他想移动最少的积木块来实现这一目标,你能帮助他吗?
输入
输入包含多组测试样例。每组测试样例包含一个正整数n,表示小明已经堆好的积木堆的个数。
接着下一行是n个正整数,表示每一个积木堆的高度h,每块积木高度为1。其中1<=n<=50,1<=h<=100。
测试数据保证积木总数能被积木堆数整除。
当n=0时,输入结束。
输出
对于每一组数据,输出将积木堆变成相同高度需要移动的最少积木块的数量。
在每组输出结果的下面都输出一个空行。
样例输入
6
5 2 4 1 7 5
0
样例输出
5
输入输出知识点
先分析一下题目,题目要求我们把所有积木堆摆成同样高度
那我们就得将所有积木堆的高度加起来取平均值才能知道每个积木堆要摆多高
然后就是将超过平均值的积木堆减去平均值得到该积木堆需要移动的次数,小于平均值的积木堆不用管,因为我们只需要从高的积木堆取积木
那么就涉及到怎么求平均值,用之前的方法累加虽然可以,但是就没办法再去取到输入的单个数值了
所以需要使用数组来保存输入的元素
具体来说就是创建一个数组,然后在遍历这个数组的时候用cin给每个下标位置赋值
vector<int> stack(n, 0);
for(int i = 0; i < n; ++i){
cin >> stack[i];
...
}
代码
#include <iostream>
#include<vector>
using namespace std;
int main(){
int n;
while(cin >> n){
if(n == 0) break;
int sum = 0;
vector<int> stack(n, 0);
for(int i = 0; i < n; ++i){
cin >> stack[i];
sum += stack[i];
}
int average = sum / n;
int moveTimes = 0;
for(int stackHigh : stack){
if(stackHigh > average){
moveTimes += stackHigh - average;
}
}
cout << moveTimes << endl;
cout<< endl;
}
}
共同祖先
题目描述
小明发现和小宇有共同祖先!现在小明想知道小宇是他的长辈,晚辈,还是兄弟。
输入
输入包含多组测试数据。每组首先输入一个整数N(N<=10),接下来N行,每行输入两个整数a和b,表示a的父亲是b(1<=a,b<=20)。小明的编号为1,小宇的编号为2。
输入数据保证每个人只有一个父亲。
输出
对于每组输入,如果小宇是小明的晚辈,则输出“You are my younger”,如果小宇是小明的长辈,则输出“You are my elder”,如果是同辈则输出“You are my brother”。
样例输入
5
1 3
2 4
3 5
4 6
5 6
6
1 3
2 4
3 5
4 6
5 7
6 7
样例输出
You are my elder
You are my brother
代码
#include<iostream>
#include<vector>
using namespace std;
int main(){
int n, a, b, xm, xy;
vector<int> nums(30, 0);
while(cin >> n){
while(n--){
cin >> a >> b;
nums[a] = b;
}
int xmLen = 0, xyLen = 0;
xm = nums[1];
while(xm != 0){
xm = nums[xm];
xmLen++;
}
xy = nums[2];
while(xy != 0){
xy = nums[xy];
xyLen++;
}
if (xmLen > xyLen) cout << "You are my elder" << endl;
else if (xmLen == xyLen) cout << "You are my brother" << endl;
else cout << "You are my younger" << endl;
}
}
取输入整数的每一位值
奇怪的信
题目描述
有一天, 小明收到一张奇怪的信, 信上要小明计算出给定数各个位上数字为偶数的和。
例如:5548,结果为12,等于 4 + 8 。
小明很苦恼,想请你帮忙解决这个问题。
输入
输入数据有多组。每组占一行,只有一个整整数,保证数字在32位整型范围内。
输出
对于每组输入数据,输出一行,每组数据下方有一个空行。
样例输入
415326
3262
样例输出
12
10
代码
只要别忘了通过取模的方式获取每个位上的数值的方法,这题就是好做的
#include<iostream>
#include<vector>
using namespace std;
int main(){
int n, num;
while(cin >> n){
int res = 0;
while(n != 0){
num = n % 10;
n /= 10;
if(num % 2 == 0) res += num;
}
cout << res << endl;
cout << endl;
}
}