请教一个C语言编程问题,答出来另有加分!!!(急,在线等)

2025-01-25 09:02:47
推荐回答(4个)
回答1:

让我想也只会穷举法了,看看有没有其他的方法,期待楼下的,你先用穷举法写吧。
#include "stdio.h"
#include "conio.h"
#include "math.h"
main()
{
int i,j,a[7],sum=0,m,n,temp1,temp0,temp,temp3=0;
/*输入*/
for(i=0; i < 7 ;i++)
{
scanf("%d ",&a[i]);
sum+=a[i];
}
/*寻找一组最小的数*/
temp=sum;
for(j=7;j<127;j++)
{
m=j;
n=0;
temp1=temp0=0;
i=0;
while(i<7)
{

n+=m%2;
if(m%2==0)
temp0+=a[i];
else
temp1+=a[i];
i++;
m=m/2;

}
if(n==3 && fabs(temp0-temp1){
temp=fabs(temp0-temp1);
temp3=j;
}

}

/* 输出数*/
j=temp3;
i=0;
while(i<7)
{
if(temp3%2==1)
printf("%d,",a[i]);
i++;
temp3/=2;
}
printf("\n");

i=0;
while(i<7)
{
if(j%2==0)
printf("%d,",a[i]);
i++;
j/=2;
}
printf("\n");
getch();

}
比较乱,不过能实现功能了,用的穷举法,只是输入7个数后要随便输入一个字符结果才能出来,我也不知道为什么。你先试试行不行。

我说说我程序的思路,我是参考求排列组合的思想,7个数中随机选3个,那么就是7位2进制数中有3个1的个数,是0那个数就不选,是1那个数组就选上,我举个例子7(10进制)=111,8=1000,9=1001,11=1011,这样7和11就要选上,8,9因为1个数不是3,所以不选,因为一个2进制数要有3个1的话最小也是7所以从7,开始,最大就是1110000,我用127比这个数稍大一点,明白这个思想,然后用temp做测试数据,如果选的这两组数的差的绝对值比已有temp小则temp更新为这个更小的绝对值,temp3的作用是目前最小的temp的j的值,j是换成2进制有3个1的数。说的比较乱,表达不好,看不懂再说吧,呵呵。我看看有没有其他更好的办法了。

回答2:

#include
#include
#include

int main()
{
int i, j, k;
int sum = 0;
int tmp = INT_MAX, i1, j1, k1;
int a[7], a1[3], a2[4];
i1 = j1 = k1 = 0;

puts("输入7个数字:");

for (i = 0; i < 7; ++i)
{
scanf("%d", &a[i]);
sum += a[i];
}

for (i = 0; i < 7; ++i)
{
for (j = 0; j < 7; ++j)
{
if (i == j) continue;
for (k = 0; k < 7; ++k)
{
if (k == j || k == i) continue;

int tmp2 = abs(sum - 2 * (a[i] + a[j] + a[k]));
if (tmp2 < tmp)
{
tmp = tmp2;
i1 = i, j1= j, k1 = k;
// printf("%d ", tmp);
}
}
}
}

a1[0] = a[i1], a1[1] = a[j1], a1[2] = a[k1];
j = 0;

for (i = 0; i < 7; ++i)
{
if (i != i1 && i != j1 && i != k1)
{
a2[j] = a[i];
++j;
}
}

puts("第一组数为:");
for (i = 0; i < 3; ++i)
printf("%d ", a1[i]);
putchar('\n');

puts("第二组数为:");
for (i = 0; i < 4; ++i)
printf("%d ", a2[i]);
putchar('\n');

return 0;
}

回答3:

用穷举法,设计循环让计算机一种种试

回答4:

能把题目的意思说的更清楚些么?这样很不明白你的意思啊