您的位置:首页 > 其它

判断素数

2015-12-15 23:11 288 查看
今天被一道大一的素数题给绊了一晚上,我这个心啊,又自卑了

题目是删除数组里的素数,然后输出

看着发过来的程序,我就理解困难了

#include<stdio.h>
int delarr(int a[], int n)
{
int j,k,p,q= 0;
for (k = 0;k <n;k++)//读入十个数字
{
for (j = a[k] / 2;j >= 2;j--)
if (a[k] % j != 0) {//判断是否为素数的循环和条件
for (p = k;p < n;p++)
a[k] = a[k + 1];
a[k] = NULL;
q++;//素数个数啊
}
}printf("最终结果为:\n");
for (k = 0;k < n-q;k++)//n-q意味着目前数组的个数啊,我就日了
printf("%d", a[k]);
return n - q;
}
void main()
{
int i, d[10];
printf("input ten numbers:\n");
for (i = 0;i < 10;i++)
scanf("%d", &(d[i]));
delarr(d, 10);
}
找了半天我才找到俩错误:

if (a[k] % j != 0)

如果是==,那肯定就不是素数,但是改成!=,那就不能判断了
因为在判断过程中这个条件不只是素数可以满足,

比如 8%3,不是素数,但是条件成立了

另外就是

a[k]=a[k+1],改成a[p]=a[p+1](这儿只能说是粗心了,不是程序问题)

经过一番艰难修改,成了这样:
#include<stdio.h>

bool IsPrime(int n) {
int i;
if (n < 2)
return false;
else
{
for (i = 2; i <= n / 2.0; i++)
if (n%i == 0)
{
return false;
}
return true;
}
}

void delarr(int a[], int n)
{
int  j,k, q = 0;
for (k = 0; k <n; k++)//读入十个数字
if (IsPrime(a[k])) {
for (j = k; j < n-1; j++)
a[j] = a[j + 1];
a[j+1] = NULL;
n--;
q++;
k--;      //这条语句是因为把之前的一个元素删掉了,需要再从这儿开始,注意注意
}
printf("素数:%d", q);
printf("最终结果为:\n");
for (k = 0; k < n ; k++)//n-q意味着目前数组的个数啊,我就日了
printf("%d ", a[k]);
}

void main()
{
int i, d[20];
printf("input ten numbers:\n");
for (i = 0; i < 10; i++)
scanf("%d", &(d[i]));
delarr(d, 10);
}


注意k--那儿,一定要加上,原因在上边

另外数组设大一点吧,不然容易数组越界。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: