C++初学者必练基础编程题第一期
Posted 海轰Pro
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++初学者必练基础编程题第一期相关的知识,希望对你有一定的参考价值。
前言
Hello!小伙伴!
非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~
自我介绍 ଘ(੭ˊᵕˋ)੭
昵称:海轰
标签:程序猿|C++选手|学生
简介:因C语言结识编程,随后转入计算机专业,有幸拿过国奖、省奖等,已保研。目前正在学习C++/Linux(真的真的太难了~)
学习经验:扎实基础 + 多做笔记 + 多敲代码 + 多思考 + 学好英语!
7-1 厘米换算英尺英寸 (15 分)
题目
如果已知英制长度的英尺foot和英寸inch的值,那么对应的米是(foot+inch/12)×0.3048。现在,如果用户输入的是厘米数,那么对应英制长度的英尺和英寸是多少呢?别忘了1英尺等于12英寸。
输入格式:
输入在一行中给出1个正整数,单位是厘米。
输出格式:
在一行中输出这个厘米数对应英制长度的英尺和英寸的整数值,中间用空格分开。
输入样例:
170
输出样例:
5 6
解答
难点不在编程上,在于题目的理解!
(foot+inch/12)×0.3048
这个公式的意思是:
因为 一英尺=12英寸
inch/12 的意思是 转化为英尺
比如6英寸 需要先转换为英寸 6/12=0.5英尺
然后 通过乘以0.3048得到单位米
简单的理解:
英尺与米的关系是:
foot*0.3088=m
如果有inch存在 先转换为foot就好了
(如果之间给出这个公式就不会混淆了)
举例说明:
如果现在一个东西的长度是5英尺+6英寸
首先转化为英尺
6inch=6/12foot=0.5foot
一共是:5+0.5 foot = 5.5foot
转换为米:5.5*0.3048约等于1.67
转换为cm:差不多就是170(根据题目就是这样 没办法)
#include <iostream>
using namespace std;
int main()
{
// 输入数 单位cm
double cm;
// foot:英尺 inch:英寸
int foot, inch;
cin >> cm;
// 转行为m
cm /= 100.0;
// 计算总英寸数
inch = cm / 0.3048 * 12;
// 求英尺数
foot = inch / 12;
// 求英寸数
inch = inch - foot * 12;
cout << foot << " " << inch << endl;
return 0;
}
7-2 然后是几点 (15 分)
题目
有时候人们用四位数字表示一个时间,比如 1106 表示 11 点零 6 分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。
读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,例如 5 点 30 分表示为 530;0 点 30 分表示为 030。注意,第二个数字表示的分钟数可能超过 60,也可能是负数。
输入格式:
输入在一行中给出 2 个整数,分别是四位数字表示的起始时间、以及流逝的分钟数,其间以空格分隔。注意:在起始时间中,当小时为个位数时,没有前导的零,即 5 点 30 分表示为 530;0 点 30 分表示为 030。流逝的分钟数可能超过 60,也可能是负数。
输出格式:
输出四位数字表示的终止时间,当小时为个位数时,没有前导的零。题目保证起始时间和终止时间在同一天内。
输入样例:
1120 110
输出样例:
1310
解答
方法:
- 提取小时、分钟数,通过除法、余数就可以
- 转换为分钟后与流逝时间进行运算
- 再转换为4位数 小时*100+分钟数即可
特别注意:
030这种状况
比如输入030 0
不做特殊处理的话
输出结果是30(没有前导0)
所以最后加个判断即可
#include <iostream>
using namespace std;
int main()
{
// 起始时间
int start;
// 流逝时间
int expend;
cin >> start >> expend;
// 起始时间的小时数
int hour;
// 起始时间的分钟数
int minute;
// 转换 小时取前两位 分钟取后两位
hour = start / 100;
minute = start % 100;
// 转换为分钟数
int minutes = hour * 60 + minute;
// 与流逝时间运算
minutes += expend;
int ans = 0;
// 计算之后的时间 小时*100+分钟
ans = minutes / 60 * 100 + minutes % 60;
// 特殊判断
// 030这种 0时还是需要输出0的!
if (ans / 100)
{
cout << ans << endl;
}
else
{
cout << "0" << ans << endl;
}
return 0;
}
7-3 逆序的三位数 (10 分)
题目
程序每次读入一个正3位数,然后输出按位逆序的数字。注意:当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入700,输出应该是7。
输入格式:
每个测试是一个3位的正整数。
输出格式:
输出按位逆序的数。
输入样例:
123
输出样例:
321
解答
#include <iostream>
using namespace std;
int main()
{
int num;
int ans = 0;
cin >> num;
while (num)
{
ans = ans * 10 + num % 10;
num /= 10;
}
cout << ans << endl;
return 0;
}
7-4 BCD解密 (10 分)
题目
BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位。所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12。但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制的18了!
现在,你的程序要读入这个错误的十进制数,然后输出正确的十进制数。提示:你可以把18转换回0x12,然后再转换回12。
输入格式:
输入在一行中给出一个[0, 153]范围内的正整数,保证能转换回有效的BCD数,也就是说这个整数转换成十六进制时不会出现A-F的数字。
输出格式:
输出对应的十进制数。
输入样例:
18
输出样例:
12
解答
简单的理解就是将一个十六进制转换为10进制
注意题目:一个[0, 153]范围内的正整数 对应十进制其实就只有2位数
#include <iostream>
using namespace std;
int main()
{
int num;
cin >> num;
int ans;
ans = num / 16 * 10 + num % 16;
cout << ans << endl;
return 0;
}
7-5 表格输出 (5 分)
题目
本题要求编写程序,按照规定格式输出表格。
输入格式:
本题目没有输入。
输出格式:
要求严格按照给出的格式输出下列表格:
解答
#include <iostream>
using namespace std;
int main()
{
cout<<"------------------------------------"<<endl;
cout<<"Province Area(km2) Pop.(10K)"<<endl;
cout<<"------------------------------------"<<endl;
cout<<"Anhui 139600.00 6461.00"<<endl;
cout<<"Beijing 16410.54 1180.70"<<endl;
cout<<"Chongqing 82400.00 3144.23"<<endl;
cout<<"Shanghai 6340.50 1360.26"<<endl;
cout<<"Zhejiang 101800.00 4894.00"<<endl;
cout<<"------------------------------------"<<endl;
return 0;
}
7-6 混合类型数据格式化输入 (5 分)
题目
本题要求编写程序,顺序读入浮点数1、整数、字符、浮点数2,再按照字符、整数、浮点数1、浮点数2的顺序输出。
输入格式:
输入在一行中顺序给出浮点数1、整数、字符、浮点数2,其间以1个空格分隔。
输出格式:
在一行中按照字符、整数、浮点数1、浮点数2的顺序输出,其中浮点数保留小数点后2位。
输入样例:
2.12 88 c 4.7
输出样例:
c 88 2.12 4.70
解答
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double num1;
int num2;
char num3;
double num4;
cin >> num1 >> num2 >> num3 >> num4;
cout << num3 << " " << num2 << " ";
cout << fixed << setprecision(2) << num1 << " ";
cout << fixed << setprecision(2) << num4 << endl;
return 0;
}
7-7 12-24小时制 (15 分)
题目
编写一个程序,要求用户输入24小时制的时间,然后显示12小时制的时间。
输入格式:
输入在一行中给出带有中间的:符号(半角的冒号)的24小时制的时间,如12:34表示12点34分。当小时或分钟数小于10时,均没有前导的零,如5:6表示5点零6分。
提示:在scanf的格式字符串中加入:,让scanf来处理这个冒号。
输出格式:
在一行中输出这个时间对应的12小时制的时间,数字部分格式与输入的相同,然后跟上空格,再跟上表示上午的字符串AM或表示下午的字符串PM。如5:6 PM表示下午5点零6分。注意,在英文的习惯中,中午12点被认为是下午,所以24小时制的12:00就是12小时制的12:0 PM;而0点被认为是第二天的时间,所以是0:0 AM。
输入样例:
21:11
输出样例:
9:11 PM
解答
#include <iostream>
using namespace std;
int main()
{
int hour;
int minute;
char c;
cin >> hour >> c >> minute;
string s = " AM";
if (hour > 11)
{
s = " PM";
}
if (hour > 12)
{
hour %= 12;
}
cout << hour << ":" << minute << s;
return 0;
}
7-8 超速判断 (10 分)
题目
模拟交通警察的雷达测速仪。输入汽车速度,如果速度超出60 mph,则显示“Speeding”,否则显示“OK”。
输入格式:
输入在一行中给出1个不超过500的非负整数,即雷达测到的车速。
输出格式:
在一行中输出测速仪显示结果,格式为:Speed: V - S,其中V是车速,S或者是Speeding、或者是OK。
输入样例1:
40
输出样例1:
Speed: 40 - OK
输入样例2:
75
输出样例2:
Speed: 75 - Speeding
解答
#include <iostream>
using namespace std;
int main()
{
int speed;
cin >> speed;
if (speed > 60)
{
cout << "Speed: " << speed << " - Speeding" << endl;
}
else
{
cout << "Speed: " << speed << " - OK" << endl;
}
return 0;
}
7-9 用天平找小球 (10 分)
题目
三个球A、B、C,大小形状相同且其中有一个球与其他球重量不同。要求找出这个不一样的球。
输入格式:
输入在一行中给出3个正整数,顺序对应球A、B、C的重量。
输出格式:
在一行中输出唯一的那个不一样的球。
输入样例:
1 1 2
输出样例:
C
解答
核心:异或运算
异或记住相同两个数亦或为0
因为只有三个数a b c
加上其中两个相同
比如a=1 b=2 c=1
那么 abc=121=2^0=2
0异或任何数等于这个数
#include <iostream>
using namespace std;
int main()
{
int a, b, c;
cin >> a >> b >> c;
int ans = a ^ b ^ c;
if (ans == a)
{
cout << "A" << endl;
}
else if (ans == b)
{
cout << "B" << endl;
}
else
{
cout << "C" << endl;
}
return 0;
}
7-10 计算工资 (15 分)
题目
某公司员工的工资计算方法如下:一周内工作时间不超过40小时,按正常工作时间计酬;超出40小时的工作时间部分,按正常工作时间报酬的1.5倍计酬。员工按进公司时间分为新职工和老职工,进公司不少于5年的员工为老职工,5年以下的为新职工。新职工的正常工资为30元/小时,老职工的正常工资为50元/小时。请按该计酬方式计算员工的工资。
输入格式:
输入在一行中给出2个正整数,分别为某员工入职年数和周工作时间,其间以空格分隔。
输出格式:
在一行输出该员工的周薪,精确到小数点后2位。
输入样例1:
5 40
输出样例1:
2000.00
输入样例2:
3 50
输出样例2:
1650.00
解答
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int years;
int hours;
cin >> years >> hours;
int wage;
if (years >= 5)
{
wage = 50;
}
else
{
wage = 30;
}
double wages;
if (hours <= 40)
{
wages = hours * wage;
}
else
{
wages = 40 * wage + (hours - 40) * wage * 1.5;
}
cout << fixed << setprecision(2) << wages << endl;
return 0;
}
结语
文章仅作为学习笔记,记录从0到1的一个过程
希望对您有所帮助,如有错误欢迎小伙伴指正~
我是 海轰ଘ(੭ˊᵕˋ)੭
如果您觉得写得可以的话,请点个赞吧
谢谢支持❤️
以上是关于C++初学者必练基础编程题第一期的主要内容,如果未能解决你的问题,请参考以下文章