您的位置:首页 > 理论基础 > 数据结构算法

[数据结构]埃及分数(暴力,解答树,迭代加深搜索)

2015-06-20 23:42 573 查看
/*
Name:埃及分数(迭代加深搜索)

Actor:HT

Time:2015年6月20日

Error Reporte:

1.分数比较大小方法

}
*/

#include"stdio.h"
#include"iostream"
#include"string.h"

using namespace std;

int dep;
int flag = 0;	//成功的旗子
int ans[10];	//答案的每一个分母
int rans[10];	//真·答案的每一个分母

int PK(int a, int b, int c, int d)	//分数比较大小
{
if (a*d == b*c) return 0;
if (a*d > b*c)  return 1;	//前者大
if (a*d < b*c)  return -1;	//后者大
}

void dfs(int a, int b, int k, int set)					//四个参数,前两个原分数,k是当前层数,set是当前最大的分母,由于无法重复,后面的只能比他更大
{
if (k == dep + 1) return;							//出界
int i;
for (i = set;; i++)									//每一层的搜索,继承与set的值
{
if (PK(a, b, (dep + 1 - k), i) == 1)  break;
if (PK(a, b, 1, i) == -1)  continue;
ans[k] = i;
if (PK(a, b, 1, i) == 0)
{
memcpy(rans, ans, sizeof(ans));
flag = 1;
break;
}
dfs(a*i - b, b*i, k+1, i+1);					//原分数减去新分数的计算公式
}
return;
}

void Work(int a, int b)
{
for (dep = 1; dep <= 10; dep++)				//迭代深搜
{
dfs(a, b, 1 ,2);
if (flag)								//简单的输出控制
{
printf("1/%d", rans[1]);
for (int i = 2; i <= dep; i++)
printf("+1/%d", rans[i]);
cout << endl;
break;
}
}
}

int main()
{
int a, b;
while (cin >> a >> b)
{
cout << a << "/" << b << "=";
Work(a, b);
}
return 0;
}

/*
不咋懂eg:

#include"stdio.h"
#include"iostream"
#include"string.h"

using namespace std;

typedef long long LL;
const int INF = ~0U >> 1;
const int N = 10;

int dep, flag;
int ans
, d
;

int gcd(int a, int b)
{
return b ? gcd(b, a%b) : a;
}//求最大公约

void dfs(int a, int b, int k)
{
if (k == dep + 1) return;
if (b % a == 0 && b / a > d[k - 1])
{
d[k] = b / a;
if (!flag || d[k] < ans[k])
memcpy(ans, d, sizeof(d));
flag = 1;
return;
}
int s = b / a;
if (s <= d[k - 1])
s = d[k - 1] + 1;
int t = (dep - k + 1) *  b / a;
if (t > INF / b)
t = INF / b;
if (flag && t >= ans[dep])
t = ans[dep] - 1;
for (int i = s; i <= t; i++)
{
d[k] = i;
int m = gcd(i*a - b, b*i);
dfs((i*a - b) / m, b*i / m, k + 1);
}
}

void Work(int a, int b)
{
d[0] = 1;
flag = 0;
for (dep = 1; dep <= N; dep++)
{
dfs(a, b, 1);
if (flag)
{
printf("1/%d", ans[1]);
for (int i = 2; i <= dep; i++)
printf("+1/%d", ans[i]);
cout << endl;
break;
}
}
}

int main()
{
int a, b;
while (cin >> a >> b)
{
cout << a << "/" << b << "=";
Work(a, b);
}
return 0;
}*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: