一号 发表于 2015-8-15 09:57:20

【c语言经典问题】

1.冒泡法
#include<stdio.h>
void main()
{
    int i,j,a;
    for(i=0;i<10;i++)
      scanf("%d",&a);

    for(i=0;i<10-1;i++)   
      {//n个数要进行n-1趟比较
      for(j=i+1;j<10;j++)          //每趟比较n-i次
            if(a>a)          //依次比较两个相邻的数,将小数放在前面,大数放在后面
            {
                int t=a;
                a=a;
                a=t;
            }
    }

    for(i=0;i<10;i++)               //输出比较之后的数组
      printf(" %d",a);
}


# include <stdio.h>

int main()
{
      int temp;
      int number = { 25, 4, 9, 6, 5, 4, -4, 3, 2, 1 };

      for (int i = 1; i < 10; i++)//外层循环代表比较次数
      {
                for (int l = 0; l < 10 - i; l++) //两两比较然后大的往后移
                {
                        if (number > number)
                        {
                              temp = number;
                              number = number;
                              number = temp;
                        }
                }
      }

      for (int i = 0; i < 10; i++)
      {
                printf("%d ", number);
      }

      return 0;
}


for(int i=1; i<num.length; i++)                        //外层循环需要比较的次数
{
      for(int l=0; l<num.length-i; l++)            //内层循环需要进行比较的数外层循环每循环一次 内层循环就少一个数 又为了防止l+1时数组越界,-i即可
      {                                                                              
                if(num > num)
                {
                        num   = num ^ num;
                        num = num ^ num;
                        num   = num ^ num;
                }
      }
}

2.猴子吃桃问题:猴子第一天摘下若干个桃子(peach),当即吃了一半,还不过瘾,又多吃了一个.第二天猴子又将第一天剩下的桃子吃掉一半后又多吃了一个.以后每天吃前一天剩下的桃子的一半零一个.到第N天想吃桃子时发现只剩下了一个桃子.
那么问题来了,请问猴子第一天开着挖掘机去摘桃子,摘了多少个!
# include <stdio.h>

int main()
{
      int day, peach;

      while (scanf("%d", &day) != EOF)    //这里的day的值要大于0我没有做输入处理
      {
                peach = 1;

                for (int i = 1; i < day; i++)
                {
                        peach = (peach + 1) * 2;
                }

                printf("%d天前有peach %d个\n", day, peach);
      }

      return 0;
}

3.任意数的次方的后三位数:
# include <stdio.h>

int main()
{
      int num_1, num_2;    // num_1 的 num_2 次方
      int sum = 1;      //定义第三个变量存放结果

      scanf("%d%d", &num_1, &num_2);//输入底数和指数的值

      for (int i = 0; i < num_2; i++)
      {
                sum = num_1 * sum % 1000;//每计算一次取一次余数!
      }

      printf("%03d\n", sum); //输出后3位不住3位用0补足.

      return 0;
}

4.计算某日是该年的第几天
# include <stdio.h>

int main()
{
      int leap(int);//判断是否是闰年的函数声明;
      int number(int, int, int); //求天数的函数声明;

      int year, month, day;

      while (scanf("%d%d%d", &year, &month, &day) != EOF)//输入年月日如 2004 3 1
      {
                printf("%d年%d月%d日是今年的第%d天!\n", year, month, day, number(year, month, day));//输出
      }

      return 0;
}

int leap(int year)   //判断平年闰年的函数
{
      if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) return 1;//判断闰年
      else return 0;
}

intnumber(int year, int month, int day) //求天数的函数
{
      int sum = 0;
      int month_p = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
      int month_r = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

      if (leap(year)) //是闰年返回1, 不是闰年返回0   0为假非0为真
      {
                for (int i = 0; i < month - 1; i++)
                {
                        sum += month_r;
                }
      }
      else
      {
                for (int i = 0; i < month - 1; i++)
                {
                        sum += month_p;
                }
      }

      sum += day;

      return (sum);
}

5.婚礼上的谎言:
             3对情侣参加婚礼,3个新郎分别为A,B,C, 3个新娘分别为X,Y,Z, 有人想知道究竟谁与谁结婚,于是就问新人中的三位,得到如下结果:A说他将和X结婚;X说她的未婚夫是C;C说他将和Z结婚.这人事后知道他们在开玩笑,说的全是假的. 那么,究竟谁和谁结婚呢!
# include <stdio.h>

int main()
{
      int a, b, c;

      for (a = 1; a <= 3; a++)
      {
                for (b = 1; b <= 3; b++)
                {
                        for (c = 1; c <= 3; c++)
                        {
                              if (a != 1 && c != 1 && c != 3 && a != b && a != c && b != c)
                              {
                                        printf("%c将嫁给 A!\n", 'X'+a-1);
                                        printf("%c将嫁给 B!\n", 'X'+b-1);
                                        printf("%c将嫁给 C!\n", 'X'+c-1);
                              }
                        }
                }
      }

      return 0;
}

6.古代数学家张邱建在他的《算经》中提出了一个著名的"百钱买百鸡问题",鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁,母,雏各几何?
# include <stdio.h>

int main()
{
      int coke, hen, chick; //定义三个变量 表示 公鸡 母鸡 鸡雏!

      for (coke = 0; coke <= 20; coke++)
      {
                for (hen = 0; hen <= 33; hen++)
                {
                        for (chick = 0; chick <= 99; chick += 3)
                        {
                              if (coke + hen + chick == 100)
                              {
                                        if (coke * 5 + hen * 3 + chick / 3 == 100)
                                                printf("公鸡:%d母鸡:%d鸡雏:%d\n", coke, hen, chick);
                              }
                        }
                }
      }
      return 0;
}

