POJ1930 Dead Fraction 数学

        这题是个数学题,就是给一个循环小数,出现循环的部分用"..."给代替了,但是重点是,循环的部分可能是最后一位,也可能是最后两位,三位.....(感觉题意不清,可能是自己英文不好。)然后将他们划成分数,只写出分母最小的分数。还要注意的是,化成的分数都是最简分数。

         记得在小学还是初中的时候,看到一本书上教你快速的将无限循环小数化成分数后然后拿到同学面前去炫耀。。。当时很感兴趣,所以就学会了如何转化的方法。

方法很简单,就是将循环小数 乘以10的多少次方再减去它乘以10的另一个次方以达到将无限循环部分约去的目的就行了。

#ifndef HEAD
#include <stdio.h>
#include <vector>
#include <math.h>
#include <string.h>
#include <string>
#include <iostream>
#include <queue>
#include <list>
#include <algorithm>
#include <stack>
#include <map>

using namespace std;
#endif // !HEAD

#ifndef QUADMEMSET
inline void QuadMemSet(void* dst, int iSize, int value)
{
	iSize = iSize / 4;
	int* newDst = (int*)dst;
#ifdef WIN32
	__asm
	{
		mov edi, dst
			mov ecx, iSize
			mov eax, value
			rep stosd
	}
#else
	for (int i = 0; i < iSize; i++)
	{
		newDst[i] = value;

	}
#endif
}
#endif

long long gcd(long long a, long long b)
{
	long long tmp = max(a, b);
	long long tmp1 = min(a, b);
	a = tmp;
	b = tmp1;
	long long c;
	do
	{
		c = a % b;
		a = b;
		b = c;
	} while (c != 0);
	return a;
}

int main()
{
#ifdef _DEBUG
	freopen("d:\\in.txt", "r", stdin);
#endif
	char szBuffer[20];
	while (scanf("%s\n", szBuffer) != EOF)
	{
		if (strlen(szBuffer) == 1 && szBuffer[0] == '0')
		{
			break;
		}
	
		int iall = 0;
		int i = 2;
		for (; i < strlen(szBuffer); i++)
		{
			if (szBuffer[i] == '.')
			{
				break;
			}
			iall = iall * 10 + szBuffer[i] - '0';
		}
		i -= 2;
		int min1, min2;
		min2 = 1000000000;
		int tmp =0 ;
		int left = iall;
		if (left == 0)
		{
			printf("0/1\n");
			continue;
		}
		for (int l = 1; l <= i;l++)
		{
			tmp = (int)(pow((double)10, i) - (int)pow((double)10,i - l));
			left = iall - (int)(iall / (int)(pow((double)10, l)));
			int igcd = gcd(tmp, left);
			if (tmp / igcd < min2)
			{
				min1 = left / igcd;
				min2 = tmp / igcd;
			}
		}

		
		printf("%d/%d\n", min1, min2);
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值