#include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #include<limits.h> char input[20]; __int64 minup,mindown,up,down; __int64 num0,num1; __int64 gcd(__int64 a,__int64 b){//求出最大公约数 if(b==0) return a; else return gcd(b,a%b); } void trim(__int64 &a,__int64 &b){//利用最大公约数化简 __int64 c; while((c=gcd(a,b))!=1){ a/=c; b/=c; } } bool allzero(){ int i; for(i=strlen(input)-4;i>=2;i--){ if(input[i]!='0') return false; } return true; } int main(){ int i,j,k; while(scanf("%s",input) && strcmp(input,"0")!=0){ char temp1[20],temp2[20]; memset(temp2,0,sizeof(temp2)); num0=num1=0; if(allzero()){ printf("0/1\n"); } else{ int st=2,ed=strlen(input)-4; i=j=k=0;minup=0;mindown=INT_MAX; for(i=st;i<=ed;i++){//取出小数点后的所有数字 temp2[j++]=input[i]; } num0=atoll(temp2); i=j=k=0; for(i=st;i<=ed;i++){//循环位数从第i位开始 memset(temp1,0,sizeof(temp1)); j=k=0; up=down=0; int m=ed-i+1;//m个循环数字,意味着m个9 int n=i-st;//n个不循环数字,意味着9后面n个0 for(j=st;j<i;j++){//取出不循环的数字 temp1[k++]=input[j]; } if(i!=st){//有数字不循环 num1=atoll(temp1); }else{num1=0;} up=num0-num1; k=n; for(j=1;j<=m;j++){ down+=9*pow(10,k);k++; } trim(up,down); if(down<mindown){ mindown=down; minup=up; } } printf("%I64d/%I64d\n",minup,mindown); } memset(input,0,sizeof(input)); } return 0; } |
Double click to view unformatted code.