C语言复习
1.输入九九乘法表(上三角)
#include <stdio.h>
int main() {
//上三角
for (int i = 1 ; i <= 9; i ++)
{
for (int j = 1 ; j <= 9 ; j ++) {
if (i <= j) printf("%d*%d=%2d ", i,j,i*j);
else printf(" "); //七个空格
}
printf("\n");
}
return 0;
}
运行结果:
2.输入九九乘法表(下三角)
#include <stdio.h>
int main() {
//上三角
for (int i = 1 ; i <= 9; i ++)
{
for (int j = 1 ; j <= 9 ; j ++) {
//下三角按照我们乘法表习惯,小的在前 i,j还需调换一下
if (j <= i) printf("%d*%d=%2d ", j,i,i*j);
else printf(" ");
}
printf("\n");
}
return 0;
}
运行结果:
解析: i代表行, j代表列
上三角i <= j 随着行数的 +1,每一列 -1,下三角 j <= i, 随着行数+1 打印的列数 + 1
只是选择性打印区别,都是O(n*n);
3.双向冒泡排序(鸡尾酒排序)
#include <stdio.h>
void bubble_sort(int array[], int n) {
int left = 0, right = n - 1;
while (left < right) {
//从左往右冒泡
for (int i = left ; i < right ; i ++) {
if (array[i] > array[i + 1]) {
int tmp = array[i];
array[i] = array[i + 1];
array[i + 1] = tmp;
}
}
right --;
//从右往左冒泡
for (int i = right ; i > left ; i --) {
if (array[i] < array[i - 1]) {
int tmp = array[i];
array[i] = array[i - 1];
array[i - 1] = tmp;
}
}
left ++;
}
}
int main() {
int array[] = {5, 2, 8, 3, 1, 6};
int n = sizeof(array) / sizeof(array[0]);
bubble_sort(array, n);
//输出排序后的数组
for (int i = 0 ; i < n ; i ++) {
printf("%d ", array[i]);
}
return 0;
}
4.杨辉三角
#include <stdio.h>
int main() {
int rows, coef = 1;
printf("请输入行数: \n");
scanf("%d", &rows);
for(int i = 0; i < rows; i++) {
for(int space = 1; space <= rows-i; space++) {
printf(" ");
}
for(int j = 0; j <= i; j++) {
if (j == 0 || i == 0)
coef = 1;
else
coef = coef*(i-j+1)/j;
printf("%4d", coef);
}
printf("\n");
}
return 0;
}
5.杨辉三角(递归)
#include <stdio.h>
int yanghui(int i, int j) {
if (j == 1 || j == i) {
return 1;
}
return yanghui(i-1, j-1) + yanghui(i-1, j);
}
int main() {
int n, i, j;
printf("请输入杨辉三角的行数:\n");
scanf("%d", &n);
for (i = 1; i <= n; i++) {
for (j = 0; j < n - i ; j ++) {
printf(" ");
}
for (j = 1; j <= i; j++) {
printf("%4d", yanghui(i, j));
}
printf("\n");
}
return 0;
}
6.最大公倍数和最小公倍数
#include <stdio.h>
int gcd(int a, int b) // 求最大公因数
{
int temp;
while (b != 0 ) {
temp = a % b;
a = b;
b = temp;
}
return a;
}
int lcm(int a, int b) //求最小公倍数
{
int gcdValue = gcd(a, b);
return (a * b) / gcdValue;
}
int main() {
int num1, num2;
printf("Enter two numbers: \n");
scanf("%d%d", &num1, &num2);
printf("最大公因数: %d\n", gcd(num1, num2));
printf("最小公倍数: %d", lcm(num1, num2));
}
7.最大公倍数和最小公倍数(递归)
#include <stdio.h>
int gcd(int a, int b) // 求最大公因数
{
if (b == 0) return a;
else return gcd(b, a%b);
}
int lcm(int a, int b) //求最小公倍数
{
int gcdValue = gcd(a, b);
return (a * b) / gcdValue;
}
int main() {
int num1, num2;
printf("Enter two numbers: \n");
scanf("%d%d", &num1, &num2);
printf("最大公因数: %d\n", gcd(num1, num2));
printf("最小公倍数: %d", lcm(num1, num2));
}
8.优雅菱形
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int main() {
//输入行数n
int n;
scanf("%d", &n);
int sx = n / 2, sy = n / 2;
for (int i = 0 ; i < n ; i ++) {
for (int j = 0 ; j < n ; j ++) {
if (abs(sx - i) + abs(sy - j) <= n / 2) printf("*");
else printf(" ");
}
printf("\n");
}
return 0;
}
8.行列转换
#include <stdio.h>
#include <string.h>
int n, t;
int main(void)
{
scanf("%d", &n);
printf("%d的行列式为:\n", n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%d\t", ++t);
}
printf("\n");
}
printf("转置为: \n");
for (int i = 1; i <= n; i++) {
for (int j = 0; j < n; j++) {
printf("%d\t", i+n*j);
}
printf("\n");
}
return 0;
}
9.行列转换(数组版本)
#include <stdio.h>
int n, t;
int main(void)
{
scanf("%d", &n);
int a[n][n];
printf("%d的行列式为:\n", n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
a[i][j] = ++t;
printf("%d\t", a[i][j]);
}
printf("\n");
}
printf("行列转换后:\n", n);
for (int i = 0 ; i < n ; i ++) {
for (int j = 0 ; j < n ; j ++) {
printf("%d\t", a[j][i]);
}
printf("\n");
}
}
10.汉诺塔
#include <stdio.h>
// 声明函数
void hanoi(int n, char A, char B, char C);
int main() {
int n;
printf("请输入汉诺塔的层数:");
scanf("%d", &n);
hanoi(n, 'A', 'B', 'C');
return 0;
}
// 实现函数
void hanoi(int n, char A, char B, char C) {
// 当n为1时,直接将盘子从A柱移动到C柱
if (n == 1) {
printf("%c -> %c\n", A, C);
} else {
// 将上面的n-1个盘子从A柱借助C柱移动到B柱
hanoi(n - 1, A, C, B);
// 将最底下的一个盘子从A柱移动到C柱
printf("%c -> %c\n", A, C);
// 将剩下的n-1个盘子从B柱借助A柱移动到C柱
hanoi(n - 1, B, A, C);
}
}
11.素数筛选法
#include <stdio.h>
#include <stdbool.h>
int main() {
int n = 100;
bool p[n+1];
// 初始化数组元素全部为true,即假设所有数都是素数
memset(p, true, sizeof(p));
// 从2开始筛选素数,直到p^2大于n
for (int i = 2; i * i <= n; i++) {
// 如果p是素数,将p的所有倍数标记为非素数
if (p[i]) {
// 从p^2开始标记,因为小于p^2的倍数已经被标记过了
for (int j = 2; i * j <= n; j ++) {
p[i * j] = false;
}
}
}
// 打印所有素数
for (int i = 2; i <= n; i++) {
if (p[i]) {
printf("%d ", i);
}
}
return 0;
}
12.素数枚举
#include <stdio.h>
#include <stdbool.h>
bool p(int x) {
for (int i = 2 ; i <= x / i ; i ++) {
if (x % i == 0) {
return false;
}
}
return true;
}
int main()
{
int n = 100;
for (int i = 2 ; i <= n ; i ++) {
if (p(i)) printf("%d ", i);
}
}
13.统计字符串*的个数
#include <stdio.h>
#include <string.h>
void fun(char *s, int *t);
int main() {
int t = 0;
char s[] = "abc*def**adgh*kjsdf*";
fun(s, &t);
printf("%d\n", t);
return 0;
}
void fun(char *s, int *t) {
for (int i = 0 ; i < strlen(s); i ++) {
if (s[i] == '*') (*t)++ ;
}
}
14.功能是实现两个字符串连接。
#include <stdio.h>
//手写strcat
char *strcat(char *dest, const char *src) {
char *p = dest;
while(*dest) dest++;
while(*dest++ = *src++);
return p;
}
int main() {
char a[] = "abc", b[] = "dahjdjkas";
strcat(a,b);
printf("%s", a);
return 0;
}
评论区