C++初学必练基础题【第三期】

前言

Hello!小伙伴!
非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~
 
自我介绍 ଘ(੭ˊᵕˋ)੭
昵称:海轰
标签:程序猿|C++选手|学生
简介:因C语言结识编程,随后转入计算机专业,有幸拿过国奖、省奖等,已保研。目前正在学习C++/Linux(真的真的太难了~)
学习经验:扎实基础 + 多做笔记 + 多敲代码 + 多思考 + 学好英语!

7-21 求特殊方程的正整数解 (15 分)

题目

本题要求对任意给定的正整数N,求方程_X_2+_Y_2=N的全部正整数解。

输入格式:

输入在一行中给出正整数N(≤10000)。

输出格式:

输出方程X2+Y2=N的全部正整数解,其中X≤Y。每组解占1行,两数字间以1空格分隔,按X的递增顺序输出。如果没有解,则输出No Solution。

输入样例1:

884

输出样例1:

10 28
20 22

输入样例2:

11

输出样例2:

No Solution

解答

#include <iostream>
#include <math.h>
using namespace std;
int main()
{
    int n;
    cin >> n;
    int count = 0;
    for (int i = sqrt(n); i >= 0; --i)
    {
        for (int j = 1; j <= i; ++j)
        {
            if (i * i + j * j == n)
            {
                cout << j << " " << i << endl;
                ++count;
            }
        }
    }
    if (count == 0)
        cout << "No Solution" << endl;
    return 0;
}
image.png

7-22 龟兔赛跑 (20 分)

题目

乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进3米,兔子每分钟前进9米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是,每跑10分钟回头看一下乌龟,若发现自己超过乌龟,就在路边休息,每次休息30分钟,否则继续跑10分钟;而乌龟非常努力,一直跑,不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问T分钟后乌龟和兔子谁跑得快?

输入格式:

输入在一行中给出比赛时间T(分钟)。

输出格式:

在一行中输出比赛的结果:乌龟赢输出@@,兔子赢输出^^,平局则输出-_-;后跟1空格,再输出胜利者跑完的距离。

输入样例:

242

输出样例:

@_@ 726

解答

#include <iostream>
using namespace std;
int main()
{
    int minutes;
    cin >> minutes;
    int tortoise = 0;
    int rabbit = 0;
    int n = 0;
    while (n < minutes)
    {
        tortoise += 3;
        rabbit += 9;
        ++n;
        if (n % 10 == 0 && rabbit > tortoise)
        {
            int temp = 30;
            while (temp && n < minutes)
            {
                tortoise += 3;
                --temp;
                ++n;
            }
            if (temp != 0)
            {
                if (tortoise > rabbit)
                {
                    cout << "@_@ " << tortoise << endl;
                    return 0;
                }
                else if (tortoise < rabbit)
                {
                    cout << "^_^ " << rabbit << endl;
                    return 0;
                }
                else
                {
                    cout << "-_- " << rabbit << endl;
                    return 0;
                }
            }
        }
    }
    if (tortoise > rabbit)
    {
        cout << "@_@ " << tortoise << endl;
    }
    else if (tortoise < rabbit)
    {
        cout << "^_^ " << rabbit << endl;
    }
    else
    {
        cout << "-_- " << rabbit << endl;
    }
    return 0;
}
image.png

7-23 币值转换 (20 分)

题目

输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式。如23108元,转换后变成“贰万叁仟壹百零捌”元。为了简化输出,用小写英文字母a-j顺序代表大写数字0-9,用S、B、Q、W、Y分别代表拾、百、仟、万、亿。于是23108元应被转换输出为“cWdQbBai”元。

输入格式:

输入在一行中给出一个不超过9位的非负整数。

输出格式:

在一行中输出转换后的结果。注意“零”的用法必须符合中文习惯。

输入样例1:

813227345

输出样例1:

iYbQdBcScWhQdBeSf

输入样例2:

6900

输出样例2:

gQjB

解答

#include <bits/stdc++.h>
using namespace std;

