本帖研究的是小数化分数与分数化小数
小数化分数 :http://acm.hdu.edu.cn/showproblem.php?pid=1717
分数化小数 : http://nanti.jisuanke.com/t/42
这里的小数包括循环小数 循环部分用”()” 括起来 For Example 1/3 = 0.(3) 。。。
小数化分数的性质如下 :
1、有限小数的话把小数点后面的数除以10(一位数).100(两位数).1000(三位数)等,
2、如果是无限循环小数那就把循环的数除以9、99、999(同上)
3、如果是混循环小数,循环数字为两位情况下不循环的数字一位则除以990,两位则9900,并加上不循环小数数值乘以990或者9900。
即:分子=不循环部分和循环部分连起来-不循环部分。分母=99..(循环位数)0..(不循环位数)
小数化分数
小数化分数就是
0.abcd(efghij)
(abcdefghij-abcd)/9999990000 (没有约分)
在代码处理中 应该用字符串输入 ;
还有即使pow函数要慎用。。。
附代码。
—————————————————–
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <cstdio>
#include <string>
#include <iostream>
#include <math.h>
using namespace std;
/*
分子=不循环部分和循环部分连起来-不循环部分。
分母=99..(循环位数)0..(不循环位数)
*/
int gcd(int a,int b)
{
if(b==0) return a;
else return gcd(b,a%b);
}
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
char s[100];
int t;
scanf("%d\n",&t);
while( t-- )
{
scanf("%s",s);
int l=strlen(s);
int kuo=0;
int n1=0,n2=1;
for(int i=2; i<l; i++)
{
n1=n1*10+s[i]-'0';
n2*=10;
if(s[i]=='(')
{
kuo=1;
break;
}
}
if(kuo)
{
int t1=0,t2=0;
int l1=0,l2=0;
int nnnn=1;
int num=0,nu = 0;
int flag=0;
for(int i=2; i<l; i++)
{
if(s[i]>='0'&&s[i]<='9')
{
if(!flag)
{
l1++;
nnnn*=10;
t1=t1*10+s[i]-'0';
}
else
{
num*=10;
nu=nu*10+9;
l2++;
t2=t2*10+s[i]-'0';
}
}
else
{
if(!flag)
num=t1;
num+=t2;
flag=1;
}
}
num-=t1;
nu=nu*nnnn;
int gcdd=gcd(num,nu);
printf("%d/%d\n", num/gcdd, nu/gcdd);
}
else
{
int gc=gcd(n1,n2);
printf("%d/%d\n", n1/gc, n2/gc );
}
}
return 0;
}
分数化小数
这个暂时还没弄明白 ,,莫着急、、、
分数化小数代码
———————————————–