1

私はPythonの初心者で、MIT 6.00を試してみましたが、提供されているページは割り当てページです。

私はディオファントス方程式の解を見つけなければならない課題2にいますが、数学はそれほど得意ではないので、できる限りそれが何をするのかを理解し、その解を考えようとしました。

これが私が得たものです:

def test(x):
    for a in range(1,150):
        for b in range(1,150):
            for c in range(1,150):
                y = 6*a+9*b+20*c
                if y == x:
                    print "this --> " , a, b, c
                    break
                else : ##this to see how close i was to the number
                    if y - x < 3: 
                        print a, b, c , y

割り当てには、の解決策があると記載されています50, 51, 52, 53, 54, and 55が、残念ながら、スクリプトはの解決策しか取得しません50, 53 and 55

誰かが私のコードの何が悪いのかを説明してくれたら、またはディオファントス方程式をまったく理解していない場合は、割り当てを取得できないので、それが何であるか、そしてその解決策を見つける方法を教えてください。私の頭の中に説明。

ありがとう。

4

9 に答える 9

4

割り当ては言う:

正確にn個のマックナゲットを購入できるかどうかを判断するには、ディオファントス方程式を解く必要があります。6a+ 9b + 20c = nとなるような、a、b、cの 非負の整数値を見つけます。

関数の範囲にゼロを含める必要があるようです。そうすれば、必要なすべての数の解決策を見つけることができます。

于 2012-09-25T14:32:55.503 に答える
3

の解決策

6*a+9*b+20*c = 51

整数ab、、cは、整数0または負の少なくとも1つを持っている必要があります。いくつかの解決策は

6*7 + 9*1 + 20*0 = 51
6*0 + 9*(-1) + 20*3 = 51

割り当ての制約に応じて、可能な係数の中に0または負の数を含める必要があります。

于 2012-09-25T14:27:27.290 に答える
2

51の解決策はです5*9 + 1*6

ヒント:どこにあり20ますか?これは係数にとってどういう意味ですか?

54の解決策はです3*20 + (-1)*6。あなたは残りを理解します。

于 2012-09-25T14:27:17.070 に答える
1

まず、境界分析を有効に活用できます。与えられた

6a + 9b + 20c = n
0 <= a
0 <= b
0 <= c

{a、b、c}のペアを体系的に0に設定して、残りの変数の上限を推測できます。これは私たちに与えます

a <= floor(n / 6)
b <= floor(n / 9)
c <= floor(n / 20)

さらに、戦略を選択した場合(たとえば、c、b、aの順に割り当てる)、たとえば次のように、上限をさらに厳しくすることができます。

b <= floor((n - 20c) / 9)

また、割り当てられる最後の変数は、他の変数の関数である必要があります。それを検索する必要はありません。

于 2012-09-26T07:04:56.713 に答える
1

a、b、cの範囲を0から150まで開始できます。

実際、私も初心者で、MIt6.00から始めました。彼らの問題を読んで、私は150それが取ることができない最大数への限界だと思います。

于 2013-06-13T11:36:20.527 に答える
0

これはPerlのソリューションです。むしろ正規表現を使用したハック。

このブログ投稿に従って、正規表現を使用して代数方程式を解きます。

次のスクリプトを3x+2y + 5z=40に使用できます

#!/usr/bin/perl
$_ = 'o' x 40;
$a = 'o' x 3;
$b = 'o' x 2;
$c = 'o' x 5;
$_ =~ /^((?:$a)+)((?:$b)+)((?:$c)+)$/;
print "x = ", length($1)/length($a), "\n";
print "y = ", length($2)/length($b), "\n";
print "z = ", length($3)/length($c), "\n";

出力:x = 11、y = 1、z = 1

有名な最古のピアノパズルを演奏すると、3つの変数の方程式になります

この方法は、変数が実際に正であり、定数が正であるという条件に適用されます。

于 2013-08-09T01:54:09.530 に答える
0

私があなたから適応させたこれをチェックしてください。それはあなたの問題を解決したようです:

variables=range(0,10)
exams=range(51,56)
for total in exams:
    for a in variables:
        for b in variables:
            for c in variables:
                if total==4*a+6*b+20*c:
                    print a, 'four pieces', b, 'six pieces','and', c ,'twenty pieces', 'for a total of', total
于 2015-01-04T03:45:43.357 に答える
0

ブレーク関数は、最も近いループからのみブレークします。以下のコードは、インジケーターを使用して各ループから抜け出します。

    n = 1     # n starting from 1
    count = 0 # Count + 1 everytime we find a possible value. 
              # Reset = 0 after a non-possible value. 
    notPossibleValue = ()
    while True:
        ind = 0 # become 1 if int solutions were found
        for c in range (0,n/20+1):
            if ind == 1: break 
            for b in range (0,n/9+1):
                if ind == 1: break 
                for a in range (0, n/6+1):
                    if (n-20*c) == (b*9+a*6):
                        count += 1
                        ind = 1                    
                        # print 'n=', n, a,b,c, 'count', count                       
                        break # Break out of "a" loop
        if ind == 0:
            count = 0
            notPossibleValue += (n,)
            # print notPossibleValue, 'count', count
        if count == 6:
            print 'The largest number of McNuggets that cannot be bought in exact quantity is', notPossibleValue[-1]
            break
        n += 1
于 2016-10-25T13:56:56.310 に答える
0
n=1
a=0
b=0
c=0
mcnugget = []
for i in range (n,100):
   for a in range (0,20):
       if  6*a + 9* b +20*c ==i:
           mcnugget.append(i)
           break
       else:
            for b in range (0,12):
                if  6*a + 9* b +20*c ==i:
                    mcnugget.append(i)
                    break
                else:
                    for c in range(0,5):
                        if  6*a + 9* b +20*c ==i:
                            mcnugget.append(i)
                            break
   else:
        if i>8:
            if mcnugget[-1]==mcnugget[-2]+1==mcnugget[-3]+2==mcnugget[-4]+3==mcnugget[-5]+4==mcnugget[-6]+5 and mcnugget[-6]>0 :
                break

mcnugget = set (mcnugget)
mcnugget = list (mcnugget)
count = 0
for z in mcnugget:
   count += 1
   if mcnugget [count]==mcnugget [count-1]+1==mcnugget [count-2]+2==mcnugget [count-3]+3==mcnugget [count-4]+4==mcnugget[count-5]+5:
      biggestN= mcnugget[count-6]
      break
#print (mcnugget)
biggestN = str(biggestN)

print ('Largest number of McNuggets that cannot be bought in exact quantity: <'+ biggestN +'>') 
于 2018-07-18T16:12:36.747 に答える