猪的分数
Time Limit:1s | Memory limit:32M |
Accepted Submit:175 | Total Submit:366 |
输入一个自然数N。 请写一个程序来增序输出分母小于等于N的既约真分数。 Input 输入包含多组测试数据,请处理到EOF结束。 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; }