2

http://projecteuler.net/index.php?section=problems&id=9であるProjectEuler#9を解決しようとしています。

私はこのコードを調べましたが、ロジックは正しいようです…しかし、ループ内のprintfsでさえも、まったく出力を取得していません。私は(明らかに)C初心者で、高級言語から学ぼうとしています…何が悪いのか教えていただけますか?

#include <stdio.h>

int main(){
    unsigned int a=0, b=0, c=0;
    short int pass=0;
    while(!pass){
        //printf("a = %4d\n", a);
        a++;
        b=a;
        while(!pass){
            b++;
            c=1000-a-b;
            if(b>=c) break;
            if(a*a+b*b==c*c) pass = 1;
        }
    }
    printf("a=%d, b=%d, c=%d, a*b*c=%d, a+b+c=%d\n", a, b, c, a*b*c,a+b+c);
    return 1;
}

本当にありがとう。

編集:さて、上記のように浮動小数点の問題を修正しましたが、何らかの理由で2を超えることはなく、無限にループします。

編集:私はいくつかのバグを修正しましたが、それでも、それは戻りますa=33, b=483, c=484, a*b*c=7714476, a+b+c=1000、それは完全に正しくありません。:(

うわー、私はそれを複雑にしすぎていました。今は動作します。みんな、ありがとう。

4

4 に答える 4

3

==またはを使用して浮動小数点値を比較しないでください!=。浮動小数点数は、あらゆる種類のトリックを実行できます。代わりに、scが整数に近い適切な小さな範囲内にあるかどうかを確認してみてください。

于 2010-06-22T01:05:48.017 に答える
2
if(floor(sc) != sc) continue; // we only want integer values of c

それfloor(sc)は常に に等しくない可能性がありscます。sc は double であるため、それに対する操作によって小さなエラーが発生します。「十分に近い」ことを示す小さな変数を定義してみて、その範囲内にあるかどうかを確認してください。これに関する戦略については、こちらを参照してください。

コードに他の問題があるかどうかはわかりません。

于 2010-06-22T01:04:55.103 に答える
2

Project Euler Problem #9 は平方根も浮動小数点数も必要としません。

于 2010-06-22T01:08:32.407 に答える
1

内側のループの最初のパスで値 'a = 1'、'b = 2' が失敗すると (√5 が整数ではないため)、ループは 'a = 1' および 'b = 3' であり、√10 は整数ではないため失敗します。実際、√(N 2 + 1 2 ) 自体が整数であるゼロ (ループから除外される) 以外に N の値はありません。

したがって、個別の整数値を分離できる範囲を超えるまで、コードは実行され続けます。

'pass' に関連するコードと条件if(b>=c) break;(それ以上) if( (a-- + b-- + c) == 7) pass=1;は完全に不可解です。そこのコードをより明確に書き直してください。それが何をするのかを推測しようとさえしません。「a + b + c」が7以下になるように範囲を制限することを意図していると思いますが、実行したとしても、望ましい効果が得られるとは思いません。

Project Euler のページを参照すると、「a < b < c」および「a + b + c = 1000」となるピタゴラスの 3 要素「a、b、c」を見つけることができます。係数 1000 はプログラムに表示されません。a と b の値が与えられると、関連する c の値が決定されます。

于 2010-06-22T01:15:23.420 に答える