Problem 1550 猪的分数
Accept: 351 Submit: 714 Time Limit: 1000 mSec Memory Limit : 32768 KB
Problem Description
输入一个自然数N。
请写一个程序来增序输出分母小于等于N的既约真分数。
Input
输入包含多组测试数据,请处理到EOF结束。
每组数据包括,一个自然数N(1<=N<=160)。
Output
每个分数单独占一行。
Sample Input
5
Sample Output
0/1
1/5
1/4
1/3
2/5
1/2
3/5
2/3
3/4
4/5
1/1
Source
ACM模拟赛之再见猪年
解决方案
即约真分数顾名思义,首先是个真分数,其次是个最简真分数(即分子分母互质)
本题的难点在于如何判断两数是否互质
以下代码给出了一种递归的判断函数
愣着干嘛,记笔记呀
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct num
{
char chu[10];
double result;
};
bool my_sort(num a, num b)
{
return a.result < b.result;
}
//返回最大公因数,返回1则互质
int ishuzhi(int a, int b)
{
if (a%b == 0)
return b;
else
return ishuzhi(b, a%b);
}
int main()
{
vector<num> t_vec;
int n, i, j;
num nnn;
vector<num>::iterator it;
while (scanf("%d", &n) != EOF)
{
for (i = 1; i <= n; i++)
{
for (j = 1; j <= i; j++)
{
if (ishuzhi(j, i) == 1)
{
nnn.result = (double)j / (double)i;
sprintf(nnn.chu, "%d/%d", j, i);
t_vec.push_back(nnn);
}
}
}
sort(t_vec.begin(), t_vec.end(), my_sort);
it = t_vec.begin();
printf("0/1\n");
for (; it != t_vec.end(); it++)
printf("%s\n", it->chu);
t_vec.clear();
}
return 0;
}