2

私はCでいくつかの便利な関数を書いています。そのうちの1つはですisPalindrome()

数が回文であるかどうかを判断するために考えました、私はすべきです...

  • 配列内のすべての桁を取得します
  • 2つのインデックスで反復します-1つは0から開始し、もう1つは配列カウントまで開始します
  • インデックスが一致している間、配列に添え字を付けながらインデックスをインクリメント/デクリメントし、配列カウントが0になると、回文が発生します(つまり、すべての桁を調べ終えます)。

私が思いついた...

int isPalindrome(int num) {

    int places[100];
    int i = 0;
    while (num > 0) {
        places[i++] = num % 10; 
        num /= 10;
    }

    int j = 0;
    while (i >= 0 && places[j++] == places[--i]) {
    }
    return i == -1;

}

これは一般的にどのように行われるのですか?

私は自分でCを学んでいます。コードがいつコンパイルされ、何かを解決するのに1日もかからないことはわかりますが、正しい方向に進んでいるかどうかを知る専門家の目はありません。

それで、私のコードに関する改善や提案はありますか?

どうもありがとう!

4

4 に答える 4

5

while をループするだけi > jです。一度i <= j、もう一度すべての文字をチェックしているだけです。

于 2010-10-29T01:13:28.657 に答える
2

以下でインライン++--演算子を使用するのは賢いように思えるかもしれませんが:

while (i >= 0 && places[j++] == places[--i]) { 
} 

それらをループ本体のに入れると、コードが読みやすくなります。

while (i >= 0 && places[j] == places[i-1]) { 
    j++;
    i--;
} 

このように、コードの読者は、条件付きテストの値iを変更した場合に発生する可能性のある副作用について考える必要がありません。jコンパイルされたコードの速度に測定可能な影響はおそらくないでしょう(ただし、この関数にとってパフォーマンスが重要な場合は、コンパイラーに確認する必要があります)。

places[-1]また、の場合にアクセスするバグがありますi == 0

于 2010-10-29T01:22:22.950 に答える
1

sprintf「文字列を数字に変換する」ために使用します。

char places[100];
sprintf(places, "%i", num);
i = strlen(places);
于 2010-10-29T02:00:07.657 に答える
1

Javaで

static boolean isPalindrome(String p) {
    return p.equals(new StringBuilder(p).reverse().toString());
}

C++ および C の場合

int IsPalindrome(char *string) {
    int bottom = 0, top;

    top = strlen(string) - 1;
    while(bottom < top && string[bottom] == string[top]) {
        ++bottom;
        --top;
    }
    return (bottom >= top ? 1:0);
}

数値入力に対してこれを行う必要がある場合は、関数itoaを記述する必要があることに注意してください。または (リンク) を使用します。

それが一般的に行われている方法です。これは、10 だけでなく、すべてのベースでも機能します。

于 2010-10-29T02:21:11.297 に答える