小明买书

题目:

小明假期同爸爸一起去书店,他选中了六本书,每本书的单价分别为:3.1,1.7,2,5.3,0.9和7.2。不巧的是,小明的爸爸只带了十几块钱,为了让小明过一个愉快的假期,爸爸仍然同意买书,但提出一个要求,要小明从六本书中选出若干本,使得单价相加所得的和同10最接近。


自己编写的程序如下,主要是求排列组合总数,并利用2进制的特性,将各个单价与二进制位1~6bit一一对应:

<span style="font-size:18px;">#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;


void PrintAll();
float booksPrice[] = {3.1f, 1.7f, 2.0f, 5.3f,0.9f, 7.2f};

int main(int argc, char* argv[])
{
	float sumOfPrice[64];
	
	for(int m=0; m<64; m++)
	{
		sumOfPrice[m] = 0.0f;
	}

	for(int i=0; i<64; i++)
	{
			int j = i;
			int testNumber = i;
			int bitPosition = 0;
			while(testNumber)
			{
				if(testNumber%2!=0)
					sumOfPrice[j] += booksPrice[bitPosition];
				bitPosition++;
				testNumber = testNumber>>1;				
			}
	}

	int minIndex = 1;
	float tmpSum[64];
	for(int k=1; k<64; k++)
	{
		tmpSum[k] = sumOfPrice[k] - 10.0f;
		tmpSum[k] = fabs((double)tmpSum[k]);
		if(tmpSum[k] <= tmpSum[minIndex])
			minIndex = k;
	//	cout<<sumOfPrice[k]<<endl;
	}
	
	cout << "\nminIndex = "<<minIndex<<endl;
	
	int minNumber = minIndex;
	float res = 0.0f;
	int bitPos = 0;
	cout<<"最小的组合: "<<endl;
	while( minNumber )
	{
		if(minNumber % 2 != 0)
		{
			cout<<booksPrice[bitPos]<<"+"<<" ";
			res += booksPrice[bitPos];
		}
		bitPos++;
		minNumber = minNumber>>1;

	}
	cout <<"\b\b  = " <<res<<endl<<endl;
	cout <<"以下是其他可能的组合:"<<endl;
	PrintAll();

	return 0;
}


void PrintAll()
{
	int flagArray[64][6];
	for(int x=0; x<64; x++)
		for(int y=0; y<6; y++)
		{
			flagArray[x][y] = 0;
		}
	
	for(int i=1; i<64; i++)
	{
		int bitPosition =0;
		int testNumber = i;
		while(testNumber)
		{
			if(testNumber %2 != 0)
			{
				flagArray[i][bitPosition] = 1;
			}
			bitPosition++;
			testNumber = testNumber>>1;
		}
	}


	for(int m=1; m<64; m++)
	{
		float sum=0.0f;
		for(int n=0; n<6; n++)
		{
			if(flagArray[m][n] == 1)
			{
				cout<<booksPrice[n]<<"+"<<" ";
				sum += booksPrice[n];
			}
		}
		cout<<"\b\b = "<<sum<<endl;
	}
	
}</span>


题目内容:小明同学特别喜欢买书看书。由于书较多,摆放杂乱,找起来非常麻烦。这学期小明同学上了数据结构与程序设计课后,决定改变这种状况:用C开发一个小型图书管理系统。系统包含的图书信息有:书名、作者、出版社、出版日期等。首先,图书管理系统对已有的书(原始书库,存放在一个文本文件)按书名字典序进行(按书名各字符的ASCII码值由小到大排序)摆放(即将原始无序的图书信息文件生成一个有序的文件,即新书库),以便查找。该管理系统可以对新书库图书条目进行如下操作: 1.录入。新增书录入到书库(即从输入读入一条图书信息插入到已排序好的图按书文件相关位置处) 2.查找。按书名或书名关键字信息在书库查找相关图书信息,若有多本书,按字典序输出。 3.删除。输入书名或书名关键字信息,从书库查找到相关书并将其删除,并更新书库。 【输入形式】 原始的图书信息(原始书库)保存在当前目录下的books.txt。 用户操作从控制台读入,首先输入操作功能序号(1代表录入操作,2代表查找操作,3代表删除操作,0代表将已更新的图书信息保存到书库并退出程序),然后在下一行输入相应的操作信息(录入操作后要输入一条图书信息,查找和删除操作后只要输入书名或书名部分信息)。程序支行过程可以进行多次操作,直到退出(输入操作0)程序。 要求: 1、原始文件的图书信息与录入的图书信息格式相同,每条图书信息都在一行上,包括书名(不超过50个字符)、作者(不超过20个字符)、出版社(不超过30个字符)和出版日期(不超过10个字符),只由英文字母和下划线组成,用一个空格分隔。图书信息总条数不会超过500. 2、下划线字符参加排序。 3、图书不会重名。 【输出形式】 进行录入和删除操作,系统会更新图书信息,但不会在控制台窗口显示任何信息。 进行查找操作后,将在控制台按书名字典序分行输出查找到的图书信息,书名占50个字符宽度,作者占20个字符宽度,出版社占30个字符宽度,出版日期占10个字符宽度,都靠左对齐输出。 最终按字典排序的图书信息保存在当前目录下的ordered.txt,每条图书信息占一行,格式与查找输出的图书信息相同
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值