适合初学C语言是练习的代码

作为一个小白,自己学C的时候就想找些代码练练手,就整理了一些。

1.最大公约数和最小公倍数

# include <stdio.h>
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);
    return 0;
}
 

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;
 }