char num[10] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'};
char sign[9] = {'e', 'S', 'B', 'Q', 'W', 'S', 'B', 'Q', 'Y'};
int main()
{
    string s, ans;
    cin >> s;
    if (s == "0")
        cout << "a" << endl;
    else
    {
        int co = s.size() - 1, bit = 0, f = 0;
        while (s[co] == '0') //判断最低位是否为0,把尾部的0全部都去掉
        {
            bit++;
            co--;
        }
        for (int i = co; i >= 0; i--)
        {
            if (s[i] == '0')
            {
                f = 1;
                bit++;
            }
            else if (s[i] != '0')
            {
                if (f == 1)
                {
                    if (bit > 4)
                        ans = ans + num[0] + 'W';
                    else
                        ans = ans + num[0];
                    ans = ans + sign[bit];
                    ans = ans + num[s[i] - '0'];
                    f = 0;
                }
                else
                {
                    if (bit != 0)
                        ans = ans + sign[bit];
                    ans = ans + num[s[i] - '0'];
                }
                bit++;
            }
        }
        cout << string(ans.rbegin(), ans.rend());
    }
    return 0;
}
#include<iostream>
using namespace std;
int main()
{
    int num;
    cin >> num;
    char a[10] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' };
    int y, w, q, b, s, g;
    y = num / 100000000;
    w = num / 10000 % 10000;
    if (num / 10 == 0)
        cout << a[num % 10];
    if (y != 0)
        cout << a[y] << 'Y';
    if (w != 0)
    {
        g = w % 10;
        s = w % 100 / 10;
        b = w % 1000 / 100;
        q = w / 1000;
        if (w < 1000 && y != 0)
            cout << 'a';
        if (q != 0)
            cout << a[q] << 'Q';
        if (b != 0)
            cout << a[b] << 'B';
        else if (b == 0 && q != 0 && s != 0)
            cout << 'a';
        if (s != 0)
            cout << a[s] << 'S';
        else if (s == 0 && (b != 0 && g != 0 || q != 0 && b == 0))
            cout << 'a';
        if (g != 0)
            cout << a[g];
        cout << 'W';
    }
    g = num % 10;
    s = num % 100 / 10;
    b = num % 1000 / 100;
    q = num % 10000 / 1000;
    if ((w != 0 || y != 0) && q == 0)
        cout << 'a';
    if (q != 0)
        cout << a[q] << 'Q';
    if (b != 0)
        cout << a[b] << 'B';
    else if (b == 0 && q != 0 && s != 0)
        cout << 'a';
    if (s != 0)
        cout << a[s] << 'S';
    else if (s == 0 && (b != 0 && g != 0 || q != 0 && b == 0))
        cout << 'a';
    if (g != 0)
        cout << a[g];
    system("pause");
}

7-24 约分最简分式 (15 分)

题目

分数可以表示为分子/分母的形式。编写一个程序,要求用户输入一个分数,然后将其约分为最简分式。最简分式是指分子和分母不具有可以约分的成分了。如6/12可以被约分为1/2。当分子大于分母时,不需要表达为整数又分数的形式,即11/8还是11/8;而当分子分母相等时,仍然表达为1/1的分数形式。

输入格式:

输入在一行中给出一个分数,分子和分母中间以斜杠/分隔,如:12/34表示34分之12。分子和分母都是正整数(不包含0,如果不清楚正整数的定义的话)。

提示:

  • 对于C语言,在scanf的格式字符串中加入/,让scanf来处理这个斜杠。
  • 对于Python语言,用a,b=map(int, input().split('/'))这样的代码来处理这个斜杠。

输出格式:

在一行中输出这个分数对应的最简分式,格式与输入的相同,即采用分子/分母的形式表示分数。如 5/6表示6分之5。

输入样例:

66/120

输出样例:

11/20

解答

