用给定的位数和求最小数s,这样它中的所有数字都是不同的(即所有数字都是唯一的)。
例如 s=20=3+8+9;答案为 389;
目前代码在小于17大于12上出现问题,望帮忙,看看问题在哪
#include<stdio.h>
int work2(int b,int c,int d,int f)
{
int q,w,e,r,t,y;
for(q==1;q<=9;q++)
{
d=(9-q)/2;
f=(9+q)/2;
if(b!=d)
{
if(b!=f)
{
if(c!=d)
{
if(c!=f)
{
break;
}
}
}
}
}
return b,c,d,f;
}
int work1(int a)
{
int q,w,e,r,t,y,u,i,o,p;
if(a<9)
{
if(a%2!=0)
printf("answer=%d%d\n",(a-1)/2,(a+1)/2);
else
printf("answer=%d%d\n",a/2-1,a/2+1);
}
else
{
int q=a/9;
if(q==1)
{
if(a==10)
printf("answer=19\n");
else if(a==11)
printf("answer=1235\n");
else {
w=a-9;
if(w%2!=0)
{
e=(w-1)/2;
r=(w+1)/2;
}
else
{
e=w/2-1;
r=w/2+1;
}
work2(e,r,t,y);
printf("answer=%d%d%d%d\n",e,r,t,y);
}
}
}
}
int main()
{
while(1)
{
int s;
printf("please input a nummber(1-45).\n");
scanf("%d",&s);
work1(s);
//printf("%d",work(s));
}return 0;
}
work1没返回值
【以下回答由 GPT 生成】
这段代码存在多个问题,并且逻辑上也有一些错误。
首先,函数work1
没有定义返回类型,并且没有返回值。我们可以将返回类型设置为void
,并在需要返回值的地方使用指针参数进行返回。
其次,函数work2
参数列表中的d
和f
没有使用的必要,可以直接删除。
对于函数work1
中的逻辑,我们可以进行如下修改:
void work1(int a, int *result)
{
int q, w, e, r, t, y, u, i, o, p;
if (a < 9)
{
if (a % 2 != 0)
{
printf("answer=%d%d\n", (a - 1) / 2, (a + 1) / 2);
}
else
{
printf("answer=%d%d\n", a / 2 - 1, a / 2 + 1);
}
}
else
{
int q = a / 9;
if (q == 1)
{
if (a == 10)
printf("answer=19\n");
else if (a == 11)
printf("answer=1235\n");
else
{
w = a - 9;
if (w % 2 != 0)
{
e = (w - 1) / 2;
r = (w + 1) / 2;
// 返回结果
result[0] = e;
result[1] = r;
}
else
{
e = w / 2 - 1;
r = w / 2 + 1;
// 返回结果
result[0] = e;
result[1] = r;
}
}
}
}
}
在这里,我们使用了指针参数result
来传递返回值。
在函数work2
中,存在多个冗余的条件判断和逻辑错误。而且函数的返回值是一个元组,C语言不直接支持这样的返回值。可以考虑创建一个自定义的结构体存储返回值。
完整的修改后的代码如下:
#include <stdio.h>
typedef struct {
int b;
int c;
int d;
int f;
} Result;
void work1(int a, int *result)
{
int q, w, e, r, t, y, u, i, o, p;
if (a < 9)
{
if (a % 2 != 0)
{
printf("answer=%d%d\n", (a - 1) / 2, (a + 1) / 2);
}
else
{
printf("answer=%d%d\n", a / 2 - 1, a / 2 + 1);
}
}
else
{
int q = a / 9;
if (q == 1)
{
if (a == 10)
printf("answer=19\n");
else if (a == 11)
printf("answer=1235\n");
else
{
w = a - 9;
if (w % 2 != 0)
{
e = (w - 1) / 2;
r = (w + 1) / 2;
// 返回结果
result[0] = e;
result[1] = r;
}
else
{
e = w / 2 - 1;
r = w / 2 + 1;
// 返回结果
result[0] = e;
result[1] = r;
}
}
}
}
}
int main()
{
int s = 16;
int result[2];
work1(s, result);
printf("answer=%d%d\n", result[0], result[1]);
return 0;
}
这样,我们将返回结果存储在了数组result
中,并成功打印出来。
按题主的写法修改如下,20以下正常,改动处见注释,供参考:
#include<stdio.h>
void work2(int* b, int* c, int* d, int* f) // 修改
{
int q; // w, e, r, t, y; 修改
for (q = 1; q < 9; q++) //for (q == 1; q <= 9; q++) 修改
{
*d = (9 - q) / 2;
*f = (9 + q) / 2;
if ((*d + *f == 9) && (*b != *d) && (*b != *f) && (*c != *d) && (*c != *f)) break; // 修改
}
//return b, c, d, f; 修改
}
void work1(int a)
//int work1(int a) 修改
{
int q, w, e, r, t, y, u, i, o, p;
if (a < 10) //修改 if(a<9)
{
if (a % 2 != 0)
printf("answer=%d%d\n", (a - 1) / 2, (a + 1) / 2);
else
printf("answer=%d%d\n", a / 2 - 1, a / 2 + 1);
}
else
{
int q = a / 10; //修改 int q=a/9;
if (q == 1)
{
if (a == 10)
printf("answer=19\n");
else if (a == 11)
printf("answer=1235\n");
else {
w = a - 9;
if (w % 2 != 0)
{
e = (w - 1) / 2;
r = (w + 1) / 2;
}
else
{
e = w / 2 - 1;
r = w / 2 + 1;
}
work2(&e, &r, &t, &y);
printf("answer=%d%d%d%d\n", e, r, t, y);
}
}
}
}
int main()
{
while (1)
{
int s;
printf("please input a nummber(1-45).\n");
scanf("%d", &s);
work1(s);
//printf("%d",work(s));
}
return 0;
}