• I00024 出钱买羽


    《九章算术》属于算经十书中的一部,是中国古典数学专著。这些经典数学专著中,有许多众所周知的问题。现在是计算机无所不在的时代,那些问题与其用数学方法来解,不如用计算机程序来解。这个时代是计算解决问题的时代。


    《九章算术》卷第二 粟米的四十五题和四十六题如下:

    〔四五〕今有出钱六百二十,买羽二千一百翭。欲其贵贱率之,问各几何?答曰:其一千一百四十翭,三翭一钱。其九百六十翭,四翭一钱。
    〔四六〕今有出钱九百八十,买矢簳五千八百二十枚。欲其贵贱率之,问各几何?答曰:其三百枚,五枚一钱。其五千五百二十枚,六枚一钱。

    仔细阅读可以知道,这两个问题几乎是同一类型的,可以用同一个程序来解。

    这两个问题,已知的是钱多少,买了多少东西。所买的东西分贵和贱两种,需要求的是贵和贱的东西各买了多少,其价格各为多少。给2个数,需要求4个数。另外一点,需要假设古代的钱是比较值钱的,1钱可以买多个物品。再一点是,经过试算,钱如果太值钱则可行解就太多了,于是假定1钱最多买10个物品。

    穷举法在这个问题中是非常适用的。贵的物品所用钱数从1钱(循环变量i)开始试算,那么贱的物品所用钱数=所有钱数-贵的物品钱数。贵的物品价格从1开始试到10(循环变量j),贱的物品价格从j+1开始试到10(循环变量k),满足j<k。

    程序如下:

    /*
     * 今有出钱六百二十,买羽二千一百翭。欲其贵贱率之,问各几何?答曰:其一千一百四十翭,三翭一钱。其九百六十翭,四翭一钱。
     *
     * 今有出钱九百八十,买矢簳五千八百二十枚。欲其贵贱率之,问各几何?答曰:其三百枚,五枚一钱。其五千五百二十枚,六枚一钱。
     *
     * 这两个问题出自《九章算术》卷第二粟米的四十五题和四十六题。
     */
    
    #include <stdio.h>
    
    #define MAX_PRICE 10
    
    int main(void)
    {
        int coin, goods, e_coin, c_coin;
        int i, j, k;
    
        while(scanf("%d%d", &coin, &goods) != EOF)
            for(i=1; i<= coin; i++) {
                e_coin = i;
                c_coin = coin - e_coin;
    
                for(j=1; j<=MAX_PRICE; j++) {
                    for(k=j+1; k<=MAX_PRICE; k++) {
                        if(e_coin * j + c_coin * k == goods) {
                            printf("%5d %2d %5d %2d %d+%d=%d %d/%d+%d/%d=%d
    ",
                                   e_coin * j, j, c_coin * k, k,
                                   e_coin * j, c_coin * k, goods,
                                   e_coin * j, j, c_coin * k, k, coin);
                            break;
                        }
                    }
                }
            }
    
        return 0;
    }

    输入两组数据,一是620和2100,二是980和5820,程序运行结果如下:

    620 2100
      380  2  1720  4 380+1720=2100 380/2+1720/4=620
      250  1  1850  5 250+1850=2100 250/1+1850/5=620
      324  1  1776  6 324+1776=2100 324/1+1776/6=620
     1140  3   960  4 1140+960=2100 1140/3+960/4=620
      810  2  1290  6 810+1290=2100 810/2+1290/6=620
      435  1  1665  9 435+1665=2100 435/1+1665/9=620
      896  2  1204  7 896+1204=2100 896/2+1204/7=620
     1500  3   600  5 1500+600=2100 1500/3+600/5=620
     1620  3   480  6 1620+480=2100 1620/3+480/6=620
     1680  3   420  7 1680+420=2100 1680/3+420/7=620
     1716  3   384  8 1716+384=2100 1716/3+384/8=620
     1740  3   360  9 1740+360=2100 1740/3+360/9=620
    980 5820
       12  1  5808  6 12+5808=5820 12/1+5808/6=980
       30  2  5790  6 30+5790=5820 30/2+5790/6=980
       60  3  5760  6 60+5760=5820 60/3+5760/6=980
      120  4  5700  6 120+5700=5820 120/4+5700/6=980
      300  5  5520  6 300+5520=5820 300/5+5520/6=980
      416  2  5404  7 416+5404=5820 416/2+5404/7=980
      780  3  5040  7 780+5040=5820 780/3+5040/7=980
      375  1  5445  9 375+5445=5820 375/1+5445/9=980
     1212  3  4608  8 1212+4608=5820 1212/3+4608/8=980
     1500  3  4320  9 1500+4320=5820 1500/3+4320/9=980
     2020  4  3800  8 2020+3800=5820 2020/4+3800/8=980
     2600  5  3220  7 2600+3220=5820 2600/5+3220/7=980
     2400  4  3420  9 2400+3420=5820 2400/4+3420/9=980
     3750  5  2070  9 3750+2070=5820 3750/5+2070/9=980
     3980  5  1840 10 3980+1840=5820 3980/5+1840/10=980

    《九章算术》卷第二 粟米的四十五题和四十六题给出的解也在上述结果中。

    然而,程序计算出的可行解远多于1个,这是假定1钱最多买10个物品条件下得到的结果。

    
  • 相关阅读:
    C++ <cstring> 里的一些常用函数
    Hadoop_第一次作业
    线性回归理解和应用例子
    条款28 :避免返回handles指向对象内部成分
    条款25 :尽可能延后变量定义式的出现时间
    条款21 :必须返回对象时,别妄想返回其reference
    条款16:成对使用new和delete时要采用相同的形式
    条款22 :将成员变量声明为private
    条款13:以对象管理资源
    条款12:复制对象时勿忘其每一个成分
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564766.html
Copyright © 2020-2023  润新知