#include <iostream>
using namespace std;
int gcd(int a,int b){
    if(a%b==0){
        return b;
    }else{
        return gcd(b,a%b);
    }
}
int main()
{
    string s;
    cin >> s;
    int index = s.find('/');
    int a=0;
    int b=0;
    for(int i=0;i<index;++i){
        a=a*10+(s[i]-'0');
    }
    for(int i=index+1;i<s.length();++i){
        b=b*10+(s[i]-'0');
    }
    int temp=gcd(a,b);
    a/=temp;
    b/=temp;
    string ans="";
    ans=to_string(a)+"/"+to_string(b);
    cout<<ans<<endl;
    return 0;
}
image.png

7-25 念数字 (15 分)

题目

输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下:

0: ling 1: yi 2: er 3: san 4: si 5: wu 6: liu 7: qi 8: ba 9: jiu

输入格式:

输入在一行中给出一个整数,如:1234。
提示:整数包括负数、零和正数。

输出格式:

在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如 yi er san si。

输入样例:

-600

输出样例:

fu liu ling ling

解答

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    string s;
    cin >> s;
    string a[10] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
    string ans = "";
    for (int i = 0; i < s.length(); ++i)
    {
        if (i != s.length() - 1)
        {
            if (s[i] == '-')
            {
                ans += "fu ";
            }
            else
            {
                ans += a[s[i]-'0'] + " ";
            }
        }
        else
        {
            ans += a[s[i]-'0'];
        }
    }
    cout << ans << endl;
    return 0;
}
image.png

7-26 单词长度 (15 分)

题目

你的程序要读入一行文本,其中以空格分隔为若干个单词,以.结束。你要输出每个单词的长度。这里的单词与语言无关,可以包括各种符号,比如it's算一个单词,长度为4。注意,行中可能出现连续的空格;最后的.不计算在内。

输入格式:

输入在一行中给出一行文本,以.结束
提示:用scanf("%c",...);来读入一个字符,直到读到.为止。

输出格式:

在一行中输出这行文本对应的单词的长度,每个长度之间以空格隔开,行末没有最后的空格。

输入样例:

It's great to see you here.

输出样例:

4 5 2 3 3 4

解答

#include <iostream>
using namespace std;
int main()
{
    string s;
    getline(cin, s);
    int count = 0;
    // 去除开头的空格
    while (s[count] == ' ')
    {
        ++count;
    }
    s = s.substr(count, s.length() - count);

    // 去除末尾的空格
    // 注意:最后一个字符一定是. 先略过这个字符 最后再添上即可
    count = s.length() - 2;
    while (s[count] == ' ')
    {
        --count;
    }
    s = s.substr(0, count + 1);
    // 补充之前删除的.
    s += '.';

    // 空句子的情况 不输出(根据测试要求)
    if (s.length() == 1 && s[0] == '.')
    {
        return 0;
    }
    count = 0;
    int flag = 0;
    // 遍历s
    for (int i = 0; i < s.length(); ++i)
    {
        if (s[i] != ' ' && s[i] != '.')
        {
            ++count;
            flag = 0;
        }
        else if (s[i] == ' ')
        {
            ++flag;
            // 只有一个空格才输出 多个空格不输出
            if (flag == 1)
            {
                cout << count << " ";
                count = 0;
            }
        }
        else
        {
            // 输出最后一个单词的长度
            cout << count << endl;
        }
    }
    return 0;
}
image.png
#include <iostream>
#include <string>

using namespace std;

int main(void)
{
    string s;
    int count;
    int flag = 0; 
    // 一个一个读入单词
    // 避免了计算空格的繁琐
    while (cin >> s)
    {
        count = s.size();
        if (s[count - 1] == '.')
        {
            // 考虑空句子的情况
            // 按照测试 是不输出的
            if (count - 1 > 0)
            {
                if (flag != 0)
                    cout << " ";
                cout << count - 1;
                break;
            }
        }
        else
        {
            if (flag != 0)
                cout << " ";
            cout << count;
            flag = 1;
        }
    }
    return 0;
}

7-27 冒泡法排序 (20 分)

题目

N个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们。通过一遍扫描,则最后一个元素必定是最大的元素。然后用同样的方法对前N−1个元素进行第二遍扫描。依此类推,最后只需处理两个元素,就完成了对N个数的排序。

本题要求对任意给定的K(<N),输出扫描完第K遍后的中间结果数列。

