N诺计算机复试刷题day03&day04

1003 翻转数的和

解法1:用字符串进行处理

#include<iostream>
#include<string>
#include<vector>
using namespace std;

int main() {
    long num_1, num_2;
    //输入反转数
    while (cin >> num_1 >> num_2) {
        string s1 = to_string(num_1);
        string s2 = to_string(num_2);
        string reverse_num1 = "";
        string reverse_num2 = "";
        //逆置字符串
        for (int i = s1.length() - 1; i >= 0; i--)
        {
            reverse_num1.push_back(s1[i]);
        }
        for (int i = s2.length() - 1; i >= 0; i--)
        {
            reverse_num2.push_back(s2[i]);
        }
        //将字符串转换为整型
        long final_number1 = stol(reverse_num1);
        long final_number2 = stol(reverse_num2);
        //输出答案
        cout << final_number1 + final_number2<<endl;
    }
    return 0;
}

解法2:用数学方法进行处理

#include<iostream>
using namespace std;

int main() {
    long num1, num2;
    while (cin >> num1 >> num2) {
        long ans1 = 0;
        long ans2 = 0;
        while (num1 > 0)
        {
            ans1 = ans1 * 10;
            ans1 = ans1 + (num1 % 10);
            num1 = num1 / 10;
        }
        while (num2 > 0)
        {
            ans2 = ans2 * 10;
            ans2 = ans2 + (num2 % 10);
            num2 = num2 / 10;
        }
        cout << ans1 + ans2 << endl;
    }

    return 0;
}

注意: 当提示需要有多组案例输入时,请使用 while (cin >> num1 >> num2)

1008 0和1的个数

#include<iostream>
using namespace std;
#include<vector>
int main() {
    int n;
    int count0 = 0;
    int count1 = 0;
    //声明一个32位全零数组
    vector<int> arr(32,0);
    cin >> n;
    //声明一个数组来接收这个二进制数
    vector<int> num;
    //将10进制转换为2进制 如将10转为 0101 反序输出时才是正确2进制数
    while (n>0)
    {
        num.push_back(n % 2);
        n = n / 2;
    }
    //将二进制数数组填入32位全零数组
    auto it1 = arr.begin();
    for (  auto it = num.begin(); it !=num.end() ; it++)
    {
        *it1 = *it;
        it1++;
    }
    //遍历修改过的32位全0数组
    for (auto it = arr.begin(); it!=arr.end() ; it++)
    {
        if (*it == 0) {
            count0++;
        }
        else
        {
            count1++;
        }
    }
    cout << "count0=" << count0 << " " << "count1=" << count1 << endl;
    return 0;
}

注意: 注意如何将十进制数转化为二进制数

//将10进制转换为2进制 如将10转为 0101 反序输出时才是正确2进制数
while (n>0)
{
    num.push_back(n % 2);
    n = n / 2;
}

1027 删除字符串

#include<iostream>
using namespace std;
#include<string>
int main() {
    string s;
    getline(cin, s);
    for (int i = 0; i < (s.length()-2); i++)
    {
        string str = s.substr(i, 3);
        if (str=="gzu"|| str == "gzU" || str == "gZu" || str == "gZU" || str == "Gzu" || str == "GzU" || str == "GZu" || str == "GZU"  )
        {
            s.erase(i, 3);//从第i个位置起删3个字符
        }
    }
    cout << s<<endl;
    return 0;
}

本题使用了string两个常用的操作

substr(i,3) 从第i个位置起截取3个字符

s.erase(i, 3);//从第i个位置起删3个字符

1240 首字母大小写

#include<iostream>
using namespace std;
#include<string>
int main() {
    string s;
    while (getline(cin, s)) {
        if (s[0] <= 'z' && s[0] >= 'a')
        {
            s[0] = s[0] - 32;
        }
        for (int i = 0; i < s.length(); i++)
        {
            if (s[i] == ' ' || s[i] == '\t' || s[i] == '\r' || s[i] == '\n') {
                
                if (s[i+1] <= 'z' && s[i+1] >= 'a')
                {
                    s[i+1] -= 32;
                }
            }
        }
        cout << s << endl;
    }
    return 0;
}

需要记住的是,字符型变量可以直接加减数字. 并且小写字母的ascii码值要比对应的大写字母多32

1259 十六进制转十进制

以下是十六进制字符串转十进制的常用方法 需要掌握

