前言

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;}// 得到最开始没有空格的s1s1 = 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; // 分子初始值0int 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;}// 平均数 其实就是分母乘以nb0 *= 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;add(c1, c2);minu(c1, c2);multi(c1, c2);divide(c1, c2);return 0;
}

7-37 整数分解为若干项之和 (20 分)

题目

将一个正整数N分解成几个正整数相加,可以有多种分解方法,例如7=6+1,7=5+2,7=5+1+1,…。编程求出正整数N的所有整数分解式子。

输入格式:

每个输入包含一个测试用例,即正整数N (0<N≤30)。

输出格式:

按递增顺序输出N的所有整数分解式子。递增顺序是指:对于两个分解序列N1={n1,n2,⋯}和N2={m1,m2,⋯},若存在i使得n1=m1,⋯,ni=mi,但是ni+1<mi+1,则N1序列必定在N2序列之前输出。每个式子由小到大相加,式子间用分号隔开,且每输出4个式子后换行。

输入样例:

7

输出样例:

7=1+1+1+1+1+1+1;7=1+1+1+1+1+2;7=1+1+1+1+3;7=1+1+1+2+2
7=1+1+1+4;7=1+1+2+3;7=1+1+5;7=1+2+2+2
7=1+2+4;7=1+3+3;7=1+6;7=2+2+3
7=2+5;7=3+4;7=7

解答

#include <iostream>
using namespace std;
int a[50] = {0};
int n, sum = 1;
bool flag = true;
void dfs(int num, int step) {if(num == n) {if(sum % 4 != 1) cout << ";";cout << num << "=" << a[1];for(int i = 2; i < step; i++) cout << "+" << a[i];if(sum % 4 == 0) cout << endl;sum++;}if(num > n) return ;for(int i = 1; i <= n; i++) {a[step] = i;if(a[step] >= a[step - 1]) dfs(num + i, step + 1);}
}
int main() {cin >> n;dfs(0, 1);return 0;
}

7-38 数列求和-加强版 (20 分)

题目

给定某数字A(1≤A≤9)以及非负整数N(0≤N≤100000),求数列之和S=A+AA+AAA+⋯+AA⋯A(N个A)。例如A=1, N=3时,S=1+11+111=123。

输入格式:

输入数字A与非负整数N。

输出格式:

输出其N项数列之和S的值。

输入样例:

1 3

输出样例:

123

解答

第四个测试点超时

#include <iostream>
#include <string>using namespace std;
string addStr(string a, string b)
{int p = a.length() - 1;int q = b.length() - 1;int flag = 0;string ans = "";while (p >= 0 && q >= 0){ans = ans + to_string(((a[p] - '0') + (b[q] - '0') + flag) % 10);flag = (a[p] - '0' + b[q] - '0' + flag) / 10;--p;--q;}while (p >= 0){ans += to_string(a[p] - '0' + flag);flag = 0;--p;}while (q >= 0){ans += to_string(b[q] - '0' + flag);flag = 0;--q;}if (flag == 1){ans += "1";}// 在这里使用reverse会报错 但在main函数、vscode中则不会// 解决办法:添加#include<bits/stdc++.h>// reverse(ans.begin(), ans.end());string rans = "";for (int i = ans.length() - 1; i >= 0; --i){rans += ans[i];}return rans;
}
int main()
{string a;int n;cin >> a >> n;string ans = "0";string num = "";while (n){num += a;ans = addStr(ans, num);--n;}cout << ans << endl;return 0;
}


改进:

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main()
{int a;int n;int flag = 0;// 进位string ans = "";// 最后结果cin >> a >> n;while (n){// 比如 输入是2 3// 222//  22//   2//--------// 个位其实就是3个2相加 十位就是2个2相加 百位就是1个2相加// 同时在注意下进位就好了 这里进位最大可不一定是1哈 比如20个3相加 进位是6了long long x = n * a + flag;if (x >= 10){flag = x / 10;x %= 10;}else{flag = 0;}ans += x + '0';--n;}// 如果得到最后的进位大于0 说明还得添加一位// 比如 99+11 // 算到最后是 01  而最后进位还有个1 所以需要手动添加进位 为 011  if (flag > 0){ans += to_string(flag);}// 反转字符串 011 -> 110reverse(ans.begin(), ans.end());if (ans.size() == 0){cout << "0" << endl;}else{cout << ans << endl;}return 0;
}

结语

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

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

我是 海轰ଘ(੭ˊᵕˋ)੭

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

