【问题标题】:C program to print all numbers with different digits in intervalC程序打印间隔中具有不同数字的所有数字
【发布时间】:2018-01-12 19:03:50
【问题描述】:

我需要用 C 语言编写一个程序,输出用户输入的间隔中具有不同数字的所有数字。这是我想出的。

#include<stdio.h>

int main(){
int n, m, k = 0, p, flag, last, temp;
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 (k == 0);

printf("Numbers are:\n");
for (k = m; k <= n; k++) {
    p = k;
    flag = 0;
    if (p < 10) {
        flag = 1;
    }
    last = (p / 10) % 10 ;
    while (p > 0) {
        temp = p % 10; 
        p = p / 10; 
        if (temp == last ){ 
            flag = 1;                                              
        }
        last = temp; 
    }
    if (flag != 1) { 
        printf("%d ", k);
    }
}
getch();
return 0;
}

示例输出:

Enter m and n (m < n):
100 130
Numbers are:
101 102 103 104 105 106 107 108 109 120 121 123 124 125 126 127 128 129 130

所以在这种情况下的问题是它输出 101 和 121。它不应该因为它们有两个相同的数字。我该如何解决?

【问题讨论】:

  • 很明显,templast 您只是将每个数字与之前的数字进行比较。您必须将每个数字与 all 其他数字进行比较。有很多方法可以做到这一点。
  • ...比如一个有 10 个元素的状态数组。

标签: c loops numbers


【解决方案1】:

我相信这就是您正在寻找的解决方案。如果将数字转换为字符串,则更容易检查它们的数字。请注意,序列中的每个数字都需要两个循环。它很简洁,但仍然很昂贵。 (使用标志-std=c11编译它。)

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

int main()
{
    printf("Enter two non-negative numbers in ascending order:\n");
    int min, max;
    scanf("%d %d", &min, &max);

    while(min < 0 || max < 0 || min > max)
    {
        printf("Invalid input! Please enter two non-negative numbers in ascending order:\n");
        scanf("%d %d", &min, &max);
    }

    printf("The numbers without repeated digits in the interval [%d, %d] are:\n", min, max);

    for(int n = min; n <= max; ++n)
    {
        char digits[32];
        sprintf(digits, "%d", n);

        int repeated = 0;
        for(int i = 0; digits[i] && !repeated; ++i)
        {
            for(int j = i + 1; digits[j]; ++j)
            {
                if(digits[i] == digits[j])
                {
                    repeated = 1;
                    break;
                }
            }
        }
        if(!repeated) printf("%d ", n);
    }

    printf("\n");
    return 0;
}

【讨论】:

  • 我们还没有研究如何使用函数所以我不太明白这个:/
  • 谈论您已经学过的知识或未学过的知识:您是否查看过教科书或其他课程材料的最新章节?它可能拥有完全可用的工具,可以按照老师的期望来解决这个问题。
  • 只是史蒂夫,我用不进行函数调用的代码编辑了我的答案。我建议您看一下并将其与您的解决方案进行比较,找出差异。
【解决方案2】:

终于成功了!

int main(){
int n, m, k = 0, p = 0, flag, i = 0, j, dig[10];
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 (k == 0);

printf("Numbers in the interval [%d, %d] are:\n", m, n);
for (k = m; k <= n; k++){
    p = k;
    flag = 0;
    dig[i] = 0;
    i = 0;
    if (p < 10){ 
        continue;
    }   
    while (p > 0){ 
        dig[i] = p % 10;
        p = p / 10;
        i++;
    }
        dig[i] = -1;
        for (i = 0; dig[i] > -1; i++){ 
            for (j = i + 1; dig[j] > -1; j++){ 
                if (dig[i] == dig[j]){ 
                    flag = 1;
                }
            }
        }

        if (flag == 0){
            printf("%d\t", k);
        }
    }
getch();
return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多