(PTA 乙级)1062 最简分数

一个分数一般写成两个整数相除的形式: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分,不算太难,不过两个地方需要注意:

  1. 输入的两个正分数要判断一下大小(测试点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
    
  2. 输出的正分数不能包含输入的两个整数!!

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;
}
  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值