2016-10-26 12 views
1

私は初心者です。私は偶数桁の数字だけを生成するプログラムを作成しようとしています。偶数 - beginner

例:

135 - > 200
2700 - > 2800

のみ1の番号刻み、私は1つのコードを持っているが、私はそれを印刷しようとするたびに理由I whileループで印刷してください。しかし、ループから印刷しようとするたびに、私はそれを分かりません。

ここでコードを確認してください。

#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    int a = 135; 
    int cifra; 
    int i = a; 
    int n; 

    while (i != 0) { 
     cifra = i % 10; 
     n = cifra; 

     if (n % 2 == 0) { 
      i /= 10; 
     } else { 
      ++a; 
     } 
    } 
    return 0; 
} 
+2

問題を具体的に教えてください。正確に何をしたいですか?あなたのコードにprintステートメントを含めてください。 – bane19

+0

まずはこれは無限ループです&私はあなたのためにどのように働いているのですか?正確に何が必要なのか正確な情報を教えてください。 –

+1

私が言ったように、私の目標は、EVEN番号からのみ作られる "a"よりも大きい最も近い番号を印刷することです。この場合、a = 135となり、結果として、200を得るはずです。なぜなら、2、0、0は偶数であるからです。結果が1900だったら私は2000年だったはずです。printステートメントは含まれていませんでした。なぜなら、どこに正確に置くべきかわからないからです。$ –

答えて

3

簡単な方法です:

  • は、最下位から各桁をご確認ください最も重要なものに;すべての奇数桁の
  • xx1yyyのパターンがxx2000なり、x9yyyのパターンがXが奇数であってもよいし、次の反復で処理されるX0000なる10の対応する電力の次の倍数に番号をバンプ。上記方法が原因電位オーバーフローの全ての符号なし値に対して動作しないこと

    #include <stdio.h> 
    #include <stdlib.h> 
    
    unsigned next_even(unsigned n) { 
        for (unsigned div = 1; div <= n; div *= 10) { 
         unsigned digit = (n/div) % 10; 
         if (digit & 1) { 
          /* found an odd digit, bump number up to the 
           next multiple of div */ 
          n = n - n % div + div; 
         } 
         if (div > UINT_MAX/10) { 
          /* Prevent wrap around. 
           The result may be incorrect for numbers >= UINT_MAX/10. */ 
          break; 
         } 
        } 
        return n; 
    } 
    
    int main(int argc, char *argv[]) { 
        for (int i = 1; i < argc; i++) { 
         unsigned n = strtoul(argv[i], NULL, 0); 
         printf("%u -> %u\n", n, next_even(n)); 
        } 
        return 0; 
    } 
    

    注:ここ

コードです。

+0

ニースとクリーン。私はそれがテキストの記述から利益を得ると思う。アルゴリズムは、初心者のために明確ではないかもしれません。 –

+0

'2888896456'では失敗し、ラップアラウンドでなければなりません。 「4000000000」は32の符号なしビットで表現可能である。 – 2501

+1

@ 2501:正しい!数がUINT_MAXに近すぎるとアルゴリズムが失敗します。それを修正することで、コードを読みにくくすることができます。 – chqrlie

0

これは参考になる場合があります。番号で始まり、すべての数字が偶数であるかどうかを確認します。もしそうなら、それはループから出て、値を出力します。それ以外の場合は、数値をインクリメントして同じことを繰り返します。無限ループのようなものです。あなたはここ10

のいくつかの力によって、奇数判定を伝播する必要があるかもしれないので、あなたのソリューションが動作しません

int value = 123; 
while (value > 0) 
{ 
    int digit = value % 10; 
    if(digit%2 == 0) 
    { 
     flag =true; 
    } 
    else 
    { 
    flag = false; 
    value = value + 1; 
    continue; 
    } 
    value /= 10; 
} 
printf("Value = %d",Value) 
+0

あなたのコードは、質問に答えることができません、タイプミスを修正した後、常に 'Value = 0'を出力します。 – chqrlie

+0

アプローチが完全に間違っている、または改善されている、それは修正することができますか? – bane19

+0

あなたのアプローチは、出力値を段階的に計算して、奇数を適切に処理すると、そこに到達するように改善することができます。 – chqrlie

1

皆さん、私を助けてくれてありがとうございましたが、私はこの問題について自分自身で解決策を得ることができました。

#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    int a; 
    scanf("%d", &a); 
    while (a > 0) { 
     a++; 
     int n = a; 
     int cifra; 
     int flag = 0; 

     while (n > 0) { 
      cifra = n % 10; 
      if (cifra % 2 == 0) { 
       flag = 1; 
       n = n/10; 
      } else { 
       flag = 0; 
       break; 
      } 
     } 
     if (flag) { 
      printf("%d", a); 
      return 0; 
     } 
    } 
    return 0; 
} 
+1

このソリューションは無差別な力を使用しますが、多くの場合ゆっくりとしていますが、ほとんどの整数で使用できます。 'while(a> 0)'はオーバーフローの適切なテストではないことに注意してください。 'a ++'が 'int'型の範囲をオーバーフローした場合、動作は未定義です。 – chqrlie