C++蓝桥杯基础篇(十)

发布于:2025-03-10 ⋅ 阅读:(14) ⋅ 点赞:(0)
片头

嗨!小伙伴们,大家好~今天我们来学习蓝桥杯基础篇(十),练习相关函数的习题,准备好了吗?咱们开始咯!


第1题  绝对值

本题很简单,让我们模拟abs函数,如果这个数小于0,就在这个数前面添加负号;如果这个数大于0,则输出该数字即可。

代码如下:

//绝对值
//输入一个整数x,请你编写一个函数,int abs(int x),输出x的绝对值,
//输入共一行,包含一个整数x。
//输出共一行,包含x的绝对值。
//数据范围 - 100 < x < 100
//输入样例: -3
//输出样例:  3

int abs1(int x) {
	if (x < 0) return -x;
	return x;
}

int main() {

	int x;
	cin >> x;

	int ret = abs1(x);
	cout << "绝对值为: " << ret << endl;

	return 0;
}

第2题  两个数的和

这道题,求2个数之和,用一个函数实现即可。最后将结果保留2位小数。

代码如下:

//两个数的和
//输入两个浮点数x和y,请你编写一个函数,double add(double x,double y),计算并输出x与y的和。
//输入共一行,包含两个浮点数x和y。
//输出共一行,包含一个浮点数,表示两个数的和,结果保留2位小数。
//数据范围  - 1000 ≤ x, y≤ 1000

double add(double x, double y) {
	return x + y;
}

int main() {
	double x, y;
	cin >> x >> y;

	double ret = add(x, y);
	printf("2个数之和为: %.2lf\n", ret);

	return 0;
}

第3题  区间求和

本题需要求出区间[l,r]内所有整数的和,很简单,代码如下:

//区间求和
//输入两个整数l和r,请你编写一个函数,int sum(intl,intr),计算并输出区间1,内所有整数的和。
//输入格式共一行,包含两个整数 l 和r。
//输出共一行,包含一个整数,表示所求的和。
//数据范围 1≤l≤r < 1000

int sum(int l, int r) {
	int ret = 0;
	for (int i = l; i <= r; i++) {
		ret += i;
	}
	return ret;
}

int main() {
	int l, r;
	cin >> l >> r;

	int ret = sum(l, r);
	cout << "所求的和为: " << ret << endl;

	return 0;
}

第4题  最小公倍数

求最小公倍数,就是找出一个数能同时整除a和b,并且这个数在所有公倍数中是最小值

代码如下:

//最小公倍数
//输入两个整数a和b,请你编写一个函数,int lcm(int a,int b),计算并输出a和b的最小公倍数。
//输入共一行,包含两个整数a和b。
//输出共一行,包含一个整数,表示a和b的最小公倍数。
//数据范围 1 ≤ a, b≤ 1000
//输入样例:
//6  8
//输出样例 :
//24

int lcm(int a, int b) {
	for (int i = 1; i <= a * b; i++) {     //最小公倍数不可能超过2个数相乘
		if (i % a == 0 && i % b == 0) {
			return i;
		}
	}
	return -1; //一定不会执行
}

int main() {
	int a, b;
	cin >> a >> b;

	int ret = lcm(a, b);
	cout << "最小公倍数为: " << ret << endl;

	return 0;
}

第5题  复制数组

 所谓复制数组,就是将a数组里面的数据拷贝到b数组里面。

代码如下:

void copy(int a[], int b[], int size) {
	for (int i = 0; i < size; i++) {
		b[i] = a[i];
	}
}

int main() {
	int a[100];
	int b[100];
	int n, m, size;			//n:a数组的长度
							//m:b数组的长度
							//size:前size个数字
	cin >> n >> m >> size;

	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}

	for (int j = 0; j < m; j++) {
		cin >> b[j];
	}

	copy(a, b, size);
	for (int i = 0; i < m; i++) {
		cout << b[i] << " ";
	}
	cout << endl;

	return 0;
}

使用memcpy函数也可以:

void copy(int a[], int b[], int size) {
	memcpy(b, a, sizeof(int) * size);    //总共拷贝4*size个字节
}

int main() {
	int a[100];
	int* p = a; //使用p指针指向数组a

	int b[100];
	int* q = b; //使用q指针指向数组b

	int n, m, size;			//n:a数组的长度
							//m:b数组的长度
							//size:前size个数字
	cin >> n >> m >> size;

	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}

	for (int j = 0; j < m; j++) {
		cin >> b[j];
	}

	copy(p, q, size);
	for (int i = 0; i < m; i++) {
		cout << b[i] << " ";
	}
	cout << endl;

	return 0;
}

第6题  打印字符串

代码如下:

void print(char str[]) {
	//puts(str);         //2种方法均可
	printf("%s", str);
}

int main() {
	char str[101];
	fgets(str, 101, stdin); //因为可能输入100个有效数字,最后一位给'\0'

	print(str);
	return 0;
}

第7题  数组翻转

这道题,考的是翻转数组。其实就是双指针。定义变量 i 和变量 j,变量 i 指向下标为0的位置,变量 j 指向 size-1 的位置,交换它们之间的值,交换完毕后,i++,j--,当变量 i 和变量 j 错过时,循环结束。

代码如下:

//数组翻转
//给定一个长度为n的数组a和一个整数size,请你编写一个函数,
//void reverse(int a[],int size)
//实现将数组a中的前size个数翻转。
//输出翻转后的数组a。
//输入第一行包含两个整数n和size。
//第二行包含n个整数,表示数组a。
//输出共一行,包含n个整数,表示翻转后的数组a。
//数据范围 1≤ size < n < 1000

