ZZULIOJ 2474: 数学家

24 篇文章 0 订阅

题目描述
X星球的人都对数学的研究都非常热衷。认为数学支配着宇宙。并且数学和音乐是每个文明共同的"语言"。
在那场与Y星球的星际大战。战争持续了几千年。经历了 几百代人,以至于都忘记了战争发生的原因。
最后双方都决定同归以尽。双方发射了所有的暗物质武器。足以摧毁整个星系。
可是并没有发生预想中的毁灭。而是发射到 空中的武器瞬间全消失了。
反而在交战区飘来一块绝对光滑的石碑。两个星球用尽所有的最先进的精确仪器测出来石碑的长与宽
的比值恒定是3:1。显然这个石碑的制作者是另一个更高级的文明。长与宽恒定3:1只是向他们
展示他们文明力量的一种方式也是对双方停战的一种威慑。
所以两个星球就此停战了。不在战争中一较高下。而是想在科技上赶超对方。
你的朋友Math是X星球上的数学家,现在他正在研究一个小数的性质:
定义一个小数(0.a), 定义(0.a)*b=c (a, b, c为正整数)。数据保证:0<b<long long
他希望你能帮他找到满足条件的最小正整数b,并且用c/b来表示这个小数0.a。
( 会不会和gcd()有什么关系呢?疯狂暗示(逃 )
输入
多样例测试
第一行输入一个整数T(1<=T<=10^5)
接下来的n行每行输入一个小数a (0<a<10^18, a不含前导0)
输出
输出c/b来表示这个小数(b为满足条件的最小正整数)
样例输入
2
0.2
0.5678
样例输出
1/5
2839/5000

我的思路是,把这个小数转化成n/m,n,m都是整数,m就是他小数后多少位。例如0.3可以转化成3/10, 0.33可以转化成33/100, 0.333就是333/1000; 然后求他俩的最大公约数然后再除以他。找最大公约数用辗转相除法就不会超时了。

#include<stdio.h>
long long gcd(long long m, long long n){
	long long x;
	while (m%n != 0){
		x = m%n;
		m = n;
		n = x;
	}
	return n;
}
int main(){
	int t;
	long long a, i;
	scanf("%d", &t);
	char z, x;
	getchar();
	while (t--){
		scanf("%c%c%lld", &z, &x, &a);            //这里用z和x两个字符抵消0和.
		int len = 0, k = a;
		while (a){
			a /= 10;
			len++;
		}
		long long  int sum = 1;
		while (len--)
			sum *= 10;                     //求分母
		i = gcd(sum, k);                 //求最大公约数
		printf("%lld/%lld\n", k / i, sum / i);
		getchar();
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值