c语言编程求找错误!
按照你的问题:(6种砝码组合,列出所有不同的组合结果)
从编程角度看你的代码,不单纯是错误修改,还有编程思路改进:
一、有5个砝码重量和5个砝码数量,那么重量应定义成数组(写程序要考虑需求的修改,比如其它重量组合),而数量也定义成数组(单独写成abcdef可以,但是数量多了不方便阅读维护程序,而且数组可以循环遍历)。
二、逻辑上,可将组合结果放在一个数组中,每次组合将结果和数组对比,存在就跳过,不存在就保存到数组,最后这个结果数组就是题目要的n种质量。
三、扩展讲,这里重量和数量都是砝码对象的属性,所以实际开发,这种情况把砝码定义成结构体更好,数量和重量都是其属性。(考虑你学习范围,这里暂用数组解决)
四、结果数组可以定义一个非常大的数组(但是输入的数字太大可能会超出范围),也可以用动态数组。
下面是代码(我演示代码所有个数都输入1,这样每种刚好有0和1两种选择,这样刚好就是6位二进制数(对应10进制就是63),和截图一致。打印输出是给你看的,可以注释掉):
#include<stdio.h>
#define N 6//砝码种类的数量,定义常量,方便修改
#define M 1000//组合的最大数量
int main()
{
int sums[M]={0},len=0,flag,sTemp;//结果数组,按你写法用大数组,但注意不要输入太大数量,否则使用动态数组
int i,wets[N]={1,2,5,10,15,20},nums[N]={0};
int a[N],cnt=0,n=0;
for(i=0,printf("请分别输入%d种砝码数量(1,2,5,10,15,20g):\n",N);i<N;scanf("%d",&nums[i++]));
for(a[0]=0;a[0]<=nums[0];a[0]++)//按照你的写法,嵌套循环穷举所有组合
for(a[1]=0;a[1]<=nums[1];a[1]++)//这样写,如需扩展,比如100种砝码,要复制99遍,还要改下标(实际代码太长,所以最好还是用递归函数单独实现,这里不深究)
for(a[2]=0;a[2]<=nums[2];a[2]++)
for(a[3]=0;a[3]<=nums[3];a[3]++)
for(a[4]=0;a[4]<=nums[4];a[4]++)
for(a[5]=0;a[5]<=nums[5];a[5]++)
{
cnt++;
printf("个数的组合%d:%d,%d,%d,%d,%d,%d",n++,a[0],a[1],a[2],a[3],a[4],a[5]);//测试用,打印给你看,可注释掉
for(i=0,sTemp=0;i<N;sTemp+=a[i]*wets[i],i++);
printf("(总重量%d)\n",sTemp);//测试用,打印给你看,可注释掉
for(i=0,flag=0;i<len;i++)// 与结果数组对比
if(sums[i]==sTemp)
{
flag=1;//发现有重复记录,标识置1
break;
}
if(flag)cnt--;//用重复,当前组合结果放弃,不记录
else
{
sums[len]=sTemp;//不重复,记录当前组合结果
len++;
}
}
printf("其中共有%d种不同组合\n",cnt);
for(i=0,printf("总重量分别为:");i<cnt;printf("%d ",sums[i]),i++);//测试用,打印给你看,可注释掉
return 0;
}
哇谢谢大佬🙇🏻♀️我先采纳了!但如果方便的话能不能告诉我我写的到底是哪里出错了导致运行不出结果呢?希望还是能在原来的基础上进行修改。大一小白卑微求教
我这代码就是参考你的写法,只不过把同类独立变量改成数组。你对比思考下。实现不行回头把你的原码贴上了,我改天有空给你看看。但最好自己看。读代码是编程的基本要求。
2023-06-12 广告