1.A + B问题
cpp
#include<iostream>
using namespace std;
int main() {
int a, b;
while (cin >> a >> b) cout << a + b << endl;
}
while循环什么时候停止?
2.A + B问题||
cpp
#include<iostream>
using namespace std;
int main() {
int n, a, b;
while (cin >> n) {
while(n--){
cin >> a >> b;
cout << a + b << endl;
}
}
}
外层while循环什么时候停止?
3.A + B|||
cpp
#include<iostream>
using namespace std;
int main() {
int a, b;
while(cin >> a >> b){
if(a == 0 && b == 0) break;
cout << a + b << endl;
}
}
学会break的使用时机
4.A + B|V
cpp
#include<iostream>
using namespace std;
int main() {
int n, a;
while(cin >> n){
if(n == 0) break;
int sum = 0;
while(n--){
cin >> a;
sum += a;
}
cout << sum << endl;
}
}
5.A + B问题V||
cpp
#include<iostream>
using namespace std;
int main() {
int n, a;
while(cin >> n){
if(n == 0) break;
int sum = 0;
while(n--){
cin >> a;
sum += a;
}
cout << sum << endl;
}
}
多一个endl就可以额外输出一个空行
6.A+ B问题V|||
cpp
#include<iostream>
using namespace std;
int main() {
int n, m, a;
while(cin >> n){
while(n--){
cin >> m;
int sum = 0;
while(m--){
cin >> a;
sum += a;
}
cout << sum << endl;
if(n != 0) cout << endl;
}
}
}
需要多输出换行符,且右多组计算数据,但每大组之间又不需要换行符
7.平均绩点(浮点数格式)
cpp
#include <iostream>
#include <stdio.h>
using namespace std;
int main() {
string s;
while (getline(cin, s)){ //接受一整行字符串
float sum = 0;
int count = 0;
int flag = 1;
for(int i = 0; i < s.size(); i++){
if(s[i] == 'A') {sum += 4; count++;}
else if(s[i] == 'B') {sum += 3; count++;}
else if(s[i] == 'C') {sum += 2; count++;}
else if(s[i] == 'D') {sum += 1; count++;}
else if(s[i] == 'F') {sum += 0; count++;}
else if(s[i] == ' ') continue;
else{
flag = 0;
cout << "Unknown" << endl;
break;
}
}
if(flag == 1) printf("%.2f\n", sum / count);
}
return 0;
}
1.getline函数格式,直到读入一个换行符时停止,可接受一整行的换行符
2.s字符串可以直接进行下标访问
3." "引用字符串。''引用char类型的字符
4.cout和printf的区别:前者自动输出换行符,后者要自己输出"\n"
5.对输出小数格式的控制
8.摆平积木
思路还是挺好想的,大差不差
cpp
#include<iostream>
#include<vector>
using namespace std;
int main() {
int n;
while(cin >> n){
if(n == 0) break; //这里必须要有break,不然就会错
vector<int> nums(n, 0);
int sum = 0;
for(int i = 0; i < n; i++){
cin >> nums[i];
sum += nums[i];
}
int average = sum / n;
int move = 0;
for(int i = 0; i < n; i++){
if(nums[i] > average) move += nums[i] - average;
}
cout << move << endl;
cout << endl;
}
}
那个break出去是啥意思?因为题目说了:当n=0时,输入结束。
为什么这个while循环是必要的?不能直接cin>>n吗?但好像确实所有题在输入时都用了while循环。
9.奇怪的信
就是取出每一位数并进行判断,比较简单,还是注意上面那道题说的cin时要有while循环
cpp
#include<iostream>
using namespace std;
int main() {
int n;
while(cin >> n){
int sum = 0;
while(n){
int num = n % 10;
if(num % 2 == 0) sum += num;
n = n / 10;
}
cout << sum << endl << endl;
}
}
10.运营商活动
cpp
#include<iostream>
using namespace std;
int main() {
int m, k;
while(cin >> m >> k){
if(m == 0 && k == 0) break; //设置终止条件
int count = 0;
int day = m;
while(m >= k){
day += m / k; //这个while循环里要仔细理解题意
m = m / k + m % k;
}
cout << day << endl;
}
}
11.公共祖先
用数组建立映射的方法值得学习
cpp
#include<iostream>
#include<vector>
using namespace std;
int main () {
int n;
vector<int> nums(21,0);
while(cin >> n){
while(n--){
int a, b;
cin >> a >> b;
nums[a] = b; //a的祖先是b,建立由a到b的映射关系
}
int len_ming = 0, len_yu = 0; //分别表示小明小于是第几辈
int ming = nums[1], yu = nums[2]; //小明编号为1,小宇编号为2
for(; ming != 0; len_ming++){
ming = nums[ming];
}
for(; yu != 0; len_yu++){
yu = nums[yu];
}
// while(ming != 0){
// ming = nums[ming];
// len_ming++;
// }
// while(yu != 0){
// yu = nums[yu];
// len_yu++;
// }
if(len_ming < len_yu) cout << "You are my younger" << endl;
else if(len_yu < len_ming) cout << "You are my elder" << endl;
else cout << "You are my brother" << endl;
}
}
对长辈和晚辈的理解(捂脸)
13.句子缩写(字符串)
怎么处理空格?getline(cin, s)可读入一行字符串,读到换行符时终止
cpp
#include<iostream>
#include<string>
using namespace std;
char changeChar(char &a) { //大写变小写
if (a >= 'a' && a <= 'z') a -= 32;
return a;
}
int main () {
int n;
string result, s; //s用来记录当前行字符、result用来记录最终缩写的结果
cin >> n;
getchar();
while (n--) {
result = ""; //读入新的一行后,将结果刷新
getline(cin, s); //先获取整行字符串
result += changeChar(s[0]); //获取第一个字母
for (int i = 1; i < s.size() - 1; i++){
if(s[i] == ' ' && s[i + 1] != ' ') result += changeChar(s[i + 1]);
}
cout << result << endl;
}
}
学习吞掉词组之间空格的方法------利用for循环(注意左右区间的开闭)
15.神秘字符(字符串)
cpp
#include<iostream>
#include<string>
using namespace std;
int main() {
int n;
cin >> n;
getchar(); //吸收n后的一个回车
for(int i = 1; i <= n; i++){
string s, t;
// getline(cin, a);
// getlinr(cin, b);
cin >> s >> t;
string result = "";
for (int i = 0; i < s.size() / 2; i++) { //处理s的前半段
result += s[i];
}
result += t; //添加 字符串t
for (int i = s.size() / 2; i < s.size(); i++) { //处理后半段的字符
result += s[i];
}
cout << result << endl;
}
}
16.位置互换
比较简单,字符反向
cpp
#include<iostream>
using namespace std;
int main() {
int n;
cin >> n;
while(n--) {
string s;
cin >> s;
for(int i = 0; i < s.size() - 1; i += 2) {
char c = s[i];
s[i] = s[i + 1];
s[i + 1] = c;
}
cout << s << endl;
}
}
17.出栈合法性(栈)
注意本道题的出入栈不是说他一定是一次性入完后再出的。
cpp
#include<iostream>
#include<stack>
#include<vector>
using namespace std;
int main(){
int n;
int nums[105];
while (cin >> n) {
if (n == 0) break;
for (int index = 0; index < n; index++) cin >> nums[index]; //输入数组
stack<int> st;
int index = 0;
for(int i = 1; i <= n; i++){
st.push(i);
while (!st.empty() && st.top() == nums[index]) { //判断如果相等则出栈。但要注意在此之前一定要进行是否栈空的判断
st.pop();
index++;
}
}
if(st.empty() && index == n) cout << "Yes" << endl;
else cout << "No" << endl;
}
}
18.链表的基本操作(链表)