簡體   English   中英

用C程序查找一個不斷增長的數字

[英]C program to find growing numbers in an inverval

首先,對不起我的英語,如果我的解釋不夠好。 希望我的代碼輸出可以幫助您了解它的含義。 問題是,按照我的方式,它只能在999(3位數字)以下使用。 我猜應該有一個“不在乎”有多少位數的循環,它只是做了必須要做的事情。

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)。

您不需要一次跟蹤所有數字。 您需要檢查的是最后一位比第二位多一位

像這樣的東西

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;
}

這是我的看法。 將問題分成幾部分:您需要一個函數來檢查數字是否在“增長”,這意味着以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);
        }
    }
}

您應該確定是否接受一個數字。 如果是,請取消注釋前兩行。

顯然,最高的增長數字是123456789。

編輯:無功能的版本,直接將函數移到for循環中:

#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);
        }
    }
}

設置為false后,您可能會得到一個稍快的版本,但會出現中斷。

無用的咆哮 :我不明白為什么人們在學生了解基本知識之前就繼續教I / O。 不是教學的功能,但是寫一個( main )沒有意識到這一點,並呼吁其他( scanfprintf ,無需了解任何指針)。 我很好奇老師如何證明&

這是該問題的可能解決方案。 它使用字符串而不是數字,因此效率較低,但可能更易於理解:

#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

所以這是基於算術的另一個版本:

#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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM