#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.\n");
free(pPrimes);
pPrimes=NULL;
return 2;
}
pPrimes=pTemp;//还给他
}
*(pPrimes+count++)=trial;//把这个数储存到pPrimes分配的内存里,并且是下一个空间
}
trial +=2ULL;//进入下一个奇数
}
printf("%d primes found up to %llu \n",count,limit);
for (i=0;i<count;++i)
{
printf("%12lld",*(pPrimes + i));
if(!(i+1)%5)
printf("\n");
}//五个一行的打印
printf("\n");
free(pPrimes);
pPrimes=NULL;
system("pause");
return 0;
}