2017-12-29 34 views
2

まず、私の英語には申し訳ありません。私のコードの出力が、それが何であるかのアイデアを得るのに役立つことを願っています。問題は、私が作った方法で、最大999(3桁の数字)までしか動かないということです。どのくらいの数字があるのか​​を気にしないでループするべきだと思っています。Cプログラムでは、成長する数字を見つけることができます。

int main(){ 
int n, m, k, digit1, digit2, digit3, p, a = 0; 
do{ 
    printf("Enter m and n (m < n):\n"); scanf("%d %d", &m, &n); 
    if (m < n) { 
     break; 
    } 
    else printf("\Error - m > n! Try again.\n\n"); 
} while (a == 0); 

printf("Output:\n"); 
for (k = m; k <= n; k++){ 
    p = k; 
    do{ 
     digit3 = p % 10; //123 % 10 = 3   13%10 = 3 == p/10 +1 
     digit1 = p/100; //123/100 = 1 
     digit2 = (p/10) % 10; // (123 /10) = 12%10 = 2 
     if (p > 100){ 
      if (digit2 == digit1 + 1 && digit3 == digit2 + 1){ 
       printf("%d ", k); 
      } break; 
     } 
     if (digit3 == ((p/10) + 1)) { 
      printf("%d ", k); 
     } break; 
     p = p/10; 
    } while (p > 0); 
} 
getch(); 
return 0; 
} 

出力例:

Enter m and n (m < n): 
    1 999 
    Output: 
    1 12 23 34 45 56 67 78 89 123 234 345 456 567 678 789 

この出力は正しいです、それはプログラムが何をしているものです。残念ながら、999以上で動作するようにループを作ることはできません。ユーザーが入力した間隔で、各桁が1より大きいすべての数値を出力する必要があります。

+0

あなたのアプローチは、あなたの代わりに配列の個々の変数を使用しているため、拡張できません。配列はここで説明されています:https://en.wikibooks.org/wiki/C_Programming/Arrays_and_strings –

+2

"私のコードの出力があなたの考えを得るのに役立つことを願っています。"いいえ、それはありません。私はあなたの問題を推測したくありません。有効な番号は何ですか?なぜ1は大丈夫、2,3はないのですか?質問を編集して問題をはっきりと明記してください。 –

+0

有効な数字は12 23のように昇順の数字です。 123など –

答えて

2

はここに私のテイクです。問題を部分に分割する:数値が「成長している」かどうかをチェックする関数が必要です。つまり、基数10表現の各桁は、次の10の累乗に対応するものの次のものです。 。 (正式にこのコンセプトを表現するよりも難しい)。

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

bool growing(unsigned int x) 
{ 
    //if (x < 10) 
    // return false; 
    unsigned int last = x % 10 + 1; 
    while (x>0) { 
     unsigned int cur = x % 10; 
     x /= 10; 
     if (cur != last-1) 
      return false; 
     last = cur; 
    } 
    return true; 
} 

int main(void) 
{ 
    unsigned int m = 1; 
    unsigned int n = 123456789; 

    for (unsigned int i = m; i <= n; ++i) { 
     if (growing(i)) { 
      printf("%i ", i); 
     } 
    } 
} 

1桁の数字を受け入れるかどうかを心配する必要があります。はいの場合は、最初の2行のコメントを外します。あなたが後にブレークでわずかに速いバージョンを取得することができ

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

int main(void) 
{ 
    unsigned int m = 1; 
    unsigned int n = 123456789; 

    for (unsigned int i = m; i <= n; ++i) { 
     unsigned int x = i; 
     bool growing = true; 
     //if (x < 10) 
     // growing = false; 
     unsigned int last = x % 10 + 1; 
     while (x>0) { 
      unsigned int cur = x % 10; 
      x /= 10; 
      if (cur != last - 1) 
       growing = false; 
      last = cur; 
     } 

     if (growing) { 
      printf("%i ", i); 
     } 
    } 
} 

:直接ループのために機能を移動無機能バージョン:

明らかに可能な限り最高の成長数は123456789

EDITです設定は偽に成長する。

無駄な怒り:学生が基本的なことを理解できるようになる前に、なぜ人々がI/Oを教えるのか理解できません。機能を教えるのではなく、それを実現することなく1つ(main)を書いて、ポインタについて何も知らずに他の人たち(scanfprintf)を呼び出してください。私は先生がどのように&を正当化するのか興味があります。

+0

を必ず追加してくださいありがとうございます。私たちはまだ関数を研究していないので、自分自身で調べなければならないだろう。 –

+0

@JustSteve "無意味な"バージョンで私の答えを編集しました。他の人が知ることができるように、答えをマークすることを忘れないでください。 –

+0

完了。どうもありがとう! –

2

