- 判断一个年份是否为闰年:
#include<stdio.h> int isLeapYear(int year) { if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { // 判断是否能被4整除但不能被100整除,或者能被400整除 return 1; // 是闰年 } return 0; // 不是闰年 } int main() { int year = 2020; if (isLeapYear(year)) { printf("%d is a leap year\n", year); } else { printf("%d is not a leap year\n", year); } return 0; }
#手动输入年份 #include<stdio.h> int isLeapYear(int year) { if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { // 判断是否能被4整除但不能被100整除,或者能被400整除 return 1; // 是闰年 } return 0; // 不是闰年 } int main() { int year; printf("请输入一个年份:"); scanf("%d", &year); if (isLeapYear(year)) { printf("%d 是闰年\n", year); } else { printf("%d 不是闰年\n", year); } return 0; }
- 计算两个数的最大公约数(欧几里得算法):
#include<stdio.h> int gcd(int a, int b) { if (b == 0) { // 如果第二个数为0,返回第一个数作为最大公约数 return a; } return gcd(b, a % b); // 递归计算最大公约数 } int main() { int num1 = 48, num2 = 36; int result = gcd(num1, num2); printf("GCD of %d and %d is %d\n", num1, num2, result); return 0; }
例子:计算48和36的最大公约数。首先,将会调用
gcd(48, 36)
函数。在
gcd
函数内部,首先判断b
是否为0,如果是0,则返回a
作为最大公约数。在此例中,b
不等于0,因此继续执行递归调用gcd(36, 48 % 36)
。再次进入
gcd
函数,判断b
是否为0。由于48 % 36
的结果为12,所以b
不等于0,继续执行递归调用gcd(12, 36 % 12)
。继续进入
gcd
函数,判断b
是否为0。由于36 % 12
的结果为0,所以b
等于0,返回a
的值12作为最大公约数。回到
main
函数,将得到的最大公约数12赋值给变量result
,然后使用printf
函数输出结果:"GCD of 48 and 36 is 12"。因此,输出的结果是"GCD of 48 and 36 is 12"。
- 将一个二进制数转换为十进制数:
#include<stdio.h> int binaryToDecimal(int binary) { int decimal = 0, base = 1; while (binary > 0) { int reminder = binary % 10; // 获取最后一位数字 decimal += reminder * base; // 将最后一位数字乘以对应的权重加到结果中 binary /= 10; // 去掉最后一位数字 base *= 2; // 权重每次乘以2 } return decimal; // 返回对应的十进制数 } int main() { int binary = 101010; int decimal = binaryToDecimal(binary); printf("Binary number %d in decimal is %d\n", binary, decimal); return 0; }
计算二进制数101010转换为十进制数的过程如下: 初始值:binary = 101010, decimal = 0, base = 1 第一次循环: reminder = binary % 10 = 0 (获取最后一位数字) decimal += reminder * base = 0 * 1 = 0 (将最后一位数字乘以权重加到结果中) binary /= 10 = 10101 (去掉最后一位数字) base *= 2 = 1 * 2 = 2 (权重每次乘以2) 第二次循环: reminder = binary % 10 = 1 decimal += reminder * base = 1 * 2 = 2 binary /= 10 = 1010 base *= 2 = 2 * 2 = 4 第三次循环: reminder = binary % 10 = 0 decimal += reminder * base = 0 * 4 = 0 binary /= 10 = 101 base *= 2 = 4 * 2 = 8 第四次循环: reminder = binary % 10 = 1 decimal += reminder * base = 1 * 8 = 8 binary /= 10 = 10 base *= 2 = 8 * 2 = 16 第五次循环: reminder = binary % 10 = 0 decimal += reminder * base = 0 * 16 = 0 binary /= 10 = 1 base *= 2 = 16 * 2 = 32 第六次循环: reminder = binary % 10 = 1 decimal += reminder * base = 1 * 32 = 32 binary /= 10 = 0 base *= 2 = 32 * 2 = 64 循环结束,此时binary = 0,跳出while循环。 最终结果:decimal = 32 因此,二进制数101010转换为的十进制数为32。
- 实现斐波那契数列(递归版本):
#斐波那契数列是一个数列,其中每个数字都是前两个数字之和。 #include<stdio.h> int fibonacci(int n) { if (n <= 1) { // 斐波那契数列的前两个数字是1 return n; } return fibonacci(n - 1) + fibonacci(n - 2); // 递归调用计算下一个数字 } int main() { int n = 7; printf("Fibonacci series up to index %d: ", n); for (int i = 0; i <= n; i++) { printf("%d ", fibonacci(i)); } printf("\n"); return 0; }
在这个例子中,我们希望计算斐波那契数列的前n个数字。 首先,在 main 函数中定义了一个变量 n 并赋值为 7。 然后,调用 printf 函数输出提示信息: "Fibonacci series up to index 7: "。 接着,使用 for 循环从0到n遍历,变量 i 表示当前的索引位置。 在循环内部,调用 fibonacci 函数,并传入 i 作为参数。 fibonacci 函数根据传入的索引位置计算对应的斐波那契数,并返回结果。 使用 printf 函数将计算得到的数值输出。 循环执行完毕后,调用 printf 函数输出换行符"\n"。 最后,返回0表示程序正常结束。 运行以上代码,输出结果为: Fibonacci series up to index 7: 0 1 1 2 3 5 8 13 因此,输出的结果是斐波那契数列的前7个数字: "0 1 1 2 3 5 8 13"。
- 将一个十进制数转换为二进制数:
#include<stdio.h> void decimalToBinary(int decimal) { int binary[32], index = 0; while (decimal > 0) { binary[index++] = decimal % 2; // 获取余数作为二进制位 decimal /= 2; // 计算商继续转换 } printf("Binary representation: "); for (int i = index - 1; i >= 0; i--) { printf("%d", binary[i]); // 倒序输出二进制位 } printf("\n"); } int main() { int decimal = 42; decimalToBinary(decimal); return 0; }
以上是一个将十进制数转换为二进制数的示例代码。 在此示例中,我们定义了一个名为 `decimalToBinary` 的函数, 该函数接受一个十进制数作为参数,并将其转换为二进制数。 在 `decimalToBinary` 函数内部,我们首先定义了一个大小为32的整数数组 `binary` 和一个变量 `index`,用于保存二进制数的每一位和当前位置。 然后,我们使用一个 `while` 循环来进行转换。循环条件是十进制数大于0。 在每次循环迭代中,我们通过对2取余数的方式获取当前位的二进制值,并将其存储在 `binary` 数组中。然后,我们将十进制数除以2(即向右移位),以计算下一位的值。同时,`index` 变量自增,表示当前位置已经用于存储了一个二进制位。 循环结束后,我们使用 `printf` 函数输出提示信息:"Binary representation: "。 接下来,我们使用一个 `for` 循环从最高位开始,倒序输出 `binary` 数组中的二进制位。循环条件是 `i` 大于等于0,每次迭代时,`i` 自减。 最后,我们使用 `printf` 函数输出换行符 "\n"。 在 `main` 函数中,我们定义了一个变量 `decimal` 并赋值为42。 然后,调用 `decimalToBinary` 函数并传入 `decimal` 作为参数进行转换。 最后,返回0表示程序正常结束。 运行以上代码,输出结果为:Binary representation: 101010 因此,42的二进制表示为101010。
- 求一个数组中的最大值和最小值:
#include<stdio.h> // 函数:查找数组中的最小值和最大值 void findMinMax(int arr[], int size) { int min = arr[0], max = arr[0]; // 遍历数组,更新最大值和最小值 for (int i = 1; i < size; i++) { if (arr[i] < min) { // 如果当前元素小于最小值,则更新最小值 min = arr[i]; } if (arr[i] > max) { // 如果当前元素大于最大值,则更新最大值 max = arr[i]; } } // 输出最小值和最大值 printf("Minimum value: %d\n", min); printf("Maximum value: %d\n", max); } // 主函数 int main() { int arr[] = {64, 34, 25, 12, 22, 11, 90}; // 数组 int size = sizeof(arr) / sizeof(arr[0]); // 数组大小 // 调用函数查找最小值和最大值 findMinMax(arr, size); return 0; }
- 实现简单的计算器(加法、减法、乘法、除法):
#include <stdio.h> int add(int a, int b) { return a + b; } int subtract(int a, int b) { return a - b; } int multiply(int a, int b) { return a * b; } float divide(int a, int b) { if (b != 0) { // 避免除数为0 return (float)a / b; } return -1; // 返回-1表示非法操作 } int main() { char expr[100]; // 定义字符数组存储用户输入的表达式 int num1, num2; char op; printf("请输入表达式:"); scanf("%s", expr); // 读取用户输入的表达式 // 从表达式中提取数字和运算符号 sscanf(expr, "%d %c %d", &num1, &op, &num2); // 根据运算符号进行相应的运算 switch (op) { case '+': printf("%d + %d = %d\n", num1, num2, add(num1, num2)); break; case '-': printf("%d - %d = %d\n", num1, num2, subtract(num1, num2)); break; case '*': printf("%d * %d = %d\n", num1, num2, multiply(num1, num2)); break; case '/': printf("%d / %d = %.2f\n", num1, num2, divide(num1, num2)); break; default: printf("非法运算符号\n"); break; } return 0; }
- 判断一个字符串是否为回文字符串:
#include<stdio.h> #include<string.h> int isPalindrome(char str[]) { int len = strlen(str); for (int i = 0, j = len - 1; i < j; i++, j--) { if (str[i] != str[j]) { // 检查对应位置的字符是否相等 return 0; // 不是回文字符串 } } return 1; // 是回文字符串 } int main() { char str[] = "level"; if (isPalindrome(str)) { printf("%s is a palindrome\n", str); } else { printf("%s is not a palindrome\n", str); } return 0; }
- 实现简单的线性查找算法在数组中查找指定元素:
#include<stdio.h> int linearSearch(int arr[], int size, int target) { for (int i = 0; i < size; i++) { if (arr[i] == target) { // 如果找到目标元素,返回索引 return i; } } return -1; // 如果未找到目标元素,返回-1 } int main() { int arr[] = {5, 3, 9, 7, 2}; int size = sizeof(arr) / sizeof(arr[0]); int target = 7; int index = linearSearch(arr, size, target); if (index != -1) { printf("Target element %d found at index %d\n", target, index); } else { printf("Target element %d not found\n", target); } return 0; }
- 实现选择排序算法对数组进行排序:
#include<stdio.h> void selectionSort(int arr[], int size) { for (int i = 0; i < size - 1; i++) { int minIndex = i; // 假设当前位置为最小值的索引 for (int j = i + 1; j < size; j++) { if (arr[j] < arr[minIndex]) { // 更新最小值的索引 minIndex = j; } } // 将最小值与当前位置交换 int temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp; } } int main() { int arr[] = {64, 34, 25, 12, 22, 11, 90}; int size = sizeof(arr) / sizeof(arr[0]); selectionSort(arr, size); printf("Sorted array: "); for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; }
- 将一个十进制数转换为十六进制数:
#include<stdio.h> void decimalToHexadecimal(int decimal) { char hexadecimal[100]; int index = 0; while (decimal > 0) { int reminder = decimal % 16; // 获取余数作为十六进制位 if (reminder < 10) { hexadecimal[index++] = reminder + '0'; // 将数字直接转换为字符 } else { hexadecimal[index++] = reminder - 10 + 'A'; // 将大于9的数字转换为对应的字母字符 } decimal /= 16; // 计算商继续转换 } printf("Hexadecimal representation: "); for (int i = index - 1; i >= 0; i--) { printf("%c", hexadecimal[i]); } printf("\n"); } int main() { int decimal = 305; decimalToHexadecimal(decimal); return 0; }
- 实现求和函数(递归版本):
#include<stdio.h> int sum(int n) { if (n == 0) { // 终止条件,当n等于0时,返回0 return 0; } return n + sum(n - 1); // 递归调用计算1到n的和 } int main() { int n = 5; int result = sum(n); printf("Sum of first %d numbers is %d\n", n, result); return 0; }
- 判断一个数是否为素数:
#include<stdio.h> int isPrime(int num) { if (num <= 1) { // 小于等于1的数不是素数 return 0; } for (int i = 2; i * i <= num; i++) { if (num % i == 0) { // 如果能整除,则不是素数 return 0; } } return 1; // 是素数 } int main() { int num = 17; if (isPrime(num)) { printf("%d is a prime number\n", num); } else { printf("%d is not a prime number\n", num); } return 0; }
- 实现插入排序算法对数组进行排序:
#include<stdio.h> void insertionSort(int arr[], int size) { for (int i = 1; i < size; i++) { int key = arr[i]; // 当前待排序的元素 int j = i - 1; while (j >= 0 && arr[j] > key) { // 将大于当前元素的元素向后移动 arr[j + 1] = arr[j]; j--; } arr[j + 1] = key; // 插入当前元素到正确位置 } } int main() { int arr[] = {64, 34, 25, 12, 22, 11, 90}; int size = sizeof(arr) / sizeof(arr[0]); insertionSort(arr, size); printf("Sorted array: "); for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; }
- 计算两个数的幂:
#include<stdio.h> double power(double base, int exponent) { double result = 1.0; if (exponent > 0) { for (int i = 0; i < exponent; i++) { result *= base; // 计算正指数的幂 } } else if (exponent < 0) { for (int i = 0; i > exponent; i--) { result /= base; // 计算负指数的幂 } } return result; } int main() { double base = 2.5; int exponent = -3; double result = power(base, exponent); printf("%.2lf raised to the power of %d is %.2lf\n", base, exponent, result); return 0; }
- 实现冒泡排序算法对数组进行排序:
#include<stdio.h> void bubbleSort(int arr[], int size) { for (int i = 0; i < size - 1; i++) { for (int j = 0; j < size - i - 1; j++) { if (arr[j] > arr[j + 1]) { // 比较相邻元素并交换位置 int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } int main() { int arr[] = {64, 34, 25, 12, 22, 11, 90}; int size = sizeof(arr) / sizeof(arr[0]); bubbleSort(arr, size); printf("Sorted array: "); for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; }
- 在数组中查找指定元素的索引:
#include<stdio.h> int findIndex(int arr[], int size, int target) { for (int i = 0; i < size; i++) { if (arr[i] == target) { // 如果找到目标元素,返回索引 return i; } } return -1; // 如果未找到目标元素,返回-1 } int main() { int arr[] = {1, 2, 3, 4, 5}; int size = sizeof(arr) / sizeof(arr[0]); int target = 3; int index = findIndex(arr, size, target); if (index != -1) { printf("Target element %d found at index %d\n", target, index); } else { printf("Target element %d not found\n", target); } return 0; }
- 判断一个字符串是否为回文排列(忽略空格和标点符号):
#include<stdio.h> #include<string.h> #include<ctype.h> int isPalindromePermutation(char str[]) { int count[26] = {0}; for (int i = 0; i < strlen(str); i++) { if (isalpha(str[i])) { // 统计字符出现的次数 count[tolower(str[i]) - 'a']++; } } int oddCount = 0; for (int i = 0; i < 26; i++) { if (count[i] % 2 != 0) { // 统计字符出现奇数次的个数 oddCount++; } } if (oddCount <= 1) { // 如果奇数字符的个数小于等于1,则是回文排列 return 1; } return 0; } int main() { char str[] = "Tact Coa"; if (isPalindromePermutation(str)) { printf("%s is a palindrome permutation\n", str); } else { printf("%s is not a palindrome permutation\n", str); } return 0; }
- 统计一个字符串中的字符、单词和行数:
#include<stdio.h> #include<string.h> void countCharactersWordsLines(char str[]) { int characters = 0, words = 0, lines = 1; for (int i = 0; i < strlen(str); i++) { if (str[i] != '\n' && str[i] != ' ') { // 统计字符数 characters++; } if (str[i] == ' ' || str[i] == '\n') { // 统计单词数 words++; } if (str[i] == '\n') { // 统计行数 lines++; } } printf("Character count: %d\n", characters); printf("Word count: %d\n", words); printf("Line count: %d\n", lines); } int main() { char str[] = "Hello World!\nThe quick brown fox jumps over the lazy dog."; countCharactersWordsLines(str); return 0; }
- 计算一个数的平方根(使用牛顿迭代法):
#include<stdio.h> float sqrtUsingNewton(float num) { float x = num; float y = 1; float epsilon = 0.00001; while (x - y > epsilon) { x = (x + y) / 2; // 使用牛顿迭代法更新x和y y = num / x; } return x; // 返回x作为平方根近似值 } int main() { float number = 16; printf("Square root of %.2f: %.4f\n", number, sqrtUsingNewton(number)); return 0; }
- 实现选择排序算法对数组进行排序:
#include<stdio.h> void selectionSort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { int minIndex = i; for (int j = i + 1; j < n; j++) { if (arr[j] < arr[minIndex]) { // 寻找最小值的索引 minIndex = j; } } int temp = arr[i]; // 将最小值与当前位置交换 arr[i] = arr[minIndex]; arr[minIndex] = temp; } } int main() { int arr[] = {64, 34, 25, 12, 22, 11, 90}; int n = sizeof(arr) / sizeof(arr[0]); selectionSort(arr, n); printf("Sorted array: "); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; }
- 判断一个字符串是否为回文句子(忽略空格和标点符号):
#include<stdio.h> #include<string.h> #include<ctype.h> int isPalindromeSentence(char str[]) { int left = 0, right = strlen(str) - 1; while (left < right) { if (!isalpha(str[left])) { // 跳过非字母字符 left++; } else if (!isalpha(str[right])) { right--; } else { if (tolower(str[left]) != tolower(str[right])) { // 忽略大小写比较字符 return 0; // 不是回文句子 } left++; right--; } } return 1; // 是回文句子 } int main() { char str[] = "A man, a plan, a canal, Panama!"; if (isPalindromeSentence(str)) { printf("%s is a palindrome sentence\n", str); } else { printf("%s is not a palindrome sentence\n", str); } return 0; }
- 将一个整数数组倒置:
#include<stdio.h> void reverseArray(int arr[], int size) { for (int i = 0; i < size / 2; i++) { int temp = arr[i]; // 交换数组两端的元素 arr[i] = arr[size - i - 1]; arr[size - i - 1] = temp; } } int main() { int arr[] = {1, 2, 3, 4, 5}; int size = sizeof(arr) / sizeof(arr[0]); reverseArray(arr, size); printf("Reversed array: "); for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; }
- 判断一个数是否为完全平方数:
#include<stdio.h> #include<math.h> int isPerfectSquare(int num) { int squareRoot = sqrt(num); if (squareRoot * squareRoot == num) { // 判断平方根的平方是否等于原数 return 1; // 是完全平方数 } return 0; // 不是完全平方数 } int main() { int number = 16; if (isPerfectSquare(number)) { printf("%d is a perfect square\n", number); } else { printf("%d is not a perfect square\n", number); } return 0; }
- 将一个字符串转换为整数:
#include<stdio.h> #include<stdlib.h> int main() { char numStr[] = "12345"; int num = atoi(numStr); // 使用atoi函数将字符串转换为整数 printf("Number: %d\n", num); return 0; }
- 反转一个字符串:
#include<stdio.h> #include<string.h> int main() { char str[] = "Hello World"; int length = strlen(str); for (int i = length - 1; i >= 0; i--) { printf("%c", str[i]); } printf("\n"); return 0; }
- 计算一个数的阶乘:
#include<stdio.h> int main() { int num = 5; int factorial = 1; for (int i = 1; i <= num; i++) { factorial *= i; } printf("Factorial of %d: %d\n", num, factorial); return 0; }
- 输出乘法表:
#include<stdio.h> int main() { int i, j; for (i = 1; i <= 10; i++) { for (j = 1; j <= 10; j++) { printf("%d * %d = %d\n", i, j, i*j); } printf("\n"); } return 0; }
- 将一个字符串中的所有小写字母转换为大写:
#include<stdio.h> #include<string.h> void toUpperCase(char str[]) { int len = strlen(str); for (int i = 0; i < len; i++) { if (islower(str[i])) { str[i] = toupper(str[i]); // 转换为大写字母 } } } int main() { char str[] = "Hello, World!"; toUpperCase(str); printf("After conversion: %s\n", str); return 0; }
- 判断一个数是否为完全数:
#include<stdio.h> int isPerfectNumber(int num) { int sum = 0; for (int i = 1; i < num; i++) { if (num % i == 0) { sum += i; } } return sum == num; } int main() { int num = 6; if (isPerfectNumber(num)) { printf("%d is a perfect number\n", num); } else { printf("%d is not a perfect number\n", num); } return 0; }
- 计算斐波那契数列的第n项:
#include<stdio.h> int fibonacci(int n) { if (n <= 1) { return n; } return fibonacci(n - 1) + fibonacci(n - 2); } int main() { int n = 10; int result = fibonacci(n); printf("The %dth term of Fibonacci sequence is %d\n", n, result); return 0; }
31个C语言实战经典例子,期末考试/考研必背
于 2023-07-14 17:27:09 首次发布