输入格式:
输入在第1行中给出N和K(1≤K<N≤100),在第2行中给出N个待排序的整数,数字间以空格分隔。

输出格式:

在一行中输出冒泡排序法扫描完第K遍后的中间结果数列,数字间以空格分隔,但末尾不得有多余空格。

输入样例:

6 2
2 3 5 1 6 4

输出样例:

2 1 3 4 5 6

解答

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    int n;
    int k;
    vector<int> nums;
    cin >> n >> k;
    for (int i = 0; i < n; ++i)
    {
        int temp;
        cin >> temp;
        nums.push_back(temp);
    }
    for (int i = nums.size()-1 ; i >=0 && k>0; --i)
    {
        for (int j = 0; j < i; ++j)
        {
            if (nums[j] > nums[j + 1])
            {
                swap(nums[j], nums[j + 1]);
            }
        }
        --k;
    }
    for (int i = 0; i < nums.size(); ++i)
    {
        if (i != nums.size() - 1)
        {
            cout << nums[i] << " ";
        }
        else
        {
            cout << nums[i] << endl;
        }
    }
    return 0;
}
image.png

7-28 猴子选大王 (20 分)

题目

一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?

输入格式:

输入在一行中给一个正整数N(≤1000)。

输出格式:

在一行中输出当选猴王的编号。

输入样例:

11

输出样例:

7

解答

#include <iostream>
using namespace std;
int main()
{
    int n;
    cin >> n;
    int ans = 0;
    for (int i = 2; i <= n; ++i)
    {
        ans = (ans + 3) % i;
    }
    cout << ans + 1 << endl;
    return 0;
}
image.png

7-29 删除字符串中的子串 (20 分)

题目

输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2。

输入格式:

输入在2行中分别给出不超过80个字符长度的、以回车结束的2个非空字符串,对应S1和S2。

输出格式:

在一行中输出删除字符串S1中出现的所有子串S2后的结果字符串。

输入样例:

Tomcat is a male ccatat
cat

输出样例:

Tom is a male

解答

注意字符串s2中也有可能含有空格 需要用getline

#include <iostream>
using namespace std;
int main()
{
    string s1;
    string s2;
    getline(cin, s1);
    //cin>>s2;
    getline(cin, s2);
    while (s1.find(s2) != -1)
    {
        s1.erase(s1.find(s2), s2.length());
    }
    cout << s1 << endl;
    return 0;
}
image.png

7-30 字符串的冒泡排序 (20 分)

题目

我们已经知道了将N个整数按从小到大排序的冒泡排序法。本题要求将此方法用于字符串序列,并对任意给定的K(<N),输出扫描完第K遍后的中间结果序列。

输入格式:

输入在第1行中给出N和K(1≤K<N≤100),此后N行,每行包含一个长度不超过10的、仅由小写英文字母组成的非空字符串。

输出格式:

输出冒泡排序法扫描完第K遍后的中间结果序列,每行包含一个字符串。

输入样例:

6 2
best
cat
east
a
free
day

输出样例:

best
a
cat
day
east
free

解答

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    int n;
    int k;
    cin >> n >> k;
    vector<string> nums;
    for (int i = 0; i < n; ++i)
    {
        string temp;
        cin >> temp;
        nums.push_back(temp);
    }
    for (int i = nums.size() - 1; i >= 0 && k > 0; --i)
    {
        for (int j = 0; j < i; ++j)
        {
            if (nums[j] > nums[j + 1])
            {
                swap(nums[j], nums[j + 1]);
            }
        }
        --k;
    }
    for (int i = 0; i < nums.size(); ++i)
    {
        cout << nums[i] << endl;
    }
    return 0;
}
image.png

结语

文章仅作为学习笔记,记录从0到1的一个过程

希望对您有所帮助,如有错误欢迎小伙伴指正~

我是 <font color="#0984e3">海轰ଘ(੭ˊᵕˋ)੭</font>

如果您觉得写得可以的话,请点个赞吧

谢谢支持❤️


在这里插入图片描述
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容