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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
#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");
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
#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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
结语
文章仅作为学习笔记,记录从0到1的一个过程
希望对您有所帮助,如有错误欢迎小伙伴指正~
我是 海轰ଘ(੭ˊᵕˋ)੭
如果您觉得写得可以的话,请点个赞吧
谢谢支持❤️
文章来源: haihong.blog.csdn.net,作者:海轰Pro,版权归原作者所有,如需转载,请联系作者。
原文链接:haihong.blog.csdn.net/article/details/120217797
- 点赞
- 收藏
- 关注作者
评论(0)