作为一个小白,自己学C的时候就想找些代码练练手,就整理了一些。
1.最大公约数和最小公倍数
int main(void)
{
int i, j;
int p, q;
int m, n;
printf("请输入您想要操作的两个数:");
scanf("%d %d", &p, &q);
i = p;
j = q;
// 将较小的数放在 i, 较大的数放在 j
int temp;
if (i>j)
{
temp = j;
j = i;
i = temp;
}
int r;
r = j%i;
while (r!=0)
{
j = i;
i = r;
r = j%i;
}
m = i;
n = (p*q)/m;
printf("最大公约数为:%d 最小公倍数为:%d ", m, n);
}
2.
将大写字母与小写字母相互转换
# include <stdio.h> int main(void) { char big, small; big = getchar(); small = big + 32; putchar(small); return 0; }
3.约瑟夫环问题
问题描述:
杰克船长想要从 20 个水手中选出一个人做大副,为了公平
起见,所有人围坐成一个圈,依次从 1 ~ 3 循环报数,当
报到 3 时的人退出,最后的人即为大副。如果你想要做大副
你要坐在那个位子?
# include <stdio.h> # define PERSON_CNT 20 # define OUT_NUM 3 int main(void) { int Person[PERSON_CNT] = {0}, count, PersonOut; int i; // 为每个人编号,编号是下标加 1 for (i=0; i<PERSON_CNT; ++i) Person[i] = i + 1; // 记录报数的人的人数 PersonOut = PERSON_CNT; count = 0; while (PersonOut > 1) // 判断还剩下一个人 { for (i=0; i<PERSON_CNT; ++i) // 一个个报数排除 { if (Person[i] != 0) { count++; // 报数循环 if (count == OUT_NUM) { // 将出局的人打印出来 printf("No.%-2d Out! ", Person[i]); Person[i] = 0; // 将编号设置为 0 count = 0; // 将计数器归零 PersonOut--; } } } } for (i=0; i<PERSON_CNT; ++i) { if (Person[i] != 0) printf("The last person is No.%-2d! ", Person[i]); } return 0; }
4. 杨辉三角
问题描述:
要求程序输出一个由数字组成的等腰三角形,三角形
的两个腰上的数字和顶角上的数字都为以,而三角形
内的每个数字等于它上一行正对的头顶上的两数字的
和。
数学分析结果:
为了使输出结果是等腰三角形,可知道若三角形共有
n 行,则第 i 行之前需要输出的空格数为 n-i-1个。
代码分析:
下面的代码是将数据做了类似与数组的处理,每行的
每个数都是从第 0 行 第 0 个数据开始
# include <stdio.h> int main(void) { int i, n, r, j, s; printf("请输入您想要输出的行数:"); scanf("%d", &n); for (i=0; i<n; ++i) // 控制行的循环 { for (j=0; j<=n-1-i; ++j) // 控制每行前面要输出的空格 printf(" "); // 里面是两个空格。 for (r=0; r<=i; ++r) // 控制每一行的每个数字的输出{ { s = 1; // 每个数据都相当于 i 个数中取 r 的数的组合数,求组合数的值 for (j=0; j<=r; j++) // 求组合数 if (j!=0) // 每行第零个数都是 1 s = s * (i-r+j) / j; printf("%4d", s); // 输出第 i 行的第 r 个数 } printf(" "); // 每行输出结束后,输出换行 } return 0; }
5.输出三位数的逆序数
# include <stdio.h> int main(void) { int number_1; printf("请输入一个三位数:"); scanf("%d", &number_1); int i, j, k; i = number_1/100; j = (number_1 - i*100)/10; k = number_1%10; int number_2; number_2 = i + j*10 + k*100; printf("%d", number_2); return 0; }
6.十进制转化为二进制数
# include <stdio.h> # define N 16 // 两个字节 int main(void) { unsigned int decimal; // 定义无符号十进制数 int arry[N], i, j; printf("请输入您想要转换的数:"); scanf("%d", &decimal); i = 0; do { arry[i] = decimal%2; ++i; decimal /= 2; } while (decimal); printf(" 转换后的二进制数为:"); for (j=i-1; j>=0; --j) // 逆序输出 { printf("%d", arry[j]); if (j%4 == 0 && j != 0) // 每个四位打印分隔符 { printf(" "); } } printf(" "); return 0; }
7. 生成随机数种子
srand 函数
# include <stdio.h> # include <time.h> # include <stdlib.h> int main(void) { srand(time(0)); printf("%ld", 10000 + rand()%90000); return 0; }
每次运行后产生的结果都不相同。
8.判断某年是否为闰年
# include <stdio.h> int main(void) { int i; printf("请输入您想要判定的年份:"); scanf("%d", &i); if (i%4==0 && i%100!=0 ||i%400==0) printf("%d 年是闰年! ", i); else printf("%d年不是闰年! ", i); return 0; }
9.日期转换,将年月日转换成某年的第几天
# include <stdio.h> int main(void) { int DayTab[2][12] = { {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} }; // 使用一个二维数组储存闰年和非闰年的每月的天数 int Year, Month, Day, DayCnt, Leap, i; printf("请按照年月日的顺序输入日期:"); // 获取日期 scanf("%d%*c%d%*c%d", &Year, &Month, &Day); /* 由于无法保证用户输入日期的格式,使用%*c表示跳过一个输 入的字符,如要跳过两个字符,使用&2*c */ DayCnt = Day; // 判断是否为闰年 Leap = Year%4 == 0 && Year%100 != 0 || Year%400 == 0; for (i=0; i<Month-1; ++i) { DayCnt += DayTab[Leap][i]; } printf("%d年%d月%d日是%d年的第%d天! ", Year, Month, Day, Year, DayCnt); return 0; }
10.
取出一个整数的第 k 位
问题描述:即将一个数的二进制数的从右数起的第
k 为二进制数字输出。
# include <stdio.h> int main(void) { int i, j, k; printf("请输入您想要操作的数:"); scanf("%d", &i); printf("请输入您想要拿出的位数:"); scanf("%d", &j); i >>= j-1; // 将 i 向右移动 j-1 位 k = i&1; // 按位与运算 printf("%d ", k); return 0; }
11.判断一个数字是否为素数
# include <stdio.h> int main(void) { int i, j; printf("请输入您想要判定的数:"); scanf("%d", &i); for (j=2; j<i; ++j) { if (i%j == 0) break; } if (j == i) printf("%d是素数! ", i); else printf("%d不是素数! ", i); return 0; }
12. 矩阵转置 将一个 3*4 的矩阵转置成一个 4*3 的矩阵
# include <stdio.h> # include <time.h> # include <stdlib.h> int main(void) { srand(time(0)); // 生成随机数种子 int arry_1[3][4], arry_2[4][3]; int i, j; for (i=0; i<3; ++i) for (j=0; j<4; ++j) { arry_1[i][j] = rand()%100; // 生成随机数 } for (i=0; i<3; ++i) for (j=0; j<4; ++j) { arry_2[j][i] = arry_1[i][j]; // 矩阵转置 } for (i=0; i<3; ++i) // 打印原矩阵 { for (j=0; j<4; ++j) { printf("%-4d", arry_1[i][j]); } printf(" "); } for (i=0; i<4; ++i) // 打印转置后的矩阵 { for (j=0; j<3; ++j) { printf("%-4d", arry_2[i][j]); } printf(" "); } return 0; }
13.九九乘法口诀表
# include <stdio.h> int main(void) { int i, j, k; for (i=1; i<=9; ++i) { for (j=1; j<=i; ++j) { k = j*i; printf("%2d * %2d = %2d", j, i, k); } printf(" "); } return 0; }
14.
比赛选手评分
规则:去除最高分和最低分,以剩下的分数的平均分为准。
# include <stdio.h> // 前置申明 double MAX(double *, int); double MIN(double *, int); int main(void) { int i; // 裁判人数 double sum = 0, ave, max, min, score[i]; // 数据代表 总分,平均分,最高分,最低分,每个裁判各处的分数 printf("请输入裁判人数:"); scanf("%d", &i); printf(" 请输入每个裁判给的分数:"); int j; for (j=0; j<i; ++j) // 输入裁判评分情况 { scanf("%lf", &score[j]); } max = MAX(score, i); //求出最高分 min = MIN(score, i); //求出最低分 for (j=0; j<i; ++j) { sum += score[j]; } ave = (sum - min - max) * (1.0/(i - 2)); printf("选手总分为:%lf,选手平均得分为:%lf", sum, ave); return 0; } // 求最大值 double MAX(double * a, int i) { double max; for (int j=0; j<i-1; ++j) { if (a[j] > a[j+1]) max = a[j]; else max = a[j+1]; } return max; } // 求最小值 double MIN(double * a, int i) { double min; for (int j=0; j<i-1; ++j) { if (a[j] < a[j+1]) min = a[j]; else min = a[j+1]; } return min; }
15. Fibonacci
# include <stdio.h> int main(void) { int i, j, k; int val; i = 1; j = 1; for (k = 1; k <= 20; ++k) { if (1 == k) val = i; else if (2 == k) val = j; else { val = i + j; i = j; j = val; } printf("%d ", val); } return 0; // 次程序和上一个程序的区别是使用循环和选择将数组替换了 }
16.
猴子吃桃问题:
猴子第一天摘了若干个桃子,当即吃了一半零一个,以后每天
都吃剩下的一半零一个,到第十天,准备吃的时候,只剩下了
一个,问最开始猴子摘了多少个桃子。
# include <stdio.h> int main(void) { int i, sum = 1; for (i=0; i<9; ++i) { sum = (sum+1) * 2; } printf("%d", sum); return 0; }
17.将一个整数的二进制表示的第 k 位清零
# include <stdio.h> int main(void) { int i, j, k; printf("请输入您想要操作的数和所操作的位数:"); scanf("%d %d", &i, &j); k = i&~(1<<j-1); printf("%o,%o ", i, k); return 0; }
18. 交换两数的值
# include <stdio.h> int main(void) { int i, j, temp; printf("请输入两个需要被交换的数:"); scanf("%d %d", &i, &j); temp = i; i = j; j = temp; printf("%d, %d", i, j); return 0; }