作为一个小白,自己学C的时候就想找些代码练练手,就整理了一些。
1.最大公约数和最小公倍数
复制代码
include
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;
}
//代码效果参考:http://www.zidongmutanji.com/bxxx/324600.html
int r;
r = j%i;
while (r!=0)
{
j = i;
i = r;
r = j%i;
}
m = i;
n = (p*q)/m;
printf("最大公约数为:%d\n最小公倍数为:%d\n", m, n);
return 0;
}
复制代码
2.
将大写字母与小写字母相互转换
复制代码
include
int main(void)
{
char big, small;
big = getchar();
small = big + 32;
putchar(small);
return 0;
}
复制代码
3.约瑟夫环问题
问题描述:
杰克船长想要从 20 个水手中选出一个人做大副,为了公平
起见,所有人围坐成一个圈,依次从 1 ~ 3 循环报数,当
报到 3 时的人退出,最后的人即为大副。如果你想要做大副
你要坐在那个位子?
复制代码
include
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 1) // 判断还剩下一个人
{
for (i=0; i<PERSON_CNT; ++i) // 一个个报数排除
{
if (Person[i] != 0)
{
count++; // 报数循环
if (count == OUT_NUM)
{
// 将出局的人打印出来
printf("No.%-2d Out! \n", 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!\n", Person[i]);
}
return 0;
}
复制代码
杨辉三角
问题描述:
要求程序输出一个由数字组成的等腰三角形,三角形
的两个腰上的数字和顶角上的数字都为以,而三角形
内的每个数字等于它上一行正对的头顶上的两数字的
和。
数学分析结果:
为了使输出结果是等腰三角形,可知道若三角形共有
n 行,则第 i 行之前需要输出的空格数为 n-i-1个。
代码分析:
下面的代码是将数据做了类似与数组的处理,每行的
每个数都是从第 0 行 第 0 个数据开始
复制代码
include
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("\n"); // 每行输出结束后,输出换行
}
return 0;
}
复制代码
5.输出三位数的逆序数
复制代码
include
int main(void)
{
int number_1;
printf("请输入一个三位数:");
scanf("%d", &number_1);
int i, j, k;
i = number_1/100;
j = (number_1 - i100)/10;
k = number_1%10;
int number_2;
number_2 = i + j10 + k*100;
printf("%d", number_2);
return 0;
}
复制代码
6.十进制转化为二进制数
复制代码
include
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("\n转换后的二进制数为:");
for (j=i-1; j>=0; --j) // 逆序输出
{
printf("%d", arry[j]);
if (j%4 == 0 && j != 0) // 每个四位打印分隔符
{
printf(" ");
}
}
printf("\n");
return 0;
}
复制代码
//代码效果参考:http://www.zidongmutanji.com/zsjx/502377.html
生成随机数种子
srand 函数
复制代码
include
include
include
int main(void)
{
srand(time(0));
printf("%ld", 10000 + rand()%90000);
return 0;
}
复制代码
每次运行后产生的结果都不相同。
8.判断某年是否为闰年
复制代码
include
int main(void)
{
int i;
printf("请输入您想要判定的年份:");
scanf("%d", &i);
if (i%4==0 && i%100!=0 ||i%400==0)
printf("%d 年是闰年!\n", i);
else
printf("%d年不是闰年!\n", i);
return 0;
}
复制代码
9.日期转换,将年月日转换成某年的第几天
复制代码
include
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表示跳过一个输
入的字符,如要跳过两个字符,使用&2c /
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天!\n", Year, Month, Day, Year, DayCnt);
return 0;
}
复制代码
10.
取出一个整数的第 k 位
问题描述:即将一个数的二进制数的从右数起的第
k 为二进制数字输出。
复制代码
include
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\n", k);
return 0;
}
复制代码
11.判断一个数字是否为素数
复制代码
include
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是素数!\n", i);
else
printf("%d不是素数!\n", i);
return 0;
}
复制代码
- 矩阵转置 将一个 34 的矩阵转置成一个 43 的矩阵
复制代码
include
include
include
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("\n");
}
for (i=0; i<4; ++i) // 打印转置后的矩阵
{
for (j=0; j<3; ++j)
{
printf("%-4d", arry_2[i][j]);
}
printf("\n");
}
return 0;
}
复制代码
13.九九乘法口诀表
复制代码
include
int main(void)
{
int i, j, k;
for (i=1; i<=9; ++i)
{
for (j=1; j<=i; ++j)
{
k = ji;
printf("%2d %2d = %2d", j, i, k);
}
printf("\n");
}
return 0;
}
复制代码
14.
比赛选手评分
规则:去除最高分和最低分,以剩下的分数的平均分为准。
复制代码
include
// 前置申明
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("\n请输入每个裁判给的分数:");
int j;
for (j=0; j<i; ++j) // 输入裁判评分情况
{
//代码效果参考:http://www.zidongmutanji.com/bxxx/245890.html
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 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;
}
复制代码
- Fibonacci
复制代码
include
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\n", val);
}
return 0;
// 次程序和上一个程序的区别是使用循环和选择将数组替换了
}
复制代码
16.
猴子吃桃问题:
猴子第一天摘了若干个桃子,当即吃了一半零一个,以后每天
都吃剩下的一半零一个,到第十天,准备吃的时候,只剩下了
一个,问最开始猴子摘了多少个桃子。
复制代码
include
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
int main(void)
{
int i, j, k;
printf("请输入您想要操作的数和所操作的位数:");
scanf("%d %d", &i, &j);
k = i&~(1<<j-1);
printf("%o,%o\n", i, k);
return 0;
}
复制代码
- 交换两数的值
复制代码
include
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;
}