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
1
2=2 22=4
1
3=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 3
6=18 46=24 56=30 66=36
1
7=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
1
2=2 22=4
1
3=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++初学必练基础题第二期的主要内容,如果未能解决你的问题,请参考以下文章

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

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

暑假零基础C++编程第二期免费班来啦,快来报名吧~

周刷题第二期总结(Longest Substring Without Repeating Characters and Median of Two Sorted Arrays)

低价好课:《传智播客C++培训第二期》16天基础班百度云高清完整

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