C程序在inverval中找到越来越多的数字

时间:2017-12-29 09:54:34

标签: c loops numbers

首先,对不起我的英语,如果我的解释不够好。我希望我的代码输出可以帮助您了解它的含义。问题在于,按照我的方式,它只能用于999(3位数字)。我想应该有一个“#34;不关心"有多少位数,只是做了它必须做的事情。

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

4 个答案:

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

答案 1 :(得分: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);
        }
    }
}

您应该决定是否接受一个数字。如果是,请取消注释前两行。

显然,可能增长的最高数字是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)。我很好奇老师如何证明&

答案 2 :(得分:0)

这是问题的可能解决方案。它适用于字符串而不是数字,因此效率较低,但可能更容易理解:

#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

答案 3 :(得分: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;
}