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++初学必练基础题第三期的主要内容,如果未能解决你的问题,请参考以下文章