c语言入门实例112

用给定的位数和求最小数s,这样它中的所有数字都是不同的(即所有数字都是唯一的)。
例如 s=20;20=3+8+9;输出就为389.
我想问问以下代码错在了哪个地方,完成这个不是目的,找到错误才是,希望各位帮我找一下错


#include<stdio.h>
int main()
{
    int a, i, m, q, b[8];
    printf("please input a number.\n");
    scanf("%d", &a);
    if (a <= 9)
        printf("%d", a);
    else
    {
        for (i = 9;i>=1;i--)
        {
            for (m = 8;m >= 0;m--)
            {
                if ((a - i) >=0)
                 {
                       b[m] = i;
                    a-=i;
                    }
                else
                {
                    b[m] = a;
                    break;
                }
            }
     }

        for (q = m;q <= 8;q++)
            printf("%d", b[q]);
    }

    return 0;
}

不需要两重循环,修改如下,改动处见注释,供参考:

#include<stdio.h>
int main()
{
    int a, i, m, q = 0, b[8] = {0};
    printf("please input a number.\n");
    scanf("%d", &a);
    if (a <= 9)
        printf("%d", a);
    else
    {
        for (i = 9,m = 7; i >= 1; i--) // 修改
        {
            //for (m = 7; m >= 0; m--) // 修改
            //{
                if ((a - i) >= 0)
                {
                    b[m--] = i;  // 修改
                    a -= i;
                }
                else
                {
                    if (a)          // 修改 如果前导是 0 ,就不写入数组里。
                        b[m--] = a; // 修改
                    break;
                }
            //}
        }

        for (q = m + 1; q < 8; q++) // 修改 for (q = m;q <= 8;q++)
            printf("%d", b[q]);
    }
    return 0;
}

你自己带个例子进去你的程序试一下就知道了,你内层那个m循环多余的,就比如这个20例子
你的代码思路是;
i: 9 m 从8到0循环,你的b[8[为9,b[7]为9, b[6]为2,m为6, a为0,跳出内层循环
此时外层继续循环, i为8,内层第一次m为8,然后break跳出这次循环,最后外层循环结束你的m为8,这就是你的结果输出为0的原因。
你的思路没有太大问题,就是在掌握for循环这里有错误,可以看一下我的代码,望采纳


```c
#include<stdio.h>
int main()
{
    int a,b[10];
    scanf("%d",&a);    
    int k=10;
    if(a<=9)
    printf("%d",a);

    else
    {
        for(int j=9;j>=1;j--)
        {
            if(a==0)
            break;
            else if(a>j)
            {
                b[k]=j;
                a=a-j;
                k=k-1;
            }
            else
            {
                b[k]=a;
                a=0;
            }
        }
        for(int j=k;j<=10;j++)
        printf("%d",b[j]);
    }
    return 0;
}

```


#include <stdio.h>

int main() {
    int a, i, m, q;
    int b[8];

    printf("Please input a number.\n");
    scanf("%d", &a);

    if (a <= 9) {
        printf("%d\n", a);
    } else {
        for (i = 9; i >= 1; i--) {
            for (m = 7; m >= 0; m--) {
                if ((a - i) >= 0) {
                    b[m] = i;
                    a -= i;
                } else {
                    break;
                }
            }
        }

        for (q = 0; q < 8; q++) {
            printf("%d", b[q]);
        }
        printf("\n");
    }

    return 0;
}

你这个思路不太对,你要代码我可以帮你写写看


#include<stdio.h>
int main()
{
    int a, i, m, q, b[9];
    printf("please input a number.\n");
    scanf("%d", &a);
    if (a <= 9)
        printf("%d", a);
    else
    {
        for (i = 0; i <9; i++)//依次对b[]赋值,免为空;
            b[i] = 0;
        for (i = 9;i>=1;i--)                                                        
           {
             for (m = 8;m >= 0;m--)                                                  
                                                                                      
            {
                if ((a - i) >=0)
                 {
                       b[m] = i;
                    a-=i;
                    }
                
            }
        /*    for(i=9,m=8;i>=1&&m>=0;i--)
            {
                if(a>=i)
                {
                    b[m]=i;
                    a-=i;
                    m--;
                }
                //else
                //break;
                
                
            }*/ 
     }

        for (q = m+1;q <= 8;q++)
            printf("%d", b[q]);
    
}
    return 0;
}

别用break跳出循环,用goto看看究竟该在哪里跳出。

本菜鸟来也~

```c
#include<stdio.h>
int main()
{
    int a, i, m, q, b[8];
    printf("please input a number.\n");
    scanf("%d", &a);
    if (a <= 9)
        printf("%d", a);
    else
    {
        m = 0;//数组的坐标从0开始
        for(i = 9 ; i >= 1; i --)//因为要求数字不重复,所以一个循环就好,检测9,8,7,6,.......
        {
            if ((a - i) >=0)
                 {
                       b[m] = i;//a>i,把这个i储存,例如20>9,储存9
                       a-=i;//例如20-9 = 11
                       m++;//数组的下一位准备储存下一个符合规范的数值(m指向的是下一个待存储的bit位)
                    }//9检测完后,i--,检测8,又进入循环
                else
                {//a<i,比如a-8后变为了3,此时i=7,a=3,直接把a存起来
                    b[m] = a;
                    break;
                }
        
        
     }
 
        for (q = m;q >= 0;q--)
            printf("%d", b[q]);
    }
    return 0;
}

```

【以下回答由 GPT 生成】

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

bool isUnique(int n) {
    bool digits[10] = {false};
    while (n > 0) {
        int digit = n % 10;
        if (digits[digit]) {
            return false;
        }
        digits[digit] = true;
        n /= 10;
    }
    return true;
}

int main() {
    int s;
    printf("请输入一个位数:\n");
    scanf("%d", &s);

    int num = 0;
    while (true) {
        num++;
        if (isUnique(num) && num >= pow(10, s-1)) {
            break;
        }
    }

    printf("最小数为:%d\n", num);
    return 0;
}

该改进代码修正了原先给出的代码中可能存在的错误,并对程序进行了优化。

  1. 引入了<stdbool.h>库来使用布尔类型。
  2. 添加了isUnique函数来判断一个数中的各个位是否唯一。
  3. main函数中,首先输入位数s
  4. 然后使用num来遍历整数,同时判断num中的各位是否唯一。
  5. num中的各位都是唯一且num大于等于pow(10, s-1)时,我们找到了满足要求的最小数。
  6. 最后输出最小数num

这样我们就得到了给定位数的最小数。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^