2016-07-15 14 views
0

数字の2つの回文を計算する1つのアルゴリズムをプログラムしなければならない小さなプロジェクトが1つあります。 例:入力が367の場合、結果は367763と763367です。数字の2つの回文を計算する

数字が回文かどうかを確認する方法は分かります。しかし、私は2つの回文を作成する必要があり、それは少し異なり、私は答えを見つけることができません。

私はプログラミングで何かを学ぶためにホッピングしているnoobの男ですが、私は既に問題を解決しようとしていて、多くを探しました。

#include <stdio.h> 
int main() 
{ 
    int num, reverse_num=0, remainder,temp; 
    printf("Enter an integer: "); 
    scanf("%d", &num); 
    temp=num; 
    while(temp!=0) 
    { 
     remainder=temp%10; 
     reverse_num=reverse_num*10+remainder; 
     temp/=10; 
    } 
    if(reverse_num==num) 
     printf("%d is a palindrome number",num); 
    else 
     printf("%d is not a palindrome number",num); 
    return 0; 
} 
+1

ヒントです:番号が既に回文である場合、唯一の有効な回文はそれから作ることができる:元。 '121 - > 121121'はあなたが求める方法です。それで、あなたはすでに半分で済んでいます。 ( - : – user3078414

+1

)数値を文字列に変換してから操作する方が簡単です – stackptr

+2

@ user3078414:既に提案されている途中で、残りの半分を提案します。 – user1336087

答えて

1

あなたのコードが既にnumreverse_numの両方を持っています。ここ

は数が回文であるかどうかを確認するために私のコードです。 if elseステートメントで、順番に印刷するだけです。それは「即時の満足」です。

if(reverse_num==num) { 
    printf("palindrome1 = palindrome2 = %d%d\n", num, num); 
}else{ 
    printf("palindrome1 = %d%d\n",num, reverse_num); 
    printf("palindrome2 = %d%d\n",reverse_num, num); 
} 

あなたが本当に実際の整数として回文を計算したい場合は代わりに、それはコードの数行です。我々は簡単にここにコードを投稿することができ... reverse_numを計算しながら、小数点以下を追跡するため1つのカウンタを追加しますが、それはCを学んで良いと簡単な運動だとあなたはあなたであれば、それの多くを得るでしょう自分でやってください。

他の答えとコメントが示唆するように、もちろん結果を達成する他の方法があります。この回答はコード入力に基づいています。

してくださいは、また、フォームa*10^nの番号、またはより一般的に… + 0*10^0が、少なくとも彼らはOPで定義されているかという点で、いくつかの「驚くほど見て」回文をもたらす可能性があることに注意してください。

1

ここにあります。

#include <stdio.h> 

struct palindrome_pair 
{ 
    unsigned long long int first; 
    unsigned long long int second; 
}; 

struct palindrome_pair build_palindrome(unsigned int x) 
{ 
    const unsigned int Base = 10; 
    struct palindrome_pair palindrome = { x, 1 }; 

    unsigned int y = 0; 

    for (unsigned int value = x; value != 0; value /= Base) 
    { 
     y = Base * y + value % Base; 

     palindrome.first *= Base; 
     palindrome.second *= Base; 
    } 

    palindrome.first += y; 
    palindrome.second = palindrome.second * y + x; 

    return palindrome; 
} 

int main(void) 
{ 
    unsigned int x = 367u; 

    struct palindrome_pair palindrome = build_palindrome(x); 

    printf("%u:\t%llu\t%llu\n\n", x, palindrome.first, palindrome.second); 

    const unsigned int N = 20; 

    for (unsigned int i = 0; i <= N; i++) 
    { 
     palindrome = build_palindrome(i); 

     printf("%u:\t%llu\t%llu\n", i, palindrome.first, palindrome.second); 
    } 

    return 0; 
} 

プログラムの出力は

367: 367763 763367 

0: 0 0 
1: 11 11 
2: 22 22 
3: 33 33 
4: 44 44 
5: 55 55 
6: 66 66 
7: 77 77 
8: 88 88 
9: 99 99 
10: 1001 110 
11: 1111 1111 
12: 1221 2112 
13: 1331 3113 
14: 1441 4114 
15: 1551 5115 
16: 1661 6116 
17: 1771 7117 
18: 1881 8118 
19: 1991 9119 
20: 2002 220 
+0

大型の' unsigned'を除き、すべての言語でうまくいく良い算術解法 – chux

+0

110と220は末字のゼロであることを確認して先行ゼロを追加するか、それらのエントリを削除してください。 – hymie

+0

@hymieそれはあなたがどのように数字を生成するかによって異なります。 –

関連する問題