原题链接:
解法:
打表找规律
可知分子1 2 6 30 210......发现后一个等于前一个乘以2,3,5,7......还可以发现分母1 3 12 72 576.。。。发现后一个等于前一个乘以3,4,6,8......(也就是分子对应的质数加1)那么接下来就是大数问题了Java代码如下:(真的简短粗暴啊!)1 //package 实验; 2 import java.math.BigInteger; 3 import java.util.Scanner; 4 import java.util.*; 5 import java.io.*; 6 import java.math.*; 7 public class Main { 8 static int[] p=new int[5050]; 9 static int[] p1=new int[5050];10 static int[] vis=new int[5050];11 static int cnt=0;12 public static void init() {13 for(int i=2;i<=5000;i++) {14 if(vis[i]==1)continue;15 p[++cnt]=i;16 p1[cnt]=i+1;17 for(int j=i;j<=5000;j+=i) {18 vis[j]=1;19 }20 }21 }22 public static void main(String [] args){23 init();24 int T;25 Scanner sc=new Scanner(System.in);26 T=sc.nextInt();27 while(true) {28 BigInteger n=sc.nextBigInteger();29 BigInteger x=BigInteger.valueOf(1);30 BigInteger x1=BigInteger.valueOf(1);31 BigInteger y=BigInteger.valueOf(1);32 BigInteger y1=BigInteger.valueOf(1);33 BigInteger z=BigInteger.valueOf(1);34 for(int i=1;i<=cnt;i++) {35 //System.out.println(x);36 y=x;37 y1=x1;38 x=x.multiply(BigInteger.valueOf(p[i]));39 x1=x1.multiply(BigInteger.valueOf(p1[i]));40 if(n.compareTo(x)==-1)break;41 }42 z=y.gcd(y1);43 y=y.divide(z);44 y1=y1.divide(z);45 System.out.println(y+"/"+y1);46 T--;47 if(T<=0)break;48 }49 sc.close();50 }51 }
C++代码:(这个有点迷,计算客可以过,cf交上去过不了,慎用)
1 #include2 using namespace std; 3 typedef long long ll; 4 const int L=5010; 5 string add(string a,string b) 6 { 7 string ans; 8 int na[L]={ 0},nb[L]={ 0}; 9 int la=a.size(),lb=b.size(); 10 for(int i=0;i lb?la:lb; 13 for(int i=0;i =0;i--) ans+=na[i]+'0'; 16 return ans; 17 } 18 string mul(string a,string b) 19 { 20 string s; 21 int na[L],nb[L],nc[L],La=a.size(),Lb=b.size();//na存储被乘数,nb存储乘数,nc存储积 22 fill(na,na+L,0);fill(nb,nb+L,0);fill(nc,nc+L,0);//将na,nb,nc都置为0 23 for(int i=La-1;i>=0;i--) na[La-i]=a[i]-'0';//将字符串表示的大整形数转成i整形数组表示的大整形数 24 for(int i=Lb-1;i>=0;i--) nb[Lb-i]=b[i]-'0'; 25 for(int i=1;i<=La;i++) 26 for(int j=1;j<=Lb;j++) 27 nc[i+j-1]+=na[i]*nb[j];//a的第i位乘以b的第j位为积的第i+j-1位(先不考虑进位) 28 for(int i=1;i<=La+Lb;i++) 29 nc[i+1]+=nc[i]/10,nc[i]%=10;//统一处理进位 30 if(nc[La+Lb]) s+=nc[La+Lb]+'0';//判断第i+j位上的数字是不是0 31 for(int i=La+Lb-1;i>=1;i--) 32 s+=nc[i]+'0';//将整形数组转成字符串 33 return s; 34 } 35 int sub(int *a,int *b,int La,int Lb) 36 { 37 if(La =0;i--) 41 if(a[i]>b[i]) break; 42 else if(a[i] =0;i--) 51 if(a[i]) return i+1;//返回差的位数 52 return 0;//返回差的位数 53 54 } 55 string div(string n1,string n2,int nn)//n1,n2是字符串表示的被除数,除数,nn是选择返回商还是余数 56 { 57 string s,v;//s存商,v存余数 58 int a[L],b[L],r[L],La=n1.size(),Lb=n2.size(),i,tp=La;//a,b是整形数组表示被除数,除数,tp保存被除数的长度 59 fill(a,a+L,0);fill(b,b+L,0);fill(r,r+L,0);//数组元素都置为0 60 for(i=La-1;i>=0;i--) a[La-1-i]=n1[i]-'0'; 61 for(i=Lb-1;i>=0;i--) b[Lb-1-i]=n2[i]-'0'; 62 if(La
=0;i--)//将除数扩大10^t倍 67 if(i>=t) b[i]=b[i-t]; 68 else b[i]=0; 69 Lb=La; 70 for(int j=0;j<=t;j++) 71 { 72 int temp; 73 while((temp=sub(a,b+j,La,Lb-j))>=0)//如果被除数比除数大继续减 74 { 75 La=temp; 76 r[t-j]++; 77 } 78 } 79 for(i=0;i
=0) s+=r[i--]+'0'; 82 //cout< <85 while(i>=0) v+=a[i--]+'0'; 86 if(v.empty()) v="0"; 87 //cout< < 0){123 h[c++]=k%10+'0';124 k/=10;125 }126 h[c]='\0';127 for(int i=0;i y.length())return 1;133 else if(x.length() y[i])return 1;137 if(x[i] >T;169 while(T--){170 cin>>s;171 if(s=="1"){172 printf("1/1\n");173 continue;174 }175 int id=0;176 for(int i=1;i<=100;i++){177 if(!ok(s,m[i])){178 id=i-1;179 break;180 }181 }182 string z=gcd(m[id],m1[id]);183 string x=div(m[id],z,1);184 string y=div(m1[id],z,1);185 cout< <<"/"< <