#include<iostream>
using namespace std;
#include<string>
int main() {
    string sixteen_number;
    
    while (cin >> sixteen_number) {
        int sum = 0;
        for (int i =2; i < sixteen_number.length(); i++)
        {
            sum = sum * 16;
            if (sixteen_number[i]>='A' && sixteen_number[i]<='F')
            {
                sum = sum +  sixteen_number[i] - 'A' + 10;
            }
            else {
                sum = sum + sixteen_number[i] - '0';
            }
        }
        cout << sum << endl;
    }
    
    return 0;
}

牛客 KY2 成绩排序

这道题是一道比较难的题,用了在黑马教程里刚学到的比较大小定义方法,在这道题中,我使用了map容器,用成绩作为key值,但是map不允许同样的key值出现,所以我将map修改为multimap. 这段代码可以多看看!!

#include<iostream>
#include<map>
using namespace std;
//升序方法
class mycompare0 {
public:
    bool operator()(int v1, int v2)const
    {
        return v1 > v2;
    }
};
//降序方法
class mycompare1 {
public:
    bool operator()(int v1, int v2) const 
    {
        return v1 < v2;
    }
};

int main() {
    int n;
    int compare = 0;
    string name;
    int score;
    int count = 0;
  

    while (cin >> n >> compare)
    {
        if (compare == 0)
        {
            multimap<int, string, mycompare0> student;
            for (int i = 0; i < n; i++) {
                cin >> name >> score;
                student.insert(make_pair(score, name));
                count++;
            }

            for (auto it = student.begin(); it != student.end(); it++) {
                cout << it->second << " " << it->first << endl;

            }
        }
        else
        {
            multimap<int, string, mycompare1> student;
            for (int i = 0; i < n; i++) {
                cin >> name >> score;
                student.insert(make_pair(score, name));
                count++;
            }

            for (auto it = student.begin(); it != student.end(); it++) {
                cout << it->second << " " << it->first << endl;
            }
        }
    }
   
    return 0;
}

牛客 环形链表约瑟夫问题

这道题是一道比较难的题,用了list容器

#include<iostream>
#include<list>
using namespace std;

int main() {
    int n, m;
    cin >> n >> m;
    int ans = 0;
    list<int> list01;

    //往链表里放入从1到n个数据
    for (int i = 1; i <= n; i++)
        list01.push_back(i);

    auto it = list01.begin();


    while (n > 1) {
        //找到第m个人
        for (int i = 1; i < m; i++) {
            it++;
            if (it == list01.end()) {
                it = list01.begin();
            }
        }
        //删除这个人
        it = list01.erase(it);
        //删除这个人后如果it指向了end(),将其重置为begin()
        if (it == list01.end()) {
            it = list01.begin();
        }
        n--;
    }
    if (list01.empty()) {
        ans = 0;
    }
    else {
        ans = list01.front();
    }
    cout << ans << endl;
    return 0;
}

PAT 1001 害死人不偿命的(3n+1)猜想

#include<iostream>
using namespace std;

int main() {
    int num;
    cin >> num;
    int count = 0;
    while (num != 1) {
        if (num % 2 == 0) {
            num = num / 2;
            count++;
        }
        else {
            num = (num * 3 + 1) / 2;
            count++;
        }
    }
    cout << count;
    return 0;
}

PAT 1002 写出这个数

#include<iostream>
using namespace std;
#include<map>
#include<string>

int main() {
    string s;
    //输入字符串
    getline(cin, s);
    int sum = 0;
    //遍历字符串 算出sum的值
    for (int i = 0; i < s.length(); i++)
    {
        //小技巧:在计算char类型的数字的时候用以下方式进行转换
        sum = sum + int(s[i] - '0');
    }
    //将sum转换为字符串
    string num_string = to_string(sum);
    //定义数字和拼音的映射
    map<char, string> pinyin;
    pinyin['0'] = "ling";
    pinyin['1'] = "yi";
    pinyin['2'] = "er";
    pinyin['3'] = "san";
    pinyin['4'] = "si";
    pinyin['5'] = "wu";
    pinyin['6'] = "liu";
    pinyin['7'] = "qi";
    pinyin['8'] = "ba";
    pinyin['9'] = "jiu";

    //遍历sum字符串
    for (int i = 0; i < num_string.length() - 1; i++)
    {
        cout << pinyin[num_string[i]] << " ";
    }
    //输出最后一个拼音数字 
    cout << pinyin[num_string[num_string.length() - 1]];
    return 0;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值