Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2538827
  • 博文数量: 308
  • 博客积分: 5547
  • 博客等级: 大校
  • 技术积分: 3782
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-24 09:47
个人简介

hello world.

文章分类

全部博文(308)

分类: C/C++

2011-04-01 08:41:11

    我国古代数学家张丘建在《算经》一书中曾提出过著名的“百钱买百鸡”问题。该问题叙述如下:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,则翁,母,雏各几何?
    根据题目的意思,我们可以很快的列出数学式子:1) 5*x + 3 * y + z / 3 = 100; 2) x + y + z = 100;
从数学的角度我们可以看出,解此方程(三元一次方程),有多个解。由于数量在0-100之间,因此我们可以使用穷举法,解决此问题:
  1. #include <stdio.h>

  2. int accord(int i, int j, int k);

  3. int main(int argc, char *argv[])
  4. {
  5.   int i,j,k;
  6.   printf("the possible plans for buying 100 fowls with 100 yuan are:\n");
  7.   for(i=0; i<21; i++)
  8.     for(j=0; j<34; j++)
  9.       for(k=0; k<101; k++)
  10.         if(accord(i,j,k))
  11.            printf("cock = %d, hen = %d, chicken = %d\n",i,j,k);

  12.   return 0;
  13. }

  14. int accord(int i, int j, int k)
  15. {
  16.   if(5 * i + 3 * j + k / 3 == 100 && k % 3 == 0 && i + j + k == 100)
  17.     return 1;
  18.   else
  19.     return 0;
  20. }
    上面看到到循环的终止变量21,34,101.可能有些人不理解。其实书上的都是小于等于100的,但我们动脑筋想一下就可以明白了,拿100前最多可以买20鸡翁、买33鸡母,而题目的要求一共需要100,因此鸡雏最大值也就是100了。而因为我用的是小于,因此就在此基础上进行了加一操作。
    其实这道题,仔细想来还可以进行优化,我们细细想来。如果我们确定了可以根据每次穷举鸡翁的数量,可以确定鸡母的数量,当确定鸡母的数量时,我们也可以确定鸡雏的数量。根据此思想,编写代码如下:
  1. #include <stdio.h>

  2. int accord(int i, int j, int k);

  3. int main(int argc, char *argv[])
  4. {
  5.   int i,j,k;
  6.   int temp_0,temp_1,temp_2;
  7.   printf("the possible plans for buying 100 fowls with 100 yuan are:\n");
  8.   temp_0 = 100 / 5 + 1;
  9.   for(i=0; i<temp_0; i++)
  10.   {
  11.     temp_1 = (100 - 5*i)/3 + 1;
  12.     for(j=0; j<temp_1; j++)
  13.     {
  14.       temp_2 = 100 - i - j + 1;
  15.       for(k=temp_2; k>=0; k--)
  16.       {
  17.         if(accord(i,j,k))
  18.            printf("cock = %d, hen = %d, chicken = %d\n",i,j,k);
  19.       }
  20.     }
  21.   }
  22.   return 0;
  23. }

  24. int accord(int i, int j, int k)
  25. {
  26.   if(5 * i + 3 * j + k / 3 == 100 && k % 3 == 0 && i + j + k == 100)
  27.     return 1;
  28.   else
  29.     return 0;
  30. }
两个程序的运算结果都一样,执行结果如下:
peng@ubuntu:/media/XIAOPENG_U$ ./a.out 
the possible plans for buying 100 fowls with 100 yuan are:
cock = 0, hen = 25, chicken = 75
cock = 4, hen = 18, chicken = 78
cock = 8, hen = 11, chicken = 81
cock = 12, hen = 4, chicken = 84

阅读(3970) | 评论(1) | 转发(0) |
0

上一篇:三色球问题

下一篇:判断回文数字

给主人留下些什么吧!~~

owinux2011-04-01 09:20:55

hao   文