N久前就可以做这题了,只是想找到一个比枚举更好一点的方法,不过实在想不出来.
用递归做的,这样好处是代码很短也很容易调出来(有zoj的测试数据呢!),不过效率就不怎么样了.更正常一点的做法应该是枚举所有的拆分然后做比较.
Accepted | 1003 | C++ | 00:00.04 | 436K |
#include<stdio.h>
#define swap(a,b) a = a ^ b, b = b ^ a, a = a ^ b
int flag;
int dfs(int n,int m,int d)
{
if(n <= 100 && m <= 100 && n != m && d < n && d < m)
return 1 ;
if(m == 1 )
{
flag = 1 ;
return 0 ;
}
while((d < n || d < m) && d < 100 )
{
d++ ;
if(n % d == 0 )
if(dfs(n / d,m,d)) return 1 ;
if(m % d == 0 )
if(dfs(n,m / d,d)) return 1 ;
}
return 0 ;
}
void solve(int n,int m)
{
flag = 0 ;
if(n < m) swap(n,m);
if(dfs(n,m,1) || flag == 0) printf("%d/n" ,n);
else printf("%d/n" ,m);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("1003.txt","r" ,stdin);
freopen("res.txt","w" ,stdout);
#endif
int n,m;
while(scanf("%d%d",&n,&m) != EOF)
solve(n,m);
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
return 0 ;
}
#define swap(a,b) a = a ^ b, b = b ^ a, a = a ^ b
int flag;
int dfs(int n,int m,int d)
{
if(n <= 100 && m <= 100 && n != m && d < n && d < m)
return 1 ;
if(m == 1 )
{
flag = 1 ;
return 0 ;
}
while((d < n || d < m) && d < 100 )
{
d++ ;
if(n % d == 0 )
if(dfs(n / d,m,d)) return 1 ;
if(m % d == 0 )
if(dfs(n,m / d,d)) return 1 ;
}
return 0 ;
}
void solve(int n,int m)
{
flag = 0 ;
if(n < m) swap(n,m);
if(dfs(n,m,1) || flag == 0) printf("%d/n" ,n);
else printf("%d/n" ,m);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("1003.txt","r" ,stdin);
freopen("res.txt","w" ,stdout);
#endif
int n,m;
while(scanf("%d%d",&n,&m) != EOF)
solve(n,m);
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
return 0 ;
}