acm模式练习

1.A + B问题

#include<iostream>
using namespace std;
int main() {
    int a, b;
    while (cin >> a >> b) cout << a + b << endl;
}

while循环什么时候停止?

2.A + B问题||

#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|||

#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

#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||

#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|||

#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.平均绩点(浮点数格式)

#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.摆平积木

思路还是挺好想的,大差不差

#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循环

#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.运营商活动

#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.公共祖先

用数组建立映射的方法值得学习

#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)可读入一行字符串,读到换行符时终止

#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.神秘字符(字符串)

#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.位置互换

比较简单,字符反向

#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.出栈合法性(栈)

注意本道题的出入栈不是说他一定是一次性入完后再出的。

#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.链表的基本操作(链表)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值