#define __STDC_WANT_LIB_EXTl__ 1 #include <stdio.h> #include <stdlib.h> typedef enum {false=0,true=1}bool; unsigned long long *pPrimes =NULL; unsigned long long limit =0LL; bool found =false; int count=0; int i; size_t capacity =10; #define CAP_INCR 9 unsigned long long trial; unsigned long long *pTemp; //把定义都他妈放前面,省的报错,赋值可以以后在弄,定义一定要现在!!! int main(void) { printf("Enter the upper limit for primes............."); scanf_s("%LLU",&limit); //输入unsigned是一种很长的数据类型%llu是他的形式。这里LLU大小写无所谓。 pPrimes=calloc(capacity,sizeof(unsigned long long )); //pPrimes是一个指针,calloc初始化分配内存.数量为capacity,每个大小为sizeof(...) if(!pPrimes) { printf("Not enough ,memory...."); return 1; } //检验分配的内存空不空,如果pPrimes==0 那么!(pPrimes)=true *pPrimes=2ULL; *(pPrimes + 1)=3ULL; *(pPrimes +2 )=5ULL; //pPrimes 就是启始地址 pPrimes+1表示下一个元素地址 count = 3; trial=*(pPrimes +2)+2ULL;//就是7ULL pTemp=NULL; while (trial<=limit) { for (i=1;i<count;i++)//遍历之前质数 { if(!(found=(trial%*(pPrimes+i))))//如果发现可以整除某个之前的质数.也就是这个数不是我们要的质数。 break; } if (found)//与上面相反,是质数 { if(count==capacity)//capacity是我们给的上限,只有10个,假如count到达10个后,内存就不够用了,这时候重新分配内存 { capacity += CAP_INCR;//再来9个单位的空间! pTemp=realloc(pPrimes,capacity*sizeof(unsigned long long ));//重新分配 if(!pTemp)//检验分配是否成功 { printf("Unfortunately memory reallocation failed. "); free(pPrimes); pPrimes=NULL; return 2; } pPrimes=pTemp;//还给他 } *(pPrimes+count++)=trial;//把这个数储存到pPrimes分配的内存里,并且是下一个空间 } trial +=2ULL;//进入下一个奇数 } printf("%d primes found up to %llu ",count,limit); for (i=0;i<count;++i) { printf("%12lld",*(pPrimes + i)); if(!(i+1)%5) printf(" "); }//五个一行的打印 printf(" "); free(pPrimes); pPrimes=NULL; system("pause"); return 0; }