70,026
社区成员




void qiu(int m, int n, int k)//k从1到10
{
int i,t,low,high;
t=Gg(m,n);//求最大公约数
m/=t;
n/=t;
if (k==1)
{
if (m==1)//为1/n的情况
{
b[0]=n;
if (!g|| (g && n<a[0]))//前一种是输入就是1/n,后一种是递归出结果
{
g=1;
for (i=0; i<c; i++)
a[i]=b[i];//a是输出数组
}
}
}
else
{
low=n/m+1;//可能出现的最小分母
if (k<c &&b[k]+1>low)
low=b[k]+1;//不能出现比前一个分母大的或者相同的分母
high = (k*n%m==0)? k*n/m-1:k*n/m;//可能出现的最大分母
for (t=low; t<=high; t++)
{
b[k-1]=t;//循环各种可能性
qiu(m*t-n,n*t,k-1);//递归
}
}
}
#include <stdio.h>
#define N 10
int a[N],b[N],c;
int g;
int Gg(int m, int n)
{
int t;
while (m>0)
{
t=n%m;
n=m;
m=t;
}
//printf("%d\n",n);
return n;
}
void qiu(int m, int n, int k)//k从1到10
{
int i,t,low,high;
t=Gg(m,n);//求最大公约数
m/=t;
n/=t;
if (k==1)
{
if (m==1)
{
b[0]=n;
if (!g|| (g && n<a[0]))
{
g=1;
for (i=0; i<c; i++)
a[i]=b[i];
}
}
}
else
{
low=n/m+1;
if (k<c &&b[k]+1>low)
low=b[k]+1;
high = (k*n%m==0)? k*n/m-1:k*n/m;
for (t=low; t<=high; t++)
{
b[k-1]=t;
qiu(m*t-n,n*t,k-1);
}
}
}
int main(void)
{
int i,m,n;
scanf("%d %d",&m,&n);
g=0;
c=0;
do
{
c++;
qiu(m,n,c);
}while (!g&& c<N);
if (g)
{
for (i=c-1; i>=0; i--)
printf("%d ",a[i]);
//printf("%d\n",a[0]);
}
return 0;
}