一个分数一般写成两个整数相除的形式:/,其中 M 不为0。最简分数是指分子和分母没有公约数的分数表示形式。
现给定两个不相等的正分数 / 和 /,要求你按从小到大的顺序列出它们之间分母为 K 的最简分数。
输入格式:
输入在一行中按 / 的格式给出两个正分数,随后是一个正整数分母 K,其间以空格分隔。题目保证给出的所有整数都不超过 1000。
输出格式:
在一行中按 / 的格式列出两个给定分数之间分母为 K 的所有最简分数,按从小到大的顺序,其间以 1 个空格分隔。行首尾不得有多余空格。题目保证至少有 1 个输出。
输入样例:
7/18 13/20 12
输出样例:
5/12 7/12
这个题,刚开始做的时候感觉很简单,但是做的时候出现了一点问题,有一个测试点一直不过,然后从网上找原因,大部分是要交换给的两个数字,但是我已经注意到了一点,经过我苦苦思考至于发现了
是浮点数运算出了问题,因为我频繁的把int与double进行强制类型转换,导致一些数字的精度发生了改变,从而数值就发生了改变,所以导致我这个题写了好多遍。
#include <iostream>
1 #include <iostream> 2 #include <string> 3 #include <algorithm> 4 #include <cstdio> 5 #include <cstdlib> 6 #include <cstring> 7 using namespace std; 8 int yue(int a,int b) 9 { 10 int c; 11 int flag=0; 12 c=min(a,b); 13 for(int i=2;i<=c;i++) 14 { 15 if(b%i==0 && a%i==0) 16 { 17 flag=1; 18 break; 19 } 20 } 21 return flag; 22 } 23 int main() 24 { double n1,m1,n2,m2,k; 25 double a1,b1; 26 int count1=0; 27 scanf("%lf/%lf %lf/%lf %lf",&n1,&m1,&n2,&m2,&k); 28 a1=n1/m1; 29 b1=n2/m2; 30 if(a1>b1) 31 { double t; 32 t=a1; 33 a1=b1; 34 b1=t; 35 } 36 for(int i=1;i<=1000;i++) 37 { 38 if((doubl e)i/k>=(a1+0.0000001) && (double)i/k<=(b1-0.00000001)) 39 { 40 if(yue(i,k)==0 && count1==0) 41 { count1++; 42 printf("%d/%d",i,(int)k); 43 } 44 else if( count1!=0 && yue(i,k)==0) 45 { 46 printf(" %d/%d",i,(int)k); 47 } 48 } 49 } 50 51 return 0; 52 }

浙公网安备 33010602011771号