用给定的位数和求最小数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;
}
该改进代码修正了原先给出的代码中可能存在的错误,并对程序进行了优化。
<stdbool.h>
库来使用布尔类型。isUnique
函数来判断一个数中的各个位是否唯一。main
函数中,首先输入位数s
。num
来遍历整数,同时判断num
中的各位是否唯一。num
中的各位都是唯一且num
大于等于pow(10, s-1)
时,我们找到了满足要求的最小数。num
。这样我们就得到了给定位数的最小数。