杭电1717

杭电1717:
比如说0.32(692307),设sum1=32,fm_sum1=100,sum2=692307,fm_sum2=999999.
满足如下公式:(sum1+sum2/fm_sum2)/fm_sum1;
通过在过程中不断约分,可以优化算法,代码如下:

#include <stdio.h>
#include <string.h>
#include <math.h>
int func1(int *a,int k);
int func2(int l);
int func3(int l);
int gcd(int a,int b){
	return !b?a:gcd(b,a%b);
}
int main()
{
		int T;
		while(~scanf("%d",&T))
		{
		while(T--){
		char  n[100];
	 	int j=0,i,a[100]={0},k=0,b[100]={0};
		scanf("%s",n);
	 	for(i=2;i<strlen(n);i++){
		 		if(n[i]=='('){
		 			for(int z=i+1;n[z]!=')';z++){
			 		a[k++]=n[z]-'0';			 		
				 	}
			 	}
			 	if(k){
		 			break;
		 		}
			b[j++]=n[i]-'0';
	 	}
	 	int sum2=func1(a,k);
	 	int sum1=func1(b,j);
	 	int fm_sum2=func2(k);
	 	int fm_sum1=func3(j);
		int t =gcd(sum2,fm_sum2);
		sum2/=t;fm_sum2/=t;
		int fz=sum1*fm_sum2+sum2;
		int fm=fm_sum2*fm_sum1;
		t=gcd(fz,fm);
		fz/=t;fm/=t;
		printf("%d/%d\n",fz,fm);		
		}		
		}

	return 0;
}
int func1(int *a,int k)
{
	int i,sum=0;
	for(i=0;i<k;i++){
		sum += a[i]*pow(10,k-i-1);
	}
	return sum;
}
int func2(int l)
{
	if(l==0){
	return 1;	
	}
	l--;
	int sum=9;
	while(l--){
		sum=sum*10+9;
	}
	return sum;
}
int func3(int l)
{
	int sum=1;
	while(l--){
		sum*=10;
	}
	return sum;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值