概述
【问题描述】
任何小数都能表示成分数的形式,对于给定的小数,编写程序其化为最简分数输出,小数包括简单小数和循环小数。
【输入形式】
第一行是一个整数N,表示有多少组数据。
每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。
【输出形式】
对每一个对应的小数化成最简分数后输出,占一行
【样例输入】
3
0.(4)
0.5
0.32(692307)
【样例输出】
4/9
1/2
17/52
【题解】
小数化分数的方法:
- 有限小数(如0.12)
取小数部分对应的整数为分子,取小数部分的长度i对应的10i为分母,即12作为分子,100作为分母 - 纯循环小数(如0.121212…)
循环部分作为分母,循环部分长度i对应的10i-1为分母,即12作为分子,99作为分母 - 混循环小数(如0.1121212…)
这类小数化为分数有公式可依,但不好记忆。最为简单的方法是,将混循环小数化为有限小数与纯循环小数之和,那么其对应的分数就是这两部分的分数之和。
对于0.1121212…=0.1+0.0121212…,纯循环小数部分是0.121212…/10的结果,即12/990。 - 无限不循环小数(如pi)
为无理数,无法化成分数
注:循环小数的循环部分必定在最后位置。
不可能出现形如0.(12)3的循环小数,括号内为循环部分。
#include <iostream>
#include <stdlib.h>
#include <cmath>
using namespace std;
//最大公约数
int answer(int m,int n) {
if(m%n==0)
return n;
else
return answer(n,m%n);
}
int main() {
int n,length,left,right;
float num;
string str;
char number[100];
cin>>n;
int on[n],under[n];
for(int i=0; i<n; i++) {
cin>>str;
if(str.find('(')>str.length()||str.find('(')<0) {
length=str.length()-2;
str.copy(number,length+2);
number[str.length()]='