0

私は Project Euler の問題 4 の解決策に行き詰まっています。次のコードは機能するはずであり、調査して発見した問題の解決策を反復処理します (993*913):

// Michael Clover
// Project Euler
// Problem 4

/* A palindromic number reads the same both ways. The largest palindrome made from the    product of two 2-digit numbers is 9009 = 91  99.

Find the largest palindrome made from the product of two 3-digit numbers. */

#include <iostream>
#include <string>
#include <sstream>
#include <cstdlib>

using namespace std;

bool achieved = false; // change to true when the palindrome is found
string string_conversion = "";
string first_half = ""; // first half of string
string second_half = ""; // second half of string
stringstream conversion; // use this to convert integers to strings

int check(string first_half, string second_half) {
    if (first_half.compare(second_half) == 0) {
        achieved = true;
        return 0;
    }
    else {
        return 0;
    }
    return 0;
}

int convert(int result) {
    char temp;
    conversion << result;
    conversion >> string_conversion;
    if (string_conversion.size() == 6) {
        temp = string_conversion.at(0);
        //cout << "temp = " << temp << endl;
        first_half+=(temp);
        temp = string_conversion.at(1);
        //cout << "temp = " << temp << endl;
        first_half+=(temp);
        temp = string_conversion.at(2);
        //cout << "temp = " << temp << endl;
        first_half+=(temp);
        temp = string_conversion.at(5);
        //cout << "temp = " << temp << endl;
        second_half+=(temp);
        temp = string_conversion.at(4);
        //cout << "temp = " << temp << endl;
        second_half+=(temp);
        temp = string_conversion.at(3);
        //cout << "temp = " << temp << endl;
        second_half+=(temp);
        //cout << first_half << second_half << endl;
        check(first_half, second_half);
    }
    //if (string_conversion.size() == 5) {
        //cout << "The size of the string is 5" << endl;
        //exit(1);
    //}
    string_conversion = "";
    cout << first_half << endl;
    cout << second_half << endl;
    first_half.clear();
    second_half.clear();
    conversion.clear();
    conversion.str("");
    //cout << "conversion: " << conversion << endl;
    return 0;
}

int iterate(int operator_one, int operator_two) { // takes two numbers and iterates     through them, each time it is iterated, the result is passed to the convert    function to convert to string
    int two = operator_two;
        for (int i = operator_one; i > 100; i--) {
            int result = i * two;
            cout << i << "x" << two << endl;
            convert(result);
        }
    return 0;
}

int main() { // Use the stringstream to convert the numerical values into strings     which you can then use to check if they are palindromes
    int operator_one = 999;
    int operator_two = 999;
    while (achieved == false) {
        for (int i = operator_two; i > 100; i--) {
            iterate(999, i);
        }
    }
    cout << "The largest palindrome made from the product of two 3-digit numbers is: "     << string_conversion << endl;
    return 0;
}

このプログラムは、999x999 までのすべての数値を下方向に繰り返し処理し、6 桁の数値を 2 つの文字列に分割して、結果の後半部分を後ろから前に並べます。実行時に cout << を使用してコンソールに示されているように、プログラムは 993*913 を試行し、second_half 文字列と first_half 文字列の両方に 906 が含まれています。次に、プログラムがすべきことは、check(string first_half, string second_half) 関数を実行することです。これを繰り返し、両方の文字列が一致すると判断した後 (さまざまな情報源によると 0 を返す必要があります)、check() 内で if ステートメントを開始し、達成されたブール値を true に設定して、メイン ステートメント内でプログラムを終了し、結果を出力します。プログラムを終了する前に。ただし、これは行われません。これが私の問題です。助けてくれてありがとう。

4

1 に答える 1

0

このコードに見られる他のいくつかの問題は別として、終了の問題は、外側のループが終了したachieved にのみチェックするためだと思いますmain()。したがって、内側のループ ( iterate()) は 100 を下回るまで続き、その後、終了条件を実際に確認する前にoperator_one外側のループが 100 を下回るまで続きます。operator_two

于 2012-07-03T01:41:56.313 に答える