因为同余的性质,所以可以保证%n之后答案不变。 第二个用到素数筛选法。素数筛选法的原理是筛去素数的倍数,由于是从小循环到大的,所以当前的值没被筛掉的话,则一定是素数, 这个判断导致复杂度不是n的平方。
poj 2551 代码: #include <stdio.h> int main() { int nN; while (scanf("%d", &nN) == 1) { int nCnt = 1; int nTemp = 1; while (1) { if (nTemp % nN == 0)break; else nTemp = (nTemp * 10 + 1) % nN; ++nCnt; } printf("%d\n", nCnt); } return 0; } poj 2262 代码: #include <stdio.h> #include <string.h> #include <math.h>
#define MAX (1000000 + 10) bool bPrime[MAX]; void InitPrime() { memset(bPrime, true, sizeof(bPrime)); bPrime[0] = bPrime[1] = false; for (int i = 2; i <= MAX; ++i) { if (bPrime[i]) for (int j = 2 * i; j <= MAX; j += i) { bPrime[j] = false; } } }
int main() { int nN; InitPrime(); while (scanf("%d", &nN), nN) { int i; for (i = 2; i < nN; ++i) { if (i % 2 && (nN - i) % 2 && bPrime[i] && bPrime[nN - i]) { printf("%d = %d + %d\n", nN, i, nN - i); break;www.2cto.com } } if (i == nN) { printf("Goldbach's conjecture is wrong.\n"); } } return 0; }
|