1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
| #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> using namespace std; const int MAXN = 1010;
int GCD(int a,int b) { if(b == 0) return a; return GCD(b,a%b); }
int A[MAXN],B[MAXN],C[MAXN*10];
int main() { int N; while(~scanf("%d",&N)) { for(int i = 0; i < N; ++i) scanf("%d",&A[i]); memset(B,0,sizeof(B)); memset(C,0,sizeof(C)); B[0] = 1; int a,b,gcd,fm = 0,k; for(int i = 1; i < N; ++i) { if(A[i] != A[0]) { b = A[i]*A[0]; a = abs(A[i]-A[0])*2; gcd = GCD(a,b); a /= gcd;//约分 b /= gcd;//约分 fm = GCD(a,fm);//迭代求n个分母最大公约数 for(int j = 2; b > 1; ++j)//分解质因数 { if(b % j == 0) { k = 0; while(b % j == 0){ b /= j; k++; } if(k > C[j]) //C[] 数组记录素因子的幂 对应的最大值 C[j] = k; } } } } int tmp; for(int i = 0; i < MAXN*10; ++i)//大数乘法迭代求n个数最小公倍数 { for(int j = 0; j < C[i]; ++j) { tmp = 0; for(int k = 0; k < MAXN; ++k) { B[k] = B[k]*i + tmp; tmp = B[k] / 10000; B[k] %= 10000; } } } int i = 999; while(i > 0 && B[i] == 0) i--; printf("%d-",B[i]); for(--i; i >= 0; --i) printf("%04d+",B[i]); printf(" %d,\n",fm); } return 0; }
|