数的变幻(小明买书)

来源:互联网 发布:淘宝运费险最高赔多少 编辑:程序博客网 时间:2024/05/17 01:19
/**************************************** *  File Name  : figure.c *  Creat Data : 2015.1.30*  Author     : ZY *****************************************/ /*数的变幻*//*小明买书*//*小明假期同爸爸一起去书店,他选中了六本书,每本书的单价分别为:3.1,1.7,2,5.3,0.9和7.2不巧的是,爸爸兜里只带了十几块钱,为了让小明过一个愉快的假期,爸爸依然同意买书,但提出一个要求,要小明从六本书中选出若干本,使得单价相加所得的和同10最接近。你能帮小明解决这个问题吗?*/#include <stdio.h>#include <math.h>int main(void){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]);//输入6个浮点数}for(i = 0,min = -1,d[0] = 0;d[0] < 2;d[0]++){//建立六个全部的组合并处理,d[]:组合时是否取该值标志,min:与10最小的差值,i:差值具有min组合的数量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:对应六个组合的和,flag :将六个数的组合用对应的一个十进制位表示x += c[j]*d[j];flag = flag*10+d[j];}x = ((x - 10) > 0)?(x - 10):(10 - x);//x:组合的和和10的差if(min < 0){min = x;//对第一次计算的差进行处理b[i++] = flag;//b[]记录有相同的min的flag数组,i:b[]的下标}else if(min - x > 1.e-6)//对新的min处理{min = x;b[0] = flag;i = 1;}else if(fabs((double)x - min)<1.e-6)//对相等的min处理{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)//将b[]中存的标记flag还原为各个数的组合{if(flag > 1){printf("%.2f+",c[j]);}else{printf("%.2f\n",c[j]);}}}}}return 0;}

0 0