目录
1.图案问题
2、时分秒转换
3、打印1-100之间所有3的倍数的数字
4、打印100~200之间的素数
5、给定两个数,求这两个数的最大公约数
6、在屏幕上输出9*9乘法口诀表
7、计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,打印出结果
8、二分查找
9、交换两个整数
10、strlen的模拟(递归实现)
11、递归方式实现打印一个整数的每一位
12、计算斐波那契数
13、字符串逆序(递归/非递归实现)
14、冒泡排序
15、交换两个变量(不创建临时变量)
16、统计二进制中1的个数
17、打印整数二进制的奇数位和偶数位
18、求两个数二进制中不同位的个数
19、矩阵元素
20、进制转换编辑
21、矩阵转置
22、序列中删除指定数字
23、使用指针打印数组内容
24、字符串逆序(多组输入)
25、打印菱形
26、打印水仙花数
27、计算求和
28、喝汽水问题
29、上三角矩阵判定
30、矩阵相等判断
31、调整奇数偶数顺序
32、有序序列合并
33、有序序列判断
34、strcpy实现
36、strlen实现
37、逆置字符串的变种
1.图案问题
#include <stdio.h> int main() { int n = 0; while (scanf("%d",&n) != EOF) { for (int i = 0; i < n; i++) { printf("*"); } printf("\n"); } return 0; }
2、时分秒转换
#include <stdio.h> int main() { int sec = 0, s, m, h; scanf("%d", &sec); h = sec / 60 / 60; m = sec / 60 % 60; s = sec % 60; printf("%d %d %d\n", h, m, s); return 0; }
3、打印1-100之间所有3的倍数的数字
#include <stdio.h> int main() { for (int i = 1; i <= 100; i++) { if (i % 3 == 0) { printf("%d ", i); } } return 0; }
4、打印100~200之间的素数
#include <stdio.h> int main() { for (int i = 100; i <= 200; i++) { for (int j = 2; j < i; j++) { if (i % j == 0) { break; } if (j == i-1) { printf("%d ", i); } } } return 0; }
5、给定两个数,求这两个数的最大公约数
#include <stdio.h> int main() { int a, b; scanf("%d %d", &a, &b); int c = a % b; while (c) { a = b; b = c; c = a % b; } printf("%d\n", b); return 0; }
6、在屏幕上输出9*9乘法口诀表
#include <stdio.h> int main() { for (int i = 1; i <= 9; i++) { for (int j = 1; j <= i; j++) { printf("%d*%d=%d\t", j, i, i * j); } printf("\n"); } return 0; }
7、计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,打印出结果
#include <stdio.h> int main() { int flag = 1; double sum = 0.0; for (int i = 1; i <= 100; i++) { sum += flag * 1.0 / i; flag *= -1; } printf("%.2f\n", sum); return 0; }
8、二分查找
#include <stdio.h> int binary_search(int* arr, int sz,int key) { int left = 0; int right = sz - 1; while (left<=right) { int mid = left + (right - left) / 2; if (arr[mid] > key) { right = mid - 1; } else if (arr[mid] < key) { left = mid + 1; } else { return mid; } } } int main() { int arr[] = { 1,2,3,4,5,6,7 }; int key = 5; int sz = sizeof(arr) / sizeof(arr[0]); int ret = binary_search(arr, sz,key); printf("下标为%d\n", ret); return 0; }
9、交换两个整数
#include <stdio.h> void swap(int* pa, int* pb) { int tmp = *pa; *pa = *pb; *pb = tmp; } int main() { int a, b; scanf("%d %d", &a, &b); swap(&a, &b); printf("%d %d\n", a, b); return 0; }
10、strlen的模拟(递归实现)
#include <stdio.h> int my_strlen(char* str) { if (*str == '\0') return 0; else return 1 + my_strlen(str + 1); } int main() { char arr[] = "abcdef"; printf("%d\n", my_strlen(arr)); return 0; }
11、递归方式实现打印一个整数的每一位
#include <stdio.h> Print(int a) { if (a > 9) { Print(a/10); } printf("%d ", a%10); } int main() { int a = 1234; Print(a); return 0; }
12、计算斐波那契数
#include <stdio.h> int fib(int a) { if (a == 1 || a == 2) { return 1; } return fib(a - 1) + fib(a - 2); } int main() { int a = 0; scanf("%d", &a); printf("%d\n", fib(a)); return 0; }
13、字符串逆序(递归/非递归实现)
递归:
#include <stdio.h> #include <string.h> void reverse(char* arr) { int len = strlen(arr); char* tmp = *arr; *arr = *(arr + len - 1); *(arr + len - 1) = '\0'; if (strlen(arr + 1) >= 2) { reverse(arr + 1); } *(arr + len - 1) = tmp; } int main() { char arr[] = "abcdef"; reverse(arr); printf("%s\n", arr); return 0; }
非递归:
#include <stdio.h> #include <string.h> void reverse(arr) { char *left = arr; char *right = arr + strlen(arr) - 1; while (left <= right) { char tmp = *left; *left = *right; *right = tmp; left++; right--; } } int main() { char arr[] = "abcdef"; reverse(arr); printf("%s\n", arr); return 0; }
14、冒泡排序
#include <stdio.h> bubble_search(int* arr, int sz) { for (int i = 0; i < sz - 1; i++) { for (int j = 0; j < sz-1-i; j++) { if (arr[j] > arr[j + 1]) { int tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; } } } } int main() { int arr[] = {1,2,9,8,4,6,3,7,5}; int sz = sizeof(arr) / sizeof(arr[0]); bubble_search(arr, sz); for (int i = 0; i < sz; i++) { printf("%d ", arr[i]); } return 0; }
15、交换两个变量(不创建临时变量)
#include <stdio.h> int main() { int a, b = 0; scanf("%d %d", &a, &b); a = a ^ b; b = a ^ b; a = a ^ b; printf("%d %d", a, b); return 0; }
16、统计二进制中1的个数
比如: 15 0000 1111 4 个 1
#include <stdio.h> int main() { int n = 0; scanf("%d", &n); int count = 0; for (int i = 0; i < 32; i++) { if (n & 1 == 1) { count++; } n = n >> 1; } printf("%d\n", count); return 0; }
17、打印整数二进制的奇数位和偶数位
#include <stdio.h> int main() { int n = 0; scanf("%d", &n); //打印奇数位 for (int i = 31; i >=1; i -= 2) { printf("%d ", (n>>i) & 1); } printf("\n"); for (int i = 30; i >= 0; i -= 2) { printf("%d ", (n >> i) & 1); } }
18、求两个数二进制中不同位的个数
输入例子:
1999 2299
输出例子: 7
#include <stdio.h> int main() { int m, n; scanf("%d %d", &m, &n); int t = m ^ n; int count = 0; for (int i = 0; i < 32; i++) { if ((t>>i)&1==1) { count++; } } printf("%d\n", count); return 0; }
19、矩阵元素
#include <stdio.h> int main() { int m, n; scanf("%d %d", &n, &m); int arr[10][10]; int sum = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { scanf("%d", &arr[i][j]); } } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (arr[i][j] > 0) { sum += arr[i][j]; } } } printf("%d\n", sum); return 0; }
20、进制转换
//递归: #include <stdio.h> void Print(int n) { if (n >= 6) { Print(n / 6); } printf("%d", n%6); } int main() { int n = 0; scanf("%d", &n); Print(n); return 0; } //循环: int main() { int n = 0, sum = 0, i = 1; scanf("%d", &n); while (n) { sum += n % 6 * i; n /= 6; i *= 10; } printf("%d\n", sum); return 0; }
21、矩阵转置
#include <stdio.h> int main() { int n, m; scanf("%d %d", &n, &m); int arr[10][10]; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { scanf("%d", &arr[i][j]); } } printf("\n"); for (int j = 0; j < m; j++) { for (int i = 0; i < n; i++) { printf("%d ", arr[i][j]); } printf("\n"); } return 0; }
22、序列中删除指定数字
#include <stdio.h> int main() { int n = 0, x = 0; scanf("%d", &n); int arr[50]; for (int i = 0; i < n; i++) { scanf("%d", &arr[i]); } scanf("%d", &x); for (int i = 0; i < n; i++) { if (arr[i] != x) { printf("%d ", arr[i]); } } return 0; }
23、使用指针打印数组内容
#include <stdio.h> int main() { int arr[] = { 1,2,3,4,5,6,7,8 }; int* p = arr; for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) { printf("%d ", *(p + i)); } return 0; }
24、字符串逆序(多组输入)
#include <stdio.h> #include <string.h> reverse(char* str) { char* left = str; char* right = str + strlen(str) - 1; while (left <= right) { char tmp = *left; *left = *right; *right = tmp; left++; right--; } } int main() { char arr[100]; while (gets(arr)) { reverse(arr); printf("%s\n", arr); memset(arr, 0, sizeof(arr) / sizeof(arr[0]));//初始化 } return 0; }
25、打印菱形
#include <stdio.h> int main() { int n = 0; scanf("%d", &n); //上半 for (int i = 0; i < n; i++) { //打印空格 for (int j = 0; j < n -1-i; j++) { printf(" "); } //打印* for (int k = 0; k < 2*i+1; k++) { printf("*"); } printf("\n"); } //下半 for (int i = 0; i < n - 1; i++) { //打印空格 for (int j = 0; j < i + 1; j++) { printf(" "); } //打印* for (int k = 0; k < 2 * (n - 2 - i) + 1; k++) { printf("*"); } printf("\n"); } return 0; }
26、打印水仙花数
求出0~100000之间的所有“水仙花数”并输出。“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1^3+5^3+3^3,则153是一个“水仙花数”
#include <stdio.h> #include <math.h> int main() { for (int i = 0; i <= 100000; i++) { int count = 1; int sum = 0; int tmp = i; //获取位数 while (tmp > 9) { count++; tmp /= 10; } tmp = i; //计算次方和 while (tmp != 0) { sum += pow(tmp % 10, count); tmp /= 10; } //判断 if (sum == i) { printf("%d ", i); } } return 0; }
27、计算求和
求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字,
例如:2+22+222+2222+22222
#include <stdio.h> int main() { int a = 0; scanf("%d", &a); int ret = a; int sum = 0; for (int i = 0; i < 5; i++) { sum += ret; ret = ret * 10 + a; } printf("%d\n", sum); return 0; }
28、喝汽水问题
喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水(编程实现)。
//直接计算 #include <stdio.h> int main() { int money = 0; scanf("%d", &money); int count = money; int empty = money; while (empty > 1) { count += empty / 2; empty = empty / 2 + empty % 2; } printf("%d\n", count); return 0; } //等差数列 int main() { int money = 0; scanf("%d", &money); int count = 0; if (money <= 0) { count = 0; } else { count = 2 * money - 1; } printf("%d\n", count); return 0; }
29、上三角矩阵判定
#include <stdio.h> int main() { int n = 0; scanf("%d", &n); int arr[10][10]; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { scanf("%d", &arr[i][j]); } } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (i > j&&arr[i][j]!=0) { return 0; } } } printf("YES\n"); return 0; }
30、矩阵相等判断
#include <stdio.h> int main() { int n = 0, m = 0; scanf("%d %d", &n, &m); int arr1[10][10]; int arr2[10][10]; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { scanf("%d", &arr1[i][j]); } } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { scanf("%d", &arr2[i][j]); } } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (arr1[i][j] != arr2[i][j]) { printf("No\n"); return 0; } } } printf("Yes\n"); return 0; }
31、调整奇数偶数顺序
调整数组使奇数全部都位于偶数前面。输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。
#include <stdio.h> swap_arr(int arr[], int sz) { int left = 0; int right = sz - 1; while (left <= right) { //从左向右找偶数 while ((left <= right) && (arr[left] % 2 == 1)) { left++; } //从右向左找奇数 while ((left <= right) && (arr[right] % 2 == 0)) { right--; } if (left <= right) { int tmp = arr[left]; arr[left] = arr[right]; arr[right] = tmp; } } } int main() { int arr[] = { 1,2,3,4,5,6,7,8,9 }; int sz = sizeof(arr) / sizeof(arr[0]); swap_arr(arr, sz); for (int i = 0; i < sz; i++) { printf("%d ", arr[i]); } return 0; }
32、有序序列合并
#include <stdio.h> int main() { int n = 0,m = 0; scanf("%d %d", &n, &m); int arr[2000]; for (int i = 0; i < n; i++) { scanf("%d", &arr[i]); } for (int i = n; i < n + m; i++) { scanf("%d", &arr[i]); } //冒泡排序 for (int i = 0; i < n + m - 1; i++) { for (int j = 0; j < n + m - 1 - i; j++) { if (arr[j] > arr[j + 1]) { int tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; } } } for (int i = 0; i < n + m; i++) { printf("%d ", arr[i]); } return 0; }
33、有序序列判断
#include <stdio.h> int main() { int n = 0; scanf("%d", &n); int arr[50]; int count1 = 0, count2 = 0;//分别表示升序降序个数 for (int i = 0; i < n; i++) { scanf("%d", &arr[i]); } for (int i = 0; i < n-1; i++) { if (arr[i] - arr[i + 1]<=0) { count1++; } else if (arr[i] - arr[i + 1] >= 0) { count2++; } } if (count1 == n - 1 || count2 == n - 1) { printf("sorted"); } else { printf("unsorted"); } return 0; }
34、strcpy实现
模拟实现库函数strcpy
#include <stdio.h> #include <assert.h> char* my_strcpy(char* dest,char* src) { assert(dest && src);//断言 /*while (*src != '\0') { *dest++ = *src++; } *dest = *src; return dest;*/ while (*dest++=*src++) { ; } return dest; } int main() { char arr1[] = "xxxxxxxxxxx"; char arr2[] = "abcdef"; my_strcpy(arr1,arr2); printf("%s\n", arr1); return 0; }
36、strlen实现
模拟实现库函数strlen
#include <stdio.h> #include <assert.h> int my_strlen(char* arr) { int count = 0; assert(arr); while (*arr++) { count++; } return count; } int main() { char arr[] = "abcdef"; int ret = my_strlen(arr); printf("%d\n", ret); return 0; }
37、逆置字符串的变种
#include <stdio.h> #include <string.h> #include <assert.h> void reverse(char* left, char* right) { assert(left && right); while (left < right) { char tmp = *left; *left = *right; *right = tmp; left++; right--; } } int main() { char arr[100] = { 0 }; //输入 gets(arr); int len = strlen(arr); //完成这个逆序 //1. 逆序整个字符串 reverse(arr, arr + len - 1); //逆序每个单词 char* cur = arr; while (*cur) { char* start = cur; while (*cur != ' ' && *cur != '\0') { cur++; } reverse(start, cur - 1); if (*cur != '\0') cur++; } //打印 printf("%s\n", arr); return 0; }