今天被一道大一的素数题给绊了一晚上,我这个心啊,又自卑了
题目是删除数组里的素数,然后输出
看着发过来的程序,我就理解困难了
#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)
如果是==,那肯定就不是素数,但是改成!=,那就不能判断了
另外就是
a[k]=a[k+1],改成a[p]=a[p+1](这儿只能说是粗心了,不是程序问题)
经过一番艰难修改,成了这样:
注意k--那儿,一定要加上,原因在上边
另外数组设大一点吧,不然容易数组越界。。
如果是==,那肯定就不是素数,但是改成!=,那就不能判断了
因为在判断过程中这个条件不只是素数可以满足,
比如 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--那儿,一定要加上,原因在上边
另外数组设大一点吧,不然容易数组越界。。