谢谢支持❤️

C++初学必练基础题【第四期】相关推荐

  1. C++初学必练基础题【第二期】

    前言 Hello!小伙伴! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出-   自我介绍 ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计 ...

  2. 小白学习Java必练基础题(一)

    1.请实现两个整数变量的交换 ​ int a = 1; ​ int b = 2; //经过交换之后,这里需要大家实现交换的代码 ​ System.out.println(a);//2 ​ System ...

  3. C++初学者必练基础编程题【第一期】

    前言 Hello!小伙伴! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出-   自我介绍 ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计 ...

  4. Hive sql语句必练50题

    1016 HQL36-50题 36.查询任何一门课程成绩在70分以上的姓名.课程名称和分数: select st.s_name,c.c_name,s_score from student st joi ...

  5. Java必会基础题,量不多,但每天进步一点也是好的

    1 指出下列程序运行的结果: public class Example{String str=new String("tarena");char[]ch={'a','b','c'} ...

  6. Java基础题(四)

    1.编写测试类,创建英雄对象.怪物对象和武器对象,并输出各自的信息.其中设定分别如下. 1.英雄类. 属性:英雄名字,生命值 方法:输出基本信息 2.怪物类: 属性:怪物名字,生命值,类型 方法:输出 ...

  7. 【Java牛客刷题第四期】——想让自己算法大幅度提升,这一期你一定不要错过

  8. 要用计算机才能算的题,计算机基础题精选,要考90分以上的同学进考场前必看 -电脑资料...

    一.单选题练习 3.用一个字节最多能编出( D )不同的码, A. 8个                B. 16个          C. 128个           D. 256个 7.RAM代 ...

  9. 由浅入深学java iso_由浅入深学Java:基础、进阶与必做260题 PDF扫描版[47MB]

    由浅入深学Java:基础.进阶与必做260题讲解了Java方方面面的知识,全书共分为4篇共28章,第1篇从最基本的JDK安装讲起,包括基本语法与数据类型.数组.字符串.程序控制语句.面向对象编程.继承 ...

  10. 由浅入深学java pdf_由浅入深学Java:基础、进阶与必做260题 PDF_IT教程网

    资源名称:由浅入深学Java:基础.进阶与必做260题 PDF 第1篇  语言基础篇 第1章  Java入门(教学视频:18分钟) 1.1  Java简介 1.2  Java的特点 1.3  JDK的 ...

最新文章

  1. 远程办公在美国有多受欢迎?有人宁愿降薪 50% 也不愿再回办公室
  2. websocket采用tomcat方式,IOC类对象无法注入的解决方案
  3. Linux 查看交换区内容,Unix: Unix/Linux/Win的虚拟交换区信息的查看
  4. Leetcode 392. 判断子序列 (每日一题 20210929)
  5. Java中最早期的集合Vector
  6. zblog php 侧边栏样式,ZBlogPHP免费主题Blogs如何修改侧边栏搜索框样式?
  7. 安卓actionbar上的搜索按钮点击没反应如何解决
  8. socket编程(五)
  9. 员工转正申请书_网站建设人员的转正的申请书
  10. Problem C: 哈夫曼树
  11. Pandas高级教程之:时间处理
  12. [声纹识别]语音识别的发展史
  13. Unity官方文档(英文)
  14. 宝塔面板批量封IP---node.js增量式封锁脚本(每日自动封代理池IP)
  15. 手机连接笔记本开启的WiFi一直显示正在获取IP中
  16. 怎么检查新买的mac是不是原封正品
  17. DHT11温湿度传感器(基于树莓派)
  18. 魅族m15简单开启Usb调试模式的步骤
  19. 实战 | 如何利用 Scrapy 编写一个完整的爬虫!
  20. KMP算法图文详解(为什么是next[0]=-1、next[j]=k和k=next[k])

热门文章

  1. 科技爱好者周刊(第 179 期):AR 技术的打开方式
  2. moodle环境安装linux,Linux下安装Moodle
  3. chartControl控件常用属性总结
  4. vc2010以及VS2019安装使用教程
  5. Service Unavailable出现原因及解决方法
  6. fedora 主题美化
  7. 闪迪内存卡软件测试,闪迪存储卡怎么样
  8. 测试TF card 的读写速度
  9. 分享24个JS特效广告和66个JS特效在线客服J代码JS代码
  10. VMware Cloud Director 10.3 发布(下载) - 云计算调配和管理平台