题目:
形如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;
}
运行结果如下: