
#include<iostream>
#include<string>
#include<math.h>
using namespace std;
//求最大公约数函数
__int64 gcd(__int64 a,__int64 b)
{
__int64 m;
for(m=a%b;m!=0;m=a%b)
{
a=b;
b=m;
}
return b;
}
int main()
{
string input;
while(cin>>input)
{
int indexDot=input.find('.')+1;//小数点的位置
int indexXH=input.find('(');//循环位的位置
bool flag=false;
if(indexXH!=string::npos)
{
flag=true;//说明有循环位
indexXH++;
}
//有限小数转分数
if(!flag)
{
int lenDecimal=input.length()-indexDot;
string decimal=input.substr(indexDot,lenDecimal);
__int64 up=atoi(decimal.c_str());//得到分子
//cout<<lenDecimal<<''<<up<<endl;
__int64 down=pow(10,lenDecimal);
__int64 common=gcd(up,down);
printf("分子是:%I64d\t分母是:%I64d\n",up/common,down/common);
}
//循环小数转分数
else
{
int n=indexXH-indexDot-1;//非循环位的长度
int m=input.length()-indexXH-1;//循环位的长度
string strN=input.substr(indexDot,n);
string strM=input.substr(indexXH,m);
int num1=atoi(strN.c_str());
int num2=atoi(strM.c_str());
//cout<<num1<<''<<num2<<''<<m<<''<<n<<endl;
__int64 up=num1*(pow(10,m)-1)+num2;
__int64 down=(pow(10,m)-1)*pow(10,n);
//printf("%I64d\t%I64d",up,down);
__int64 common=gcd(up,down);
printf("分子是:%I64d\t分母是:%I64d\n",up/common,down/common);
}
}
return 0;
}
扩展资料:
return表示把程序流程从被调函数转向主调函数并把表达式的值带回主调函数,实现函数值的返回,返回时可附带一个返回值,由return后面的参数指定。
return通常是必要的,因为函数调用的时候计算结果通常是通过返回值带出的。如果函数执行不需要返回计算结果,也经常需要返回一个状态码来表示函数执行的顺利与否(-1和0就是最常用的状态码),主调函数可以通过返回值判断被调函数的执行情况。
>> A =[1 2 ;3 4];
>> B=inv(A)
B =
-2.0000 1.0000
1.5000 -0.5000
>> format rat %%%%% 转成分数表示
>> B
B =
-2 1
3/2 -1/2
>> A =[1 2 ;3 4];
>> B=inv(A)
B =
-2.0000 1.0000
1.5000 -0.5000
>> format rat %%%%% 转成分数表示
>> B
B =
-2 1
3/2 -1/2
如果小数点后是两位数就乘以100/100,如0.15=0.15×100/100=15/100=3/20
如果小数点后是三位数就乘以1000/1000以此类推