#include <stdio.h>
#include <string.h>
#define true 1
#define false 0
#define max 100000
int zhishu_1( long int *str)
{
long int c;
int i=0;
int k=0;
int j=0;
int len=0;
int num=0;
long int *temp;
long int *p;
temp=str;
while(*(str++)!=0)
{
len++;
}
str=temp;
printf("%d is length\n",len);
// code section 1
for(k=3;k<len;k++)
{
for(i=2;i<=k;i++)
{
if(*(str+k)%i==0)
{
*(str+k)=0;
}
}
}
//code section 2
/*
for(k=3;k<len;k++)
{
for(j=1;j<=k;j++)
{
if(*(str+k)%*(str+j)==0)
{
*(str+k)=0;
}
}
}
*/
printf("step 1 is done\n");
str=temp;
for(k=1;k<len-1;k++)
{
if(*(str+k)!=0)
{
num++;
}
}
printf("%d= is zhishu geshu ",num);
}
int main()
{
long int buf[max];
int x,y;
for(x=1;x<=max;x+=1)
{
buf[x-1]=x;
}
zhishu_1(buf);
return 0;
}
问题点在于 code section2 的(str+k)%(str+j)这里如果j<=1,也可以正常运行,大于1就运行无结果,返回值是一个long int 的大小。
temp=str;
while(*(str++)!=0)
{
len++;
}
str=temp;
printf("%d is length\n",len);
这段代码计算数组的长度,用 while(*(str++)!=0)判断数组是否结束错误的,数组的长度可以用函数形参传递过来。
//code section 2
/*
for(k=3;k<len;k++)
{
for(j=1;j<=k;j++)
{
if(*(str+k)%*(str+j)==0)//*(str+k) ==>str[k]
{ //*(str+j) ==>str[j]
*(str+k)=0;
}
}
}
*/
方法是看这个数能不能整除2到n-1之间的数,但是使用指针整除指针时取余,这两个指针都指向同一数组,会出现str[k]%0的情况,所以这个方法是错误的。