7.打渔晒网问题:

如果一个渔夫从2011年1月1日开始,三天打渔,两天晒网,编程实现当输入一个2011年1月1日以后的任意一天,输出该渔夫是在打渔还是晒网!
# include <stdio.h>

int main()
{
      int leap(int);
      int number(int, int, int);

      int year, month, day, totaldays;
      scanf("%d%d%d", &year, &month, &day); //未做输入处理 输入的日期必须在2011.1.1之后
      totaldays = number(year, month, day);

      if ((totaldays % 5)<4 && (totaldays % 5) > 0) printf("%d.%02d.%02d在打渔!\n", year, month, day);
      else printf("%d.%02d.%02d在晒网!\n", year, month, day);

      return 0;
}

int leap(int year) // 自定义函数, 判断年份是否是闰年
{
      return ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0));
}

int number(int year, int month, int day) // 计算当前日期距离2011年1月1日 有多少天!
{
      int sum = 0;
      int month_p = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
      int month_r = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

      if (leap(year))//计算当前年份过去了多少天
      {
                for (int i = 0; i < month - 1; i++)
                {
                        sum += month_r;
                }
      }
      else
      {
                for (int i = 0; i < month - 1; i++)
                {
                        sum += month_p;
                }
      }

      for (int i = 2011; i < year; i++) //计算相差年份天数
      {
                if (leap(i)) sum += 366;
                else sum += 365;
      }

      return (sum + day);
}

8.直接插入排序:      

插入排序是把一个记录插入到已排序的有序序列中,使这个序列在插入后仍有序.插入排序中比较简单的排序为直接插入排序,其插入位置的确定方法是将待插入的记录与有序区的各记录自右向左依次比较其关键字值的大小. 本例使用直接插入排序法将测试数组的数据从小打到排序!
# include <stdio.h>

int main()
{
      int temp, swap; //定义结点存储变量和交变量
      int number = { -1, 8, 7, 6, 5, 4, 0, 9, 2, 10 }; //排序测试数据

      for (int i = 1; i < 10; i++)
      {
                int j = i - 1;
                temp = number;
                while (j >= 0 && temp < number)//从已排好序的序列从又向左扫描 知道找到小于temp的值 然后插入这个值的后面位置上
                {
                        number = number;   //将插入位置的值和其后的所有值都往后移动一个位置
                        j--;
                }
                number = temp;   // 将这个需要插入的值插入适当的位置
      }

      for (int i = 0; i < 10; i++)
      {
                printf("%d ", number);//输出排序后的测试数组数据
      }


      return 0;
}

9.快速排序算法
# include <stdio.h>

void qusort(int[], int, int);

int main()
{
      int arr = { 9, 5, 3, 8, 0, 3, 4, 2, 5, 6 }; //定义需要排序的数据

      qusort(arr, 0, 9); //执行排序函数

      for (int i = 0; i < 10; i++)
      {
                printf("%d ", arr); //排序后的数据输出
      }
      putchar('\n');


      return 0;
}

void qusort(int arr[], int begin, int end) //第一个参数为需要排序的数组 第二个参数和第三参数确定 需要排序的数据区间
{
      if (end - begin < 1) return; //元素太少 则不需要排序

      int left = begin;// 左索引
      int right = end;   // 右索引
      int standard = arr;// 基准值

      while (left < right)
      {
                while (left < right && standard < arr) right--; //从右向左 查找小于基准值的索引

                if (left < right) //如果找到了则 left<right否则 left == right
                {
                        arr = arr; //将找到的值放到相应的位置(分界之左)
                        left++; //左位置右移一个索引
                }

                while (left < right && arr <= standard) left++; //从左向右 查找大于基准的值得索引

                if (left < right) //如果找到了则 left<right否则 left == right
                {
                        arr = arr; //将找到的值放入相应的位置(分界之右)
                        right--; //右位置左移一个索引
                }
      }

      arr = standard; //将基准值放置到分界点(分界点是不确定的)

      //递归调用
      qusort(arr, begin, right - 1);//对左区间排序
      qusort(arr, right + 1, end);//对右区间排序

}

10.选择排序
# include <stdio.h>

int main()
{
      int str = { 7, 3, 5, 4, 7, 5, 2, 5, 1, 9 };//定义需要排序的数据

      for (int i = 0; i < 9; i++)//外层循环表示需要打擂台的次数
      {
                for (int k = i + 1; k < 10; k++) //内存循环表示每次都和谁打擂台
                {
                        if (str > str)//如果守擂台者被干掉了 就下场, 也就是交换两个的值
                        {
                              int temp = str;
                              str = str;
                              str = temp;
                        }
                }
      }

      for (int i = 0; i < 10; i++) //输出排序后的数据
      {
                printf("%d ", str);
      }

      return;
}











hmy827124 发表于 2016-3-19 11:57:04

打酱油的啦,飘过赚点海币而已。

2466630099 发表于 2016-7-4 23:20:50

.....................62641bh

譵之伤 发表于 2016-7-19 10:24:34

这个666{:lol:}

rainwan 发表于 2016-7-29 17:13:26

楼主写这个帖子的目的是什么呢
页: [1]
查看完整版本: 【c语言经典问题】