すべての桁数を一度に把握する必要はありません。 あなたがチェックする必要があるのは最後の数字は、このおそらく

int main(){ 
int n, m, k, digit1, digit2, digit3, p, a = 0; 
do{ 
    printf("Enter m and n (m < n):\n"); scanf("%d %d", &m, &n); 
    if (m < n) { 
     break; 
    } 
    else printf("\Error - m > n! Try again.\n\n"); 
} while (a == 0); 

printf("Output:\n"); 
k = m; 
while(k++ <= n){ 
    int p = k; 
    int flag = 0; 
    int num; 

    while(p > 10){ 
     // Get the last digit 
     // in case of 123 -> 3 
     num = p % 10; 
     // Reduce p by 10 
     // 123 -> 12 
     p = p/10; 
     // check 3 == 12%10 + 1 
     // if this is correct go back to start of the loop 
     // we may have more digits 
     if(num == p % 10 + 1) continue; 
     // So the digits dont match, set the flag 
     // break out of the loop 
     flag = 1; 
     break; 
    }  
    // Outside the loop check the flag and print 
    if(k > 10 && !flag) 
     printf("%d ",k); 
} 
return 0; 
} 
+0

動作していないようです。私はいくつかのものを変更しようとしたが、まだそれを動作させることはできません。 :/ –

+0

@JustSteve何がうまくいかない? – qwn

+0

何も出力しません。 –

0

状の第2の最後の

何かがここで問題に可能な解決策だより1以上であるということです。これは、文字列ではなく数値で動作しますので、あまり効率的ではなく、多分理解しやすいです:

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

int main() 
{ 
    int m, n, i, j; 
    char buf[20], c, last; 
    _Bool ascending; 

    puts("Enter m and n (m < n):"); 
    scanf("%d %d", &m, &n); 
    if (m >= n) { 
     fprintf(stderr, "m must be smaller than n"); 
     exit(EXIT_FAILURE); 
    } 

    puts("Output:"); 
    for (i = m; i < n; i++) { 
     sprintf(buf, "%d", i); 
     ascending = true; 
     last = 0; 
     for (j = 0; buf[j] != 0; j++) { 
      c = buf[j]; 
      if (last != 0 && last != c - 1) { 
       ascending = false; 
       break; 
      } else { 
       last = c; 
      } 
     } 
     if (ascending) { 
      printf("%d ", i); 
     } 
    } 

    return EXIT_SUCCESS; 
} 

しかし、それは少し違って見える出力です:

Enter m and n (m < n): 
1 999 
Output: 
1 2 3 4 5 6 7 8 9 12 23 34 45 56 67 78 89 123 234 345 456 567 678 789 

私は、実際のルールがあるのだろうか、理由2と9の間の数字は、1よりも多かれ少なかれ昇順になっています。

そしてここでは、大きな数の出力です:

Enter m and n (m < n): 
1 10000 
Output: 
1 2 3 4 5 6 7 8 9 12 23 34 45 56 67 78 89 123 234 345 456 567 678 789 1234 2345 3456 4567 5678 6789 
+0

ええ、問題は私も100%出力されていないです。私はルールを説明/翻訳するためのより良い方法を見つけることができませんでした。私はそれが(私の言葉で)やらなければならないことを理解することができず、私は先生に "例えば1234のような数字を出力すべきだ"と頼んだときに尋ねた。最初は何らかの理由で私はそれを出力すべきだと思っていました - たとえば20から40まで、出力する23 24 25 26 27 28 29 34 35 36 37 38 39. –

+0

ルールが完全にはっきりしない限り、私はどのように1が正しくなければならないのか分からず、2から9の数字が正しくないはずです。あるいは、数字が少なくとも2つの数字で構成され、 'if(strlen(buf)<2)continue;'を最初の 'for'ループに追加するだけでルールが満たされると主張できます。編集: '#include ' –

0

は、だからここに算術に基づいて別のバージョンです:

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

_Bool only_consecutive_figures(int number) 
{ 
    int figure, last; 

    for (last = 0; number > 0; number /= 10) { 
     figure = number % 10; 
     if ((last != 0 && last != figure + 1) || figure == 0) { 
      return false; 
     } 
     last = figure; 
    } 

    return true; 
} 

int main() 
{ 
    int m, n, i; 

    puts("Enter m and n (m < n):"); 
    scanf("%d %d", &m, &n); 
    if (m >= n) { 
     fprintf(stderr, "m must be smaller than n"); 
     exit(EXIT_FAILURE); 
    } 

    puts("Output:"); 
    for (i = m; i < n; i++) { 
     if (only_consecutive_figures(i)) { 
      printf("%d ", i); 
     } 
    } 
    putchar('\n'); 

    return EXIT_SUCCESS; 
} 
関連する問題