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

举报
海轰Pro 发表于 2021/09/11 00:59:26 2021/09/11
【摘要】 前言 Hello!小伙伴! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~   自我介绍 ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因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

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;
}

  
 
  • 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

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;
}

  
 
  • 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

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;
}

  
 
  • 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

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;
}

  
 
  • 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

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;
}

  
 
  • 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

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;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

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;
}

  
 
  • 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

image.png

结语

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

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

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

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

谢谢支持❤️
在这里插入图片描述

文章来源: haihong.blog.csdn.net,作者:海轰Pro,版权归原作者所有,如需转载,请联系作者。

原文链接:haihong.blog.csdn.net/article/details/120217797

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。