const int N = 1000;

void reverse(int a[], int size) {
	for (int i = 0, j = size - 1; i < j; i++, j--) {
		swap(a[i], a[j]);
	}
}


int main() {
	int a[N];

	int n, size;	 //长度为n的数组a
	cin >> n >> size;

	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}

	reverse(a, size);

	for (int i = 0; i < n; i++) {
		cout << a[i] << " ";
	}
	cout << endl;

	return 0;
}

第8题  数组去重

去重之后的数组长度  = 前size个数中的不同数的个数 + 剩余的数(n-size)

数组去重,顾名思义,去掉重复出现的数。

①我们可以定义2个for循环,外层是下标 i 从0~size-1,也就是所有数,内层下标 j 从当前的下标 i 的下一个位置开始,一直到size-1结束,寻找后面的数是否与 a[i] 的值相同。

②定义bool型变量flag,假设每个数都只出现1次,flag初始值为true。当出现与 a[i] 的值相同的情况,flag的值为false。跳出当前循环,不再执行后续代码。

③如果遍历完整个数组,发现没有和 a[i] 的值相同的情况,flag的值仍然为true,那么count++; (count变量表示前size个数中的不同数的个数)

④去重之后的数组总长度 = 前size个数中的不同数的个数(count)+ 剩余的数(n-size)

代码如下:

//数组去重
//给定一个长度为n的数组a,请你编写一个函数:
//int unique(int a[],int size);//返回数组前size个数中的不同数的个数。
//输入第一行包含两个整数n和size,
//第二行包含n个整数,表示数组a。
//输出共一行,包含一个整数表示去重完成之后的数组长度。
//数据范围 1 < size < n < 1000

int unique(int a[], int size) {
	int count = 0;//前size个数中的不同数的个数

	for (int i = 0; i < size; i++) {
		bool flag = true;//假设每个数只出现1次
		for (int j = i + 1; j < size; j++) {
			if (a[j] == a[i]) //如果后面的数和当前的数重复
			{
				flag = false; //表明这个数不止出现1次
				break;		  //不再执行后面的循环
			}
		}
		if (flag) count++;    //如果这个数唯一,那么count++;
	}

	return count;
}

int main() {
	int a[1000];
	int n, size;
	cin >> n >> size;

	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}

	int ret = unique(a, size);
	cout << "去重完成之后的数组长度为: " << ret + (n - size) << endl;

	return 0;
}

第9题  数组排序

 这里考一个排序算法,我们就选择排序吧~

代码如下:

//数组排序
//给定一个长度为n的数组a以及两个整数l和r,请你编写一个函数,
// void sort(int a[],int l,int r),将a[l]~a[r]从小到大排序。
//输出排好序的数组a。
//输入第一行包含三个整数n,l,r。
//第二行包含n个整数,表示数组a。
//输出共一行,包含n个整数,表示排序完成后的数组a。
//数据范围 0≤l≤r < n≤1000

//选择排序
//将a[l]~a[r]从小到大排序
void sort(int a[], int l, int r) {
	for (int i = l; i <= r - 1; i++) {
		for (int j = i + 1; j <= r; j++) {
			if (a[i] > a[j]) swap(a[i], a[j]);
		}
	}
}

int main() {
	int a[1000];

	int n, l, r;       //长度为n的数组a以及两个整数l和r
	cin >> n >> l >> r;

	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}

	sort(a, l, r);

	for (int i = 0; i < n; i++) {
		cout << a[i] << " ";
	}
	cout << endl;

	return 0;
}

第10题  跳台阶

emmm,举个例子呗~

5 = 1 + 1 + 1 + 1 + 1

   = 1 + 1 + 1 + 2

   = 1 + 1 + 2 + 1

   = 1 + 2 + 1 + 1

   = 2 + 1 + 1 + 1

   = 1 + 2 + 2

   =  2 + 1 + 2

   =  2 + 2 + 1

以上情况就是台阶数为“5” ,有8种情况。

代码如下:

//跳台阶
//1个楼梯共有n级台阶,每次可以走一级或者两级,问从第0级台阶走到第n级台阶一共有多少种方案。
//输入共一行,包含一个整数n。
//输出共一行,包含一个整数,表示方案数。
//数据范围 1 < n < 15

int n1;
int ans1;

void Stairs(int k) {
	if (k == n1) ans1++;
	else if (k < n1) {
		Stairs(k + 1);
		Stairs(k + 2);
	}
}

int main() {
	cin >> n1;
	Stairs(0);  //每次k的初始值均为0
	cout << ans1 << endl;

	return 0;
}

第11题  走方格

画个图~

代码如下:

//走方格
//给定一个n*m的方格阵,沿着方格的边线走,从左上角(0,0)开始,
//每次只能往右或者往下走一个单位距离,问走到右下角(n, m)一共有多少种不同的走法。
//输入共一行,包含两个整数n和m。
//输出共一行,包含一个整数,表示走法数量。
//数据范围  1 < n, m < 10

int ans;
int n, m;

void dfs(int x, int y) {
	if (x == n && y == m) ans++;
	else {
		if (y < m) dfs(x, y + 1);
		if (x < n) dfs(x + 1, y);
	}
}

int main() {
	cin >> n >> m;

	dfs(0, 0);
	cout << ans << endl;

	return 0;
}

片尾

今天我们学习了关于函数相关知识,希望看完这篇文章能对友友们有所帮助!!!

点赞收藏加关注!!!

谢谢大家!!!


网站公告

今日签到

点亮在社区的每一天
去签到