intmain() { // short -2^15 - 2^15 => -32768 - 32767 // 32768 超过 short 范围发生越界 int i = 32768; short s = (short)i; printf("%d\n", s); // -32768 return0; }
intisPrime(int x, int knownPrimes[], int numberOfKnownPrimes);
intmain(int argc, charconst *argv[]) { // 找前10个素数 /* const int number = 10; int prime[number]; for (int i = 0; i < number; i++) { prime[i] = 2; } int i = 3; // 从 3 开始找,1 不是素数,2 是第一个素数 int count = 1; // prime[0] 已经初始化为 2,第一个素数,从 1 开始向右填充数组 while (count < number) { if (isPrime(i, prime, count)) { prime[count++] = i; // prime[count] = i; // count = count + 1; } i++; } */
// inprovement 4:质数的倍数不是质数 constint maxNumber = 10; int isPrime[maxNumber]; // 全部初始化为 1 for (int i = 0; i < maxNumber; i++) { isPrime[i] = 1; }
// 质数的倍数不是质数 for (int x = 2; x < maxNumber; x++) { if (isPrime[x]) { for (int i = 2; i * x < maxNumber; i++) { // 不是质数赋值为 0 isPrime[i * x] = 0; } } }
for (int i = 2; i < maxNumber; i++) { if (isPrime[i]) { printf("%d\t", i); } } printf("\n");
}
// basic // int isPrime(int x) // { // int ret = 1; // if (x == 1) ret = 0; // c 函数一般使用单一出口,不要在这里 return ret; // for (int i = 2; i < x; i++) // { // if (x % i == 0) { // ret = 0; // break; // } // } // return ret; // }
// inprovement 1:除了 2 以外所有的偶数都不是素数 // int isPrime(int x) // { // int ret = 1; // if (x == 1 || (x % 2 == 0 && x != 2)) // ret = 0; // for (int i = 3; i < x; i+=2) // { // if (x % i == 0) { // ret = 0; // break; // } // } // return ret; // }
// inprovement 2: 判断N是否是素数,只需要判断到根号N就可以了 //首先,约数是成对出现的。比如24,你找到个约数3,那么一定有个约数8,因为24/3=8。然后,这对约数必须一个在根号n之前,一个在根号n之后。因为都在根号n之前的话,乘积一定小于n(根号nX根号n=n),同样,都在根号n之后的话,乘积一定大于n。所以,如果你在根号n之前都找不到约数的话,那么根号n之后就不会有了。 // int isPrime(int x) // { // int ret = 1; // if (x == 1 || (x % 2 == 0 && x != 2)) // ret = 0; // for (int i = 3; i < sqrt(x); i+=2) // { // if (x % i == 0) { // ret = 0; // break; // } // } // return ret; // }
// inprovement 3: 如果一个数不能被小于它的任意素整除,那么这个数也是素数 intisPrime(int x, int knownPrimes[], int numberOfKnownPrimes) { int ret = 1; for (int i = 0; i < numberOfKnownPrimes; i++) { if (x % knownPrimes[i] == 0){ ret = 0; } } return ret; }