*问题分析与算法设计
分析题意,可将题目简化为:从六个数中选出若干个求和,使得和与10的差值最小。
题目中隐含两个问题,其一是怎样从六个数中选出若干个数;其二是求与10的差。
从六个数中选出若干个数实质是从六个数中选出若干个进行组合。每个数在组合过程中只有两种情况:要么是选中参加求和,要么是没选中不参加求和。这样就可以使用六重循环对每个数是否参加求和进行全部可能情况的组合。
关于求与10的差值应当注意的是:差值的含义是指差的绝对值。例如:“9-10=-1"和"11-10=1",但9和11这两者与10的差值都是1。若认为”9“与”10的差值为-1就错了。
#include <stdio.h>
#include <math.h>
int main()
{
int d[6], m, i, j;
long b[63], flag;
float c[6], min, x;
printf("Please enter the prices of 6 books:");
for (i = 0; i < 6; i++)
scanf("%f", &c[i]);
for ( i = 0, min = -1, d[0] = 0; d[0] < 2; d[0]++)
for (d[1] = 0; d[1] < 2; d[1]++)
for (d[2] = 0; d[2] < 2; d[2]++)
for (d[3] = 0; d[3] < 2;d[3]++)
for (d[4] = 0; d[4] < 2; d[4]++)
for (d[5] = 0; d[5] < 2; d[5]++)
{
for (flag = 0, x = 0, j = 5; j >= 0; j--)
{
x += c[j]*d[j];
flag = flag*10 + d[j];
}
x = ((x - 10 > 0) ? x - 10 : 10 - x);
if (min < 0)
{
min = x;
b[i++] = flag;
}
else if (min - x > 1.e-6)
{
min = x;
b[0] = flag;
i = 1;
}
else if (fabs((double)x - min) < 1.e-6)
{
b[i++] = flag;
}
}
for (m = 0; m < i; m++)
{
printf("10(+ -)%.2f=", min);
for (flag = b[m], j = 0; flag > 0; j++, flag /= 10)
if (flag % 10)
{
if (flag > 1)
{
printf("%.2f+", c[j]);
}
else
{
printf("%.2f\n", c[j]);
}
}
}
return 0;
}
Please enter the prices of 6 books:3.1 1.7 2.0 5.3 0.9 7.2
10(+ -)0.10=2.00+0.90+7.20
10(+ -)0.10=1.70+2.00+5.30+0.90
10(+ -)0.10=3.10+1.70+5.30
转载自原文链接, 如需删除请联系管理员。
原文链接:小明买书,转载请注明来源!