Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
纯数学解决的方法从某个地方找到的解题报告: 题目大意是求n=x^p的最大p值,n、x、p均为整数。 p的最大值即为x的所有素数因子的个数的最大公约数。如果n为负数且p可整除2则需一直整除直到无法整除为止。 下面是我的代码,方法差不多了,不知道为什么还AC不了,大虾给点测试数据或者指点一下吧 #include <stdio.h> #include <math.h> #define PSIZE 6542 int primes[PSIZE]; int m[64]; int pos[64]; int st; int gcd(int a,int b) { if (b==0) return a; else return gcd(b, a % b); } int mgcd(int* arr, int size) { int ret = arr[0]; int i; for(i = 0; i < size; i++) { ret = gcd(ret, arr[i]); } return ret; } void CreatePrime() { int cnt; int to = 65536; bool good; int m; int i, j; cnt = 0; for(i = 2; i <= to; i++) { m = (int)sqrt(i); good = true; for(j = 0; j < cnt && primes[j] <= m; j++) { if(i % primes[j] == 0) { good = false; } } if(good) { primes[cnt++] = i; } } } int main() { int x; bool p; int i; int count; int sqx; int r; CreatePrime(); while(scanf("%d", &x) != EOF && x != 0) { p = (x > 0); x = (x > 0) ? x : -x; st = 0; sqx = (int)sqrt(x); for(i = 0; i < PSIZE && primes[i] <= sqx; i++) { count = 0; while(x % primes[i] == 0) { x = x / primes[i]; count ++; } if(count > 0) { m[st] = primes[i]; pos[st] = count; st++; } } if(x != 1) { m[st] = x; pos[st] = 1; st++; } r = mgcd(pos, st); if(!p) { while(r % 2 == 0) r /= 2; } printf("%d\n", r); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator