fracción decimal 2--2.007 provincia de sesión de entrenamientos del equipo de carreras (2)

fracción decimal de
Ray escuchar en clase de matemáticas el profesor dijo, se puede expresar en términos de cualquier fracción decimal, comenzó una tecnología, y pronto hubo terminado, pero pensó un problema, cómo poner en una fracción decimal periódico qué?
tienes que escribir un programa que no sólo se lo ordinario en la mayoría de las fracciones decimales simples, decimales también se puede poner en la fracción más simple.

De entrada
de la primera línea es un número entero N, el número de conjuntos de datos.
Cada conjunto de datos de sólo una fracción decimal, la parte de número entero es cero. Decimal no más de 9 dígitos, con la parte de bucle () cerrado.
Salida
de la fracción más sencillo correspondiente a cada uno de la salida en decimal, por línea.

Muestra de entrada
3
0,5 (4)
0,5
0,32 (692,307)
de salida de la muestra
4/9
1/2
17/52

Código AC

/*
教训:
一定要多列出几个例子,不能只列出一两个例子,容易出错,耽误时间!
解题思路:
有限小数
0.1 = 1/10;
0.2 = 2/10;
0.88 = 88/100;

循环小数
0.(1) = 1/9;
0.(123) = 123/999 = 41/333;
0.(2132) = 2132/9999;

混循环小数
0.3(4) = 3/10 + 4/90;
0.33(4) = 33/100 + 4/900; 
0.33(44) = 33/100 + 44/9900
记录,开始写错了,一定要多列出几个,当时只列出了两个混循环小数,以为第二个分母只是90,900,90000之类
没想到是9900,900,99990,之类的规律

公式
0.a(b) = a/(10^a.length) + b/(9...9*10^a..length)
此处9的数量取决于混循环小数的位数

*/

#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <sstream>
#include <cmath>
using namespace std;

string num;

//求有几个9,例如参数为2则返回99
long long getNine(int size) 
{
	int n = 0;
	while (size--)
	{
		n = n * 10 + 9;
	}
	return n;
}
//求公约数
long long getYue(long long num1, long long num2)
{
	long long tmp;
	if (num1 < num2)
	{
		tmp = num1;
		num1 = num2;
		num2 = tmp;
	}
	while (num2 != 0)
	{
		tmp = num1 % num2;
		num1 = num2;
		num2 = tmp;
	}
	return num1;
}
//求公倍数
long long getBei(long long num1, long long num2)
{
	long long yue = getYue(num1, num2);
	return num1 *num2 / yue;
}

int main()
{
	int n;
	cin >> n;
	while (n--)
	{
		string a, b;
		cin >> num;
		int i;
		for (i = 2; i < num.length(); i++)
		{
			if (num[i] != '(')
			{
				a += num[i];
			}
			else break;
		}

		for (i++; i < num.length(); i++)
		{
			if (num[i] != ')')
			{
				b += num[i];
			}
			else break;
		}
		
		//其实,有限小数,循环小数,还有混循环小数可以写在一起,这个就交给你们了!!!加油!!!朕乏了~
		if (a.length() != 0 && b.length() != 0)//a,b同时不为0的情况,最复杂
		{
			//公式 0.a(b) = a / (10 ^ a.length) + b / (9...9 * 10 ^ a..length)
			/*
			混循环小数
			0.3(4) = 3/10 + 4/90;
			0.33(4) = 33/100 + 4/900; 
			0.33(44) = 33/100 + 44/9900
			*/
			long long numA, numB;
			//字符串转换成数字
			stringstream turnA, turnB;
			turnA << a; turnA >> numA;
			turnB << b; turnB >> numB;

			long long numAF = pow(10, a.length());
			long long numBF = getNine(b.length()) * pow(10, a.length());

			//求出分母最小公倍数,方便计算两个分数的和
			long long zuiXiaoGongBeiShu = getBei(numAF, numBF);
			long long beiA = zuiXiaoGongBeiShu / numAF;
			long long beiB = zuiXiaoGongBeiShu / numBF;

			numA = beiA * numA;
			numAF = beiA *numAF;
			numB = beiB * numB;
			numBF = beiB * numBF;
			
			//两分数相加
			long long fenzi = numA + numB;
			long long fenmu = numAF;

			long long yueFenShu = getYue(fenzi, fenmu);


			cout << fenzi / yueFenShu << "/" << fenmu / yueFenShu << endl;;


		}
		else if (a.length() == 0 && b.length() != 0)
		{
			long long numB;
			stringstream turnB;
			turnB << b;
			turnB >> numB;

			long long numBF = getNine(b.length());

			long long yue = getYue(numB, numBF);
			numB = numB / yue;
			numBF = numBF / yue;
			
			cout << numB << "/" << numBF << endl;
		}
		else if (a.length() != 0 && b.length() == 0)
		{
			long long numA;
			stringstream turnA;
			turnA << a;
			turnA >> numA;

			long long numAF = pow(10, a.length());

			long long yue = getYue(numA, numAF);
			numA = numA / yue;
			numAF = numAF / yue;

			cout << numA << "/" << numAF << endl;
		}
	}
	
	return 0;
}

Publicado 40 artículos originales · alabanza ganado 50 · vistas 4696

Supongo que te gusta

Origin blog.csdn.net/qq_43800455/article/details/105357668
Recomendado
Clasificación