一个分数一般写成两个整数相除的形式:N/M,其中 M 不为0。最简分数是指分子和分母没有公约数的分数表示形式。
现给定两个不相等的正分数 N1/M1 和 N2/M2,要求你按从小到大的顺序列出它们之间分母为 K 的最简分数。
输入格式:
输入在一行中按 N/M 的格式给出两个正分数,随后是一个正整数分母 K,其间以空格分隔。题目保证给出的所有整数都不超过 10000。
输出格式:
在一行中按 N/M 的格式列出两个给定分数之间分母为 K 的所有最简分数,按从小到大的顺序,其间以 1 个空格分隔。行首尾不得有多余空格。题目保证至少有 1 个输出。
输入样例:
7/18 13/20 12
输出样例:
5/12 7/12
本题的话再PTA上的分值是20分,不算太难,不过两个地方需要注意:
-
输入的两个正分数要判断一下大小(测试点2),比如输入如下
1/8 1/200 4000
正确的输出应该是:
21/4000 23/4000 27/4000 29/4000 31/4000 33/4000 37/4000 39/4000 41/4000 43/4000 47/4000 49/4000 51/4000 53/4000 57/4000 59/4000 61/4000 63/4000 67/4000 69/4000 71/4000 73/4000 77/4000 79/4000 81/4000 83/4000 87/4000 89/4000 91/4000 93/4000 97/4000 99/4000 101/4000 103/4000 107/4000 109/4000 111/4000 113/4000 117/4000 119/4000 121/4000 123/4000 127/4000 129/4000 131/4000 133/4000 137/4000 139/4000 141/4000 143/4000 147/4000 149/4000 151/4000 153/4000 157/4000 159/4000 161/4000 163/4000 167/4000 169/4000 171/4000 173/4000 177/4000 179/4000 181/4000 183/4000 187/4000 189/4000 191/4000 193/4000 197/4000 199/4000 201/4000 203/4000 207/4000 209/4000 211/4000 213/4000 217/4000 219/4000 221/4000 223/4000 227/4000 229/4000 231/4000 233/4000 237/4000 239/4000 241/4000 243/4000 247/4000 249/4000 251/4000 253/4000 257/4000 259/4000 261/4000 263/4000 267/4000 269/4000 271/4000 273/4000 277/4000 279/4000 281/4000 283/4000 287/4000 289/4000 291/4000 293/4000 297/4000 299/4000 301/4000 303/4000 307/4000 309/4000 311/4000 313/4000 317/4000 319/4000 321/4000 323/4000 327/4000 329/4000 331/4000 333/4000 337/4000 339/4000 341/4000 343/4000 347/4000 349/4000 351/4000 353/4000 357/4000 359/4000 361/4000 363/4000 367/4000 369/4000 371/4000 373/4000 377/4000 379/4000 381/4000 383/4000 387/4000 389/4000 391/4000 393/4000 397/4000 399/4000 401/4000 403/4000 407/4000 409/4000 411/4000 413/4000 417/4000 419/4000 421/4000 423/4000 427/4000 429/4000 431/4000 433/4000 437/4000 439/4000 441/4000 443/4000 447/4000 449/4000 451/4000 453/4000 457/4000 459/4000 461/4000 463/4000 467/4000 469/4000 471/4000 473/4000 477/4000 479/4000 481/4000 483/4000 487/4000 489/4000 491/4000 493/4000 497/4000 499/4000
-
输出的正分数不能包含输入的两个整数!!
1/12 7/12 12
5/12
最终代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<ctype.h>
#include<stdlib.h>
float calculate(int n1,int m1,int k){
float f1=n1*1.0f,f2=m1*1.0f;
f1=f1*k/f2;
return f1;
}
//计算最大公因数
int gcd(int m1,int m2){
//有一方为0直接跳过
if(m1==0||m2==0) return 1;
if(m1<m2){
int temp=m1;
m1=m2;
m2=temp;
}
if(m1%m2==0) return m2;
return gcd(m2,m1%m2);
}
int main(){
int n1,m1,n2,m2,k,i=0;
scanf("%d/%d %d/%d %d",&n1,&m1,&n2,&m2,&k);
float f1=calculate(n1,m1,k);
float f2=calculate(n2,m2,k);
//保证f1是最小值
if(f1>f2){
float temp=f1;
f1=f2;
f2=temp;
}
int ce=ceil(f1),end=floor(f2),sign=1;
//不包括这两个数字本身
if(f1==(int)f1) ce=f1+1;
if(f2==(int)f2) end=f2-1;
for(i=ce;i<=end;i++){
// 排除不是最简分数的项,这里使用最大公因数
if(i==0||gcd(i,k)>1) continue;
if(sign>0){
printf("%d/%d",i,k);
sign=-1;
}
else
printf(" %d/%d",i,k);
}
return 0;
}