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

Posted 海轰Pro

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

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

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

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

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

#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<

以上是关于C++初学必练基础题第三期的主要内容,如果未能解决你的问题,请参考以下文章

C++初学必练基础题第二期

C++初学者必练基础编程题第一期

Leetcode刷题第三期Week1——模拟

C++基础讲解第三期(超详细)每天更新哈,大家一起加油

夯实基础,前端大厂面试题必练 - 总结篇

题解5道c++面试题第一期(含解题思路答案解析和实现代码)