猪的分数
Time Limit:1s Memory limit:32M
Accepted Submit:175 Total Submit:366

输入一个自然数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

Original: ACM模拟赛之再见猪年

 

解题:

      再一次动用map容器,感觉实在不错。map容器的关键字不可以重复,所以若是可以约分的将放不到map中,因为已经存有真分数了,又因为循环是从小开始的,所以肯定真分数先存进map中,然后设定关键字对应的值为string类型的分数表示格式。代码中要注意整型转换字符串的方法。另外要注意N=1的时候的特例。

#pragma warning(disable:4786) #include <map> #include <string> #include <iostream> #include <stdio.h> using namespace std; int main() { int N; string s3=" "; char a[160]; char b[160]; memset(a,'/0',10); memset(b,'/0',10); map < double,string > number; map < double,string >::iterator iter; while(cin>>N) { number.insert(map < double, string >::value_type(0.00,"0/1")); if(N!=1) number.insert(map < double, string >::value_type(0.50,"1/2")); number.insert(map < double, string >::value_type(1.00,"1/1")); for(int i=1;i<=N;i++) { for(int j=1;j<=i;j++) { if(i%j==0 && j!=1) //能整除的,不是真分数 continue; else { sprintf(a,"%d",j); //把整型转换成字符串 string s1(a); sprintf(b,"%d",i); string s2(b); s3=s1+"/"+s2; number.insert(map < double, string >::value_type((1.00/i)*j,s3)); } } } for (iter = number.begin(); iter != number.end(); iter++) { cout<<iter->second<<endl; } number.clear(); } return 0; }