程序基本算法习题解析 运用回溯法将1分解成若干个互不相同的单位分数之和。

题目:

形如1/a的分数称为单位分数,可以将1分解成若干个互不相同的单位分数之和。如 1= 1/2+1/3+1/9+1/18; 1 = 1/2+1/3+1/10+1/15。这样的分解有无数个。现要求分解为n项且分解后最大的分母不超过30,给出所有不同分解法。

代码如下:

// Chapter10_3.cpp : Defines the entry point for the application.
// 将1分解成若干个互不相同的单位分数之和。
// 形如1/a的分数称为单位分数,可以将1分解成若干个互不相同的单位分数之和。
// 如 1= 1/2+1/3+1/9+1/18; 1 = 1/2+1/3+1/10+1/15。这样的分解有无数个。
// 现要求分解为n项且分解后最大的分母不超过30,给出所有不同分解法。

#include "stdafx.h"
#include<iostream>
using namespace std;

const int N = 100; //允许的最大输入项数
const int maxFenmu = 30; //要求分解的分母最大值
double fenmu[N] = {1}; //虽然分母为整数,但是因为后面要做除法运算,所以这里定义的是double类型
int count = 1; //计数变量
//求分解项函数
void funDecompose(int n)
{
	double sum; //各分数项的和
	int k=0,i=0; 
	while(k>=0)
	{
		fenmu[k] = fenmu[k]+1;
		//使分母依次增大
		while(k>0 && fenmu[k]<=fenmu[k-1])
			fenmu[k]++;
		if((fenmu[k]<maxFenmu) && (k=n-1))
		{
			sum = 0;
			//求分数项和
			for(i=0;i<n;i++)
				sum = sum + 1 / fenmu[i];
			//和为1时(因为是用小数进行计算的,所以有舍入误差),输出分解结果
			if(sum>0.999999 && sum<1.000001)
			{
				cout << "第" << count++ << "种分解为:" << endl;
				cout << "1 = " ;
				for(int i=0;i<n-1;i++)
				{
					cout << "1/" << fenmu[i] << " + ";
				}
				cout << "1/" << fenmu[n-1] << endl;
			}
		}
		else 
		{
			//分母小于30,但项数不足n时
			if(fenmu[k]<maxFenmu && k<n-1)
				k++;
			//分母超过30
			else
			{
				fenmu[k] = 1; //重新为该分母赋个初值
				k = k-1; //重新计算前一个分母
			}
		}

	}
}
int main()
{
	int order;
	cout << "输入需要分解的阶数(小于100):";
	cin >> order;
	funDecompose(order);
	system("pause");
	return 0;
}


运行结果如下:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值