C语言练习题

文章目录

  • [1. 递归实现将字符串str中的元素逆序](#1. 递归实现将字符串str中的元素逆序)
  • [2. 对数组arr进行冒泡排序(升序)](#2. 对数组arr进行冒泡排序(升序))
  • [3. 对数组从下标low到下标hihg区间内的元素进行快速排序(升序)](#3. 对数组从下标low到下标hihg区间内的元素进行快速排序(升序))
  • [4. 在数组中利用二分查找(折半查找)目标关键字](#4. 在数组中利用二分查找(折半查找)目标关键字)
  • [5. 求n的阶乘](#5. 求n的阶乘)
  • [6. 判断year是否为闰年](#6. 判断year是否为闰年)
  • [7. 求两个数的最大公约数(暴力求解)](#7. 求两个数的最大公约数(暴力求解))
  • [8. 求两个数的最大公约数(辗转相除法)](#8. 求两个数的最大公约数(辗转相除法))
  • [9. 统计1~100的所有整数中,出现多少个数字9](#9. 统计1~100的所有整数中,出现多少个数字9)
  • [10. 计算1/1 + 1/2 + 1/3 + 1/4 + ... + 1/100的和](#10. 计算1/1 + 1/2 + 1/3 + 1/4 + ... + 1/100的和)
  • [11. 打印99乘法表](#11. 打印99乘法表)
  • [12. 求一个数的每位之和(递归)](#12. 求一个数的每位之和(递归))
  • [13. 求一个整数n的k次方](#13. 求一个整数n的k次方)
  • [14. 将数组中的内容逆序排列](#14. 将数组中的内容逆序排列)
  • [15. 计算数组的标准差(整数部份)](#15. 计算数组的标准差(整数部份))

1. 递归实现将字符串str中的元素逆序

c 复制代码
void ReverseStr2(char* str) {
	char temp = *str;
	int len = strlen(str);
	*str = *(str + len - 1);
	*(str + len - 1) = '\0';
	if (strlen(str + 1) > 1) ReverseStr2(str + 1);
	*(str + len - 1) = temp;
}

2. 对数组arr进行冒泡排序(升序)

c 复制代码
void BubbleSort(int arr[], int size)
{
	// 这里求sizeof(arr)是错误的,因为arr实际上是一个指针,其长度是固定的8个字节
	// int size = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < size - 1; i++) {
		int flag = 0;
		for (int j = size - 1; j > i; j--) {
			if (arr[j - 1] > arr[j]) {
				swap_2(&arr[j - 1], &arr[j]);
				flag = 1;
			}
		}
		if (!flag) return;
	}
}

3. 对数组从下标low到下标hihg区间内的元素进行快速排序(升序)

c 复制代码
/// <summary>
/// 对数组从下标low到下标hihg区间内的元素进行快速排序(升序)
/// </summary>
/// <param name="arr">整形数组</param>
/// <param name="low">起始元素下标</param>
/// <param name="high">终止元素下标</param>
void QuickSort(int arr[], int low, int high) {
	if (low < high) {
		int pivot_pos = Partition(arr, low, high);
		QuickSort(arr, low, pivot_pos - 1);
		QuickSort(arr, pivot_pos + 1, high);
	}
}
int Partition(int arr[], int low, int high) {
	int pivot = arr[low];
	while (low < high) {
		while (low < high && arr[high] >= pivot) --high;
		arr[low] = arr[high];
		while (low < high && arr[low] <= pivot) ++low;
		arr[high] = arr[low];
	}
	arr[low] = pivot;
	return low;
}

4. 在数组中利用二分查找(折半查找)目标关键字

c 复制代码
/// <summary>
/// 二分查找
/// </summary>
/// <param name="a">数组名</param>
/// <param name="size">数组长度</param>
/// <param name="key">目标关键字</param>
/// <returns>
/// 查找成功返回目标关键字在数组中的下标
/// 否则返回-1
/// </returns>
int BianrySearch(int a[], int size,int key) {
	int low = 0;
	int high = size;
	int mid;
	while (low <= high) {
		mid = (low + high) / 2;
		if (a[mid] == key) return mid;
		else if (a[mid] < key) low = mid + 1;
		else high = mid - 1;
	}
	return -1;
}

5. 求n的阶乘

c 复制代码
int factorial(int n) {
	if (n == 1) return 1;
	else return n * factorial(n - 1);
}

6. 判断year是否为闰年

c 复制代码
/// <summary>
/// 判断year是否为闰年
/// </summary>
/// <param name="year">年份year</param>
/// <returns>是闰年返回1, 否则返回0</returns>
int isLeapYear(int year) {
	// 闰年的判断规则:能被4整除且不能被100整除 或 能被400整除
	if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) return 1;
	else return 0;
}

7. 求两个数的最大公约数(暴力求解)

c 复制代码
int GetGCD(int a, int b) {
	int min = a < b ? a : b; 
	int m = min;
	while (1) {
		if (a % m == 0 && b % m == 0) break;
		m--;
	}
	return m;
}

8. 求两个数的最大公约数(辗转相除法)

c 复制代码
int GetGCD_2(int a, int b) {
	int c;

	c = a % b; // 不用管a,b谁大谁小,结果都是一样的
	while (c > 0) {
		a = b;
		b = c;
		c = a % b;
	}
	return b;
}

9. 统计1~100的所有整数中,出现多少个数字9

c 复制代码
// 9 19 29 39 49 59 69 79 89 90 91 92 93 94 95 96 97 98 99
int GetNum9(void) {
	int count = 0;
	for (int i = 1; i <= 100; i++) {
		int num = i;
		while (num > 0) {
			if (num % 10 == 9) {
				count++;	
			}
			num /= 10;
		}
	}
	return count;
}

10. 计算1/1 + 1/2 + 1/3 + 1/4 + ... + 1/100的和

c 复制代码
double fractionSum(void) {
	double sum = 0.0;
	for (int i = 1; i <= 100; i++) {
		sum += 1.0 / i;
	}
	return sum;
}

11. 打印99乘法表

c 复制代码
void print_multiplication_table(void) {
	for (int i = 1; i <= 9; i++) {
		for (int j = 1; j <= i; j++) {
			printf("%2d ×%2d = %2d\t", i, j, i * j);
		}
		printf("\n");
	}
}

12. 求一个数的每位之和(递归)

c 复制代码
/// <summary>
/// 计算一个数的每位之和(递归)
/// </summary>
/// <param name="n">非负整数n</param>
/// <returns>返回组成它的数字之后</returns>
unsigned int DigitSum(unsigned int n) {
	//unsigned int sum = n % 10;
	//n /= 10;
	//if (n > 0) return sum + DigitSum(n);
	//return sum;
	if (n > 9) return DigitSum(n / 10) + n % 10;
	else return n;
}

13. 求一个整数n的k次方

c 复制代码
/// <summary>
/// 求一个数的k次方
/// </summary>
/// <param name="n">整数n</param>
/// <param name="k">次方数k</param>
/// <returns>返回n^k</returns>
double myPow(int n, int k) {
	if (k > 0) {
		return n * myPow(n, k - 1);
	}
	else if (k == 0) return 1;
	else return 1.0 / myPow(n, -k);
}

14. 将数组中的内容逆序排列

c 复制代码
void ReverseArr(int arr[], int size)
{
	for (int i = 0; i < size / 2; i++) {
		int temp = arr[i];
		arr[i] = arr[size - 1 - i];
		arr[size - 1 - i] = temp;
	}
}

15. 计算数组的标准差(整数部份)

c 复制代码
/// <summary>
/// 计算数组的标准差
/// </summary>
/// <param name="arr">数组名</param>
/// <param name="n">数组长度</param>
/// <returns>正确长度返回标准差,错误长度返回-1</returns>
int calculate_variance(int arr[], int n) {
	if (n < 2) {
		printf("数组长度至少是2\a\n");
		return -1;
	}

	int i;
	int sum = 0;			// 总和
	double mean = 0.0;		// 均值
	double variance = 0.0;	// 方差

	// 求和
	for (i = 0; i < n; i++) {
		sum += arr[i];
	}

	// 求均值
	mean = 1.0 * sum / n;

	// 求方差
	for (i = 0; i < n; i++) {
		variance += pow(arr[i] - mean, 2);	// math.h
	}
	variance /= n;

	return (int)sqrt(variance);		// 返回标准差的整数部份
}
相关推荐
爱的叹息6 分钟前
【java实现+4种变体完整例子】排序算法中【计数排序】的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格
java·算法·排序算法
暖阳冷月海无涯8 分钟前
数据结构-C语言版本(一)数组
c语言·数据结构
CodeJourney.37 分钟前
Python数据可视化领域的卓越工具:深入剖析Seaborn、Plotly与Pyecharts
人工智能·算法·信息可视化
Non importa1 小时前
【初阶数据结构】树——二叉树(上)
c语言·数据结构·学习·算法
Tech Synapse3 小时前
基于Surprise和Flask构建个性化电影推荐系统:从算法到全栈实现
python·算法·flask·协同过滤算法
汤姆_5113 小时前
【c语言】深度理解指针4——sizeof和strlen
c语言·开发语言
終不似少年遊*3 小时前
国产之光DeepSeek架构理解与应用分析04
人工智能·python·深度学习·算法·大模型·ds
天天扭码3 小时前
一分钟解决 | 高频面试算法题——最大子数组之和
前端·算法·面试
杰杰批3 小时前
力扣热题100——矩阵
算法·leetcode·矩阵
明月看潮生3 小时前
青少年编程与数学 02-016 Python数据结构与算法 28课题、图像处理算法
图像处理·python·算法·青少年编程·编程与数学