C++初学必练基础题第二期
Posted 海轰Pro
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++初学必练基础题第二期相关的知识,希望对你有一定的参考价值。
前言
Hello!小伙伴!
非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~
自我介绍 ଘ(੭ˊᵕˋ)੭
昵称:海轰
标签:程序猿|C++选手|学生
简介:因C语言结识编程,随后转入计算机专业,有幸拿过国奖、省奖等,已保研。目前正在学习C++/Linux(真的真的太难了~)
学习经验:扎实基础 + 多做笔记 + 多敲代码 + 多思考 + 学好英语!
7-11 分段计算居民水费 (10 分)
题目
为鼓励居民节约用水,自来水公司采取按用水量阶梯式计价的办法,居民应交水费_y_(元)与月用水量_x_(吨)相关:当_x_不超过15吨时,y=4_x_/3;超过后,y=2.5_x_−17.5。请编写程序实现水费的计算。
输入格式:
输入在一行中给出非负实数x。
输出格式:
在一行输出应交的水费,精确到小数点后2位。
输入样例1:
12
输出样例1:
16.00
输入样例2:
16
输出样例2:
22.50
解答
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int x;
double y;
cin >> x;
if (x <= 15)
{
y = 4 * x / 3.0;
}
else
{
y = 2.5 * x - 17.5;
}
cout << fixed << setprecision(2) << y << endl;
return 0;
}
7-12 两个数的简单计算器 (10 分)
题目
本题要求编写一个简单计算器程序,可根据输入的运算符,对2个整数进行加、减、乘、除或求余运算。题目保证输入和输出均不超过整型范围。
输入格式:
输入在一行中依次输入操作数1、运算符、操作数2,其间以1个空格分隔。操作数的数据类型为整型,且保证除法和求余的分母非零。
输出格式:
当运算符为+、-、*、/、%时,在一行输出相应的运算结果。若输入是非法符号(即除了加、减、乘、除和求余五种运算符以外的其他符号)则输出ERROR。
输入样例1:
-7 / 2
输出样例1:
-3
输入样例2:
3 & 6
输出样例2:
ERROR
解答
#include <iostream>
using namespace std;
int main()
{
int a, b;
char c;
cin >> a >> c >> b;
switch (c)
{
case '+':
cout << a + b << endl;
break;
case '-':
cout << a - b << endl;
break;
case '*':
cout << a * b << endl;
break;
case '/':
cout << a / b << endl;
break;
case '%':
cout << a % b << endl;
break;
default:
cout<<"ERROR"<<endl;
break;
}
return 0;
}
7-13 日K蜡烛图 (15 分)
题目
股票价格涨跌趋势,常用蜡烛图技术中的K线图来表示,分为按日的日K线、按周的周K线、按月的月K线等。以日K线为例,每天股票价格从开盘到收盘走完一天,对应一根蜡烛小图,要表示四个价格:开盘价格Open(早上刚刚开始开盘买卖成交的第1笔价格)、收盘价格Close(下午收盘时最后一笔成交的价格)、中间的最高价High和最低价Low。
如果Close<Open,表示为“BW-Solid”(即“实心蓝白蜡烛”);如果Close>Open,表示为“R-Hollow”(即“空心红蜡烛”);如果Open等于Close,则为“R-Cross”(即“十字红蜡烛”)。如果Low比Open和Close低,称为“Lower Shadow”(即“有下影线”),如果High比Open和Close高,称为“Upper Shadow”(即“有上影线”)。请编程序,根据给定的四个价格组合,判断当日的蜡烛是一根什么样的蜡烛。
输入格式:
输入在一行中给出4个正实数,分别对应Open、High、Low、Close,其间以空格分隔。
输出格式:
在一行中输出日K蜡烛的类型。如果有上、下影线,则在类型后加上with 影线类型。如果两种影线都有,则输出with Lower Shadow and Upper Shadow。
输入样例1:
5.110 5.250 5.100 5.105
输出样例1:
BW-Solid with Lower Shadow and Upper Shadow
输入样例2:
5.110 5.110 5.110 5.110
输出样例2:
R-Cross
输入样例3:
5.110 5.125 5.112 5.126
输出样例3:
R-Hollow
解答
#include <iostream>
using namespace std;
int main()
{
double open;
double high;
double low;
double close;
cin >> open >> high >> low >> close;
string str = "";
if (close < open)
{
str += "BW-Solid";
}
else if (close == open)
{
str += "R-Cross";
}
else
{
str += "R-Hollow";
}
string str2 = "";
if (high > open && high > close && low < open && low < close)
{
str2 += " with Lower Shadow and Upper Shadow";
}else{
if (high > open && high > close)
{
str2 += " with Upper Shadow";
}
if (low < open && low < close)
{
str2 += " with Lower Shadow";
}
}
cout << str << str2 << endl;
return 0;
}
7-14 求整数段和 (15 分)
题目
给定两个整数_A_和_B_,输出从_A_到_B_的所有整数以及这些数的和。
输入格式:
输入在一行中给出2个整数A和B,其中−100≤A≤B≤100,其间以空格分隔。
输出格式:
首先顺序输出从A到B的所有整数,每5个数字占一行,每个数字占5个字符宽度,向右对齐。最后在一行中按Sum = X的格式输出全部数字的和X。
输入样例:
-3 8
输出样例:
-3 -2 -1 0 1
2 3 4 5 6
7 8
Sum = 30
解答
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int a, b;
cin >> a >> b;
int i, sum = 0, k = 0;
for (i = a; i <= b; i++)
{
k++;
if (k < 5)
{
cout << setiosflags(ios::right) << setw(5) << i;
}
if (k == 5)
{
cout << setiosflags(ios::right) << setw(5) << i << endl;
k = 0;
}
sum = sum + i;
}
if (k != 0)
cout << endl;
cout << "Sum = " << sum << endl;
return 0;
}
7-15 计算圆周率 (15 分)
题目
根据下面关系式,求圆周率的值,直到最后一项的值小于给定阈值。
2/π=1+31+3×52!+3×5×73!+⋯+3×5×7×⋯×(2n+1)n!+⋯
输入格式:
输入在一行中给出小于1的阈值。
输出格式:
在一行中输出满足阈值条件的近似圆周率,输出到小数点后6位。
输入样例:
0.01
输出样例:
3.132157
解答
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double value;
cin >> value;
double sum = 1;
int n = 0;
long a = 1;
double b = 1;
double last = a / b;
while (last >= value)
{
++n;
a *= n;
b *= (2 * n + 1);
last = a / b;
sum += last;
}
cout << fixed << setprecision(6) << sum*2 << endl;
return 0;
}
7-16 求符合给定条件的整数集 (15 分)
题目
给定不超过6的正整数A,考虑从A开始的连续4个数字。请输出所有由它们组成的无重复数字的3位数。
输入格式:
输入在一行中给出A。
输出格式:
输出满足条件的的3位数,要求从小到大,每行6个整数。整数间以空格分隔,但行末不能有多余空格。
输入样例:
2
输出样例:
234 235 243 245 253 254
324 325 342 345 352 354
423 425 432 435 452 453
523 524 532 534 542 543
解答
暴力枚举
#include <iostream>
using namespace std;
int main()
{
int A;
cin >> A;
int count = 0;
for (int i = A; i <= A + 3; ++i)
{
for (int j = A; j <= A + 3; ++j)
{
for (int k = A; k <= A + 3; ++k)
{
if (i != j && i != k && j != k)
{
cout << i * 100 + j * 10 + k;
++count;
if (count % 6 == 0)
{
cout << endl;
count = 0;
}
else
{
cout << " ";
}
}
}
}
}
return 0;
}
回溯
#include <iostream>
#include <vector>
using namespace std;
vector<int> temp;
void backtracking(vector<vector<int> > &res, vector<bool> &isused, vector<int> &nums)
{
// 当temp数组的长度等于期望数组的长度时 return
if (temp.size() == 3)
{
res.push_back(temp);
return;
}
// 遍历所有选择
for (int i = 0; i < nums.size(); ++i)
{
// 对没有选择过的元素再进行抉择:选择它|不选择它
if (isused[i])
{
// 选择该元素 选择后标记该元素为已选择 同时进行下一元素的抉择
temp.push_back(nums[i]);
isused[i] = false;
backtracking(res, isused, nums);
// 回复原来状态:未选择 同时从temp中pop出
isused[i] = true;
temp.pop_back();
}
}
}
vector<vector<int> > permute(vector<int> &nums)
{
vector<vector<int> > res;
vector<bool> isused(nums.size(), true);
backtracking(res, isused, nums);
return res;
}
int main()
{
vector<vector<int> > ans;
vector<int> nums;
int N;
cin >> N;
for (int i = N; i <= N + 3; ++i)
{
nums.push_back(i);
}
ans = permute(nums);
int count = 0;
for (int i = 0; i < ans.size(); ++i)
{
for (int j = 0; j < ans[0].size(); ++j)
{
cout << ans[i][j];
}
++count;
if (count % 6 == 0)
{
cout << endl;
count = 0;
}
else
{
cout << " ";
}
}
return 0;
}
7-17 爬动的蠕虫 (15 分)
题目
一条蠕虫长1寸,在一口深为N寸的井的底部。已知蠕虫每1分钟可以向上爬U寸,但必须休息1分钟才能接着往上爬。在休息的过程中,蠕虫又下滑了D寸。就这样,上爬和下滑重复进行。请问,蠕虫需要多长时间才能爬出井?
这里要求不足1分钟按1分钟计,并且假定只要在某次上爬过程中蠕虫的头部到达了井的顶部,那么蠕虫就完成任务了。初始时,蠕虫是趴在井底的(即高度为0)。
输入格式:
输入在一行中顺序给出3个正整数N、U、D,其中D<U,N不超过100。
输出格式:
在一行中输出蠕虫爬出井的时间,以分钟为单位。
输入样例:
12 3 1
输出样例:
11
解答
#include <iostream>
using namespace std;
int main()
{
int N;
int U;
int D;
cin >> N >> U >> D;
int minutes = 0;
while (N)
{
++minutes;
N -= U;
if (N <= 0)
{
cout << minutes << endl;
break;
}
++minutes;
N += D;
}
return 0;
}
7-18 二分法求多项式单根 (20 分)
题目
二分法求函数根的原理为:如果连续函数_f_(x)在区间[a,b]的两个端点取值异号,即_f_(a)f(b)<0,则它在这个区间内至少存在1个根_r_,即_f_(r)=0。
二分法的步骤为:
- 检查区间长度,如果小于给定阈值,则停止,输出区间中点(a+b)/2;否则
- 如果_f_(a)f(b)<0,则计算中点的值_f_((a+b)/2);
- 如果_f_((a+b)/2)正好为0,则(a+b)/2就是要求的根;否则
- 如果_f_((a+b)/2)与_f_(a)同号,则说明根在区间[(a+b)/2,b],令_a_=(a+b)/2,重复循环;
- 如果_f_((a+b)/2)与_f_(b)同号,则说明根在区间[a,(a+b)/2],令_b_=(a+b)/2,重复循环。
本题目要求编写程序,计算给定3阶多项式f(x)=a3x3+a2x2+a1x+a0在给定区间[a,b]内的根。
输入格式:
输入在第1行中顺序给出多项式的4个系数a3、a2、a1、a0,在第2行中顺序给出区间端点a和b。题目保证多项式在给定区间内存在唯一单根。
输出格式:
在一行中输出该多项式在该区间内的根,精确到小数点后2位。
输入样例:
3 -1 -3 1
-0.5 0.5
输出样例:
0.33
解答
#include <iostream>
#include <math.h>
#include <iomanip>
using namespace std;
double f(double num, double a3, double a2, double a1, double a0)
{
return a3 * pow(num, 3) + a2 * pow(num, 2) + a1 * num + a0;
}
int main()
{
double a3, a2, a1, a0;
double a, b;
cin >> a3 >> a2 >> a1 >> a0;
cin >> a >> b;
while (1)
{
double mid = a + (b - a) / 2.0;
if (f(mid, a3, a2, a1, a0) == 0 || b - a < 0.000001)
{
cout << fixed << setprecision(2) << mid << endl;
break;
}
else if (f(mid, a3, a2, a1, a0) * f(a, a3, a2, a1, a0) > 0)
{
// a mid 同号
// 在mid-b间
a = mid;
}
else if (f(mid, a3, a2, a1, a0) * f(b, a3, a2, a1, a0) > 0)
{
// mid b 同号
// 在 a-mid间
b = mid;
}
else
{
// 不需要再处理了
// 题目保证初始ab区间一定有解的
}
}
return 0;
}
7-19 支票面额 (15 分)
题目
一个采购员去银行兑换一张_y_元_f_分的支票,结果出纳员错给了_f_元_y_分。采购员用去了_n_分之后才发觉有错,于是清点了余额尚有2_y_元2_f_分,问该支票面额是多少?
输入格式:
输入在一行中给出小于100的正整数n。
输出格式:
在一行中按格式y.f输出该支票的原始面额。如果无解,则输出No Solution。
输入样例1:
23
输出样例1:
25.51
输入样例2:
22
输出样例2:
No Solution
解答
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int flag = 1;
for (int i = 0; i < 100 && flag == 1; ++i)
{
for (int j = 0; j < 100; ++j)
{
if (98 * i - 199 * j == n)
{
cout << j << "." << i << endl;
flag = 0;
break;
}
}
}
if (flag == 1)
{
cout << "No Solution" << endl;
}
return 0;
}
7-20 打印九九口诀表 (15 分)
题目
下面是一个完整的下三角九九口诀表:
11=1
12=2 22=4
13=3 23=6 33=9
14=4 24=8 34=12 44=16
15=5 25=10 35=15 45=20 55=25 1
6=6 26=12 36=18 46=24 56=30 66=36
17=7 27=14 37=21 47=28 57=35 67=42 77=49
18=8 28=16 38=24 48=32 58=40 68=48 78=56 88=64
19=9 29=18 39=27 49=36 59=45 69=54 79=63 89=72 9*9=81
本题要求对任意给定的一位正整数N,输出从11到NN的部分口诀表。
输入格式:
输入在一行中给出一个正整数N(1≤N≤9)。
输出格式:
输出下三角N*N部分口诀表,其中等号右边数字占4位、左对齐。
输入样例:
4
输出样例:
11=1
12=2 22=4
13=3 23=6 33=9
14=4 24=8 34=12 44=16
解答
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; ++i)
{
for (int j = 以上是关于C++初学必练基础题第二期的主要内容,如果未能解决你的问题,请参考以下文章
周刷题第二期总结(Longest Substring Without Repeating Characters and Median of Two Sorted Arrays)