C++初学必练基础题第四期
Posted 海轰Pro
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++初学必练基础题第四期相关的知识,希望对你有一定的参考价值。
前言
Hello!小伙伴!
非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~
自我介绍 ଘ(੭ˊᵕˋ)੭
昵称:海轰
标签:程序猿|C++选手|学生
简介:因C语言结识编程,随后转入计算机专业,有幸拿过国奖、省奖等,已保研。目前正在学习C++/Linux(真的真的太难了~)
学习经验:扎实基础 + 多做笔记 + 多敲代码 + 多思考 + 学好英语!
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;
}
7-31 字符串循环左移 (20 分)
题目
输入一个字符串和一个非负整数N,要求将字符串循环左移N次。
输入格式:
输入在第1行中给出一个不超过100个字符长度的、以回车结束的非空字符串;第2行给出非负整数N。
输出格式:
在一行中输出循环左移N次后的字符串。
输入样例:
Hello World!
2
输出样例:
llo World!He
解答
#include <iostream>
using namespace std;
int main()
{
string s1;
int n;
getline(cin, s1);
cin >> n;
string s2 = s1 + s1;
cout << s2.substr(n % s1.length(), s1.length()) << endl;
return 0;
}
7-32 说反话-加强版 (20 分)
题目
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
解答
#include <iostream>
#include <vector>
using namespace std;
int main()
{
string s1;
getline(cin, s1);
// 最后添加一个空格
s1 += " ";
string s2;
// 去除最开始的空格
int index = 0;
while (s1[index] == ' ')
{
++index;
}
// 得到最开始没有空格的s1
s1 = s1.substr(index, s1.length() - index);
vector<string> nums;
int preIndex = 0;// 一个单词第一个字母的索引
int count = 0;// 统计一个单词的长度
int blank_space = 0;// 统计空格数量
for (int i = 0; i < s1.length(); ++i)
{
if ((i == 0) || (s1[i - 1] == ' ' && s1[i] != ' '))
{
preIndex = i;
}
if (s1[i] != ' ')
{
++count;
blank_space = 0;
}
else
{
++blank_space;
// 遇到的第一个空格 添加单词 预防有多个空格的情况
if (blank_space == 1)
{
nums.push_back(s1.substr(preIndex, count));
count = 0;
}
}
}
for (int i = nums.size() - 1; i >= 0; --i)
{
if (i == 0)
{
cout << nums[i] << endl;
}
else
{
cout << nums[i] << " ";
}
}
return 0;
}
7-33 有理数加法 (15 分)
题目
本题要求编写程序,计算两个有理数的和。
输入格式:
输入在一行中按照a1/b1 a2/b2的格式给出两个分数形式的有理数,其中分子和分母全是整形范围内的正整数。
输出格式:
在一行中按照a/b的格式输出两个有理数的和。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。
输入样例1:
1/3 1/6
输出样例1:
1/2
输入样例2:
4/3 2/3
输出样例2:
2
解答
#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 s1;
string s2;
cin >> s1 >> s2;
int a1 = 0, a2 = 0, b1 = 0, b2 = 0;
int charIndex;
charIndex = s1.find('/');
for (int i = 0; i < charIndex; ++i)
{
a1 = a1 * 10 + (s1[i] - '0');
}
for (int i = charIndex + 1; i < s1.length(); ++i)
{
b1 = b1 * 10 + s1[i] - '0';
}
charIndex = s2.find('/');
for (int i = 0; i < charIndex; ++i)
{
a2 = a2 * 10 + s2[i] - '0';
}
for (int i = charIndex + 1; i < s2.length(); ++i)
{
b2 = b2 * 10 + s2[i] - '0';
}
int a = (a1 * b2 + a2 * b1) / gcd(a1 * b2 + a2 * b1, b1 * b2);
int b = (b1 * b2) / gcd(a1 * b2 + a2 * b1, b1 * b2);
if (b == 1)
{
cout << a << endl;
}
else
{
cout << to_string(a) << "/" << to_string(b) << endl;
}
return 0;
}
7-34 通讯录的录入与显示 (10 分)
题目
通讯录中的一条记录包含下述基本信息:朋友的姓名、出生日期、性别、固定电话号码、移动电话号码。 本题要求编写程序,录入N条记录,并且根据要求显示任意某条记录。
输入格式:
输入在第一行给出正整数N(≤10);随后N行,每行按照格式姓名 生日 性别 固话 手机给出一条记录。其中姓名是不超过10个字符、不包含空格的非空字符串;生日按yyyy/mm/dd的格式给出年月日;性别用M表示“男”、F表示“女”;固话和手机均为不超过15位的连续数字,前面有可能出现+。
在通讯录记录输入完成后,最后一行给出正整数K,并且随后给出K个整数,表示要查询的记录编号(从0到N−1顺序编号)。数字间以空格分隔。
输出格式:
对每一条要查询的记录编号,在一行中按照姓名 固话 手机 性别 生日的格式输出该记录。若要查询的记录不存在,则输出Not Found。
输入样例:
3
Chris 1984/03/10 F +86181779452 13707010007
LaoLao 1967/11/30 F 057187951100 +8618618623333
QiaoLin 1980/01/01 M 84172333 10086 2 1 7
输出样例:
LaoLao 057187951100 +8618618623333 F 1967/11/30
Not Found
解答
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n;
cin >> n;
vector<vector<string> > people;
while (n)
{
string a, b, c, d, e;
cin >> a >> b >> c >> d >> e;
vector<string> temp;
temp.push_back(a);
temp.push_back(b);
temp.push_back(c);
temp.push_back(d);
temp.push_back(e);
people.push_back(temp);
--n;
}
int counts;
cin >> counts;
while (counts)
{
int id;
cin >> id;
if (id < 0 || id >= people.size())
{
cout << "Not Found" << endl;
}
else
{
cout << people[id][0] << " " << people[id][3] << " " << people[id][4] << " " << people[id][2] << " " << people[id][1] << endl;
}
--counts;
}
return 0;
}
7-35 有理数均值 (20 分)
题目
本题要求编写程序,计算N个有理数的平均值。
输入格式:
输入第一行给出正整数N(≤100);第二行中按照a1/b1 a2/b2 …的格式给出N个分数形式的有理数,其中分子和分母全是整形范围内的整数;如果是负数,则负号一定出现在最前面。
输出格式:
在一行中按照a/b的格式输出N个有理数的平均值。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。
输入样例1:
4
1/2 1/6 3/6 -5/10
输出样例1:
1/6
输入样例2:
2
4/3 2/3
输出样例2:
1
解答
#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()
{
int n;
cin >> n;
int *a = new int[n]; // 存储4个分子
int *b = new int[n]; // 存储4个分母
char c; // 分隔符/
for (int i = 0; i < n; ++i)
{
cin >> a[i] >> c >> b[i];
}
int a0 = 0; // 分子初始值0
int b0 = 1; // 分母初始值1
// 计算n个分式通分后的结果
for (int i = 0; i < n; ++i)
{
a0 = a0 * b[i] + b0 * a[i];
b0 *= b[i];
}
// 如果不判断 a0==0 会出现浮点错误
if (a0 == 0)
{
cout << 0 << endl;
return 0;
}
// 平均数 其实就是分母乘以n
b0 *= n;
// 求a0 b0的最大公因数
int t = gcd(a0, b0);
a0 /= t;
b0 /= t;
if (b0 == 1)
{
cout << a0 << endl;
}
else
{
cout << a0 << "/" << b0 << endl;
}
return 0;
}
7-36 复数四则运算 (15 分)
题目
本题要求编写程序,计算2个复数的和、差、积、商。
输入格式:
输入在一行中按照a1 b1 a2 b2的格式给出2个复数C1=a1+b1i和C2=a2+b2i的实部和虚部。题目保证C2不为0。
输出格式:
分别在4行中按照(a1+b1i) 运算符 (a2+b2i) = 结果的格式顺序输出2个复数的和、差、积、商,数字精确到小数点后1位。如果结果的实部或者虚部为0,则不输出。如果结果为0,则输出0.0。
输入样例1:
2 3.08 -2.04 5.06
输出样例1:
(2.0+3.1i) + (-2.0+5.1i) = 8.1i
(2.0+3.1i) - (-2.0+5.1i) = 4.0-2.0i
(2.0+3.1i) * (-2.0+5.1i) = -19.7+3.8i
(2.0+3.1i) / (-2.0+5.1i) = 0.4-0.6i
输入样例2:
1 1 -1 -1.01
输出样例2:
(1.0+1.0i) + (-1.0-1.0i) = 0.0
(1.0+1.0i) - (-1.0-1.0i) = 2.0+2.0i
(1.0+1.0i) * (-1.0-1.0i) = -2.0i
(1.0+1.0i) / (-1.0-1.0i) = -1.0
解答
#include <bits/stdc++.h>
using namespace std;
struct num{
double real;
double image;
};
num c1, c2;
void print(double a, double b, char c) {
bool flag = false;
if (c1.image >= 0 && c2.image >=0)
printf("(%.1lf+%.1lfi) %c (%.1lf+%.1lfi) = ", c1.real, c1.image, c, c2.real, c2.image);
else if (c1.image >= 0 && c2.image < 0)
printf("(%.1lf+%.1lfi) %c (%.1lf%.1lfi) = ", c1.real, c1.image, c, c2.real, c2.image);
else if (c1.image < 0 && c2.image >= 0)
printf("(%.1lf%.1lfi) %c (%.1lf+%.1lfi) = ", c1.real, c1.image, c, c2.real, c2.image);
else
printf("(%.1lf%.1lfi) %c (%.1lf%.1lfi) = ", c1.real, c1.image, c, c2.real, c2.image);
if (fabs(a) < 0.1 && fabs(b) < 0.1) {
cout << "0.0\\n";
return ;
}
if (fabs(a) >= 0.1) {
printf("%.1lf", a);
flag = true;
}
if (fabs(b) >= 0.1) {
if(flag && b > 0.0) printf("+%.1lfi", b);
else printf("%.1lfi", b);
}
cout << endl;
}
void add(num a, num b) {
double really = a.real + b.real;
double imagen = a.image + b.image;
print(really, imagen, '+');
}
void minu(num a, num b) {
double really = a.real - b.real;
double imagen = a.image - b.image;
print(really, imagen, '-');
}
void multi(num a, num b) {
double really = - a.image * b.image + a.real * b.real;
double imagen = a.image * b.real + a.real * b.image;
print(really, imagen, '*');
}
void divide(num a, num b) {
double di = b.real * b.real + b.image * b.image;
double really = (a.image * b.image + a.real * b.real) / di;
double imagen = (a.image * b.real - a.real * b.image) / di;
print(really, imagen, '/');
}
int main() {
cin >> c1.real >> c1.image >> c2.real >> c2.image;以上是关于C++初学必练基础题第四期的主要内容,如果未能解决你的问题,请参考以下文章