计算机 C语言 具体见补充

编写函数 int encode(int a[][4]),对二维数组中左下三角的全部元素(包含对角线上的元素)作如下变化
1.若概数不是素数则保持不变。2.若是素数则大于他的最小素数替换概数
如下面这个例子
3 6 4 17
8 5 9 10
12 19 7 20
4 14 21 23经过变化后为

5 6 4 17
8 7 9 10
12 23 11 20
4 14 21 29

以下程序是我自己编的 但运行起来有问题 希望帮忙纠正,若有其他号方法也希望能写一下 不胜感激
#include <stdio.h>
int main()
{
int encode(int a[4][4]);
int prime(int x);
int a[4][4],i,j;
printf("请输入数组A:\n");
for(i=0;i<=3;i++)
for(j=0;j<=3;j++)
scanf("%d",&a[i][j]);
printf("数组A为:\n");
for(i=0;i<=3;i++)
{
for(j=0;j<=3;j++)
printf("%d ",a[i][j]);
printf("\n");
}
encode(a);
printf("变化后为:\n");
for(i=0;i<=3;i++)
{
for(j=0;j<=3;j++)
printf("%d",a[i][j]);
printf("\n");
}
return 0;
}
int prime(int x)
{
int i;
for(i=2;i<=(x-1);i++)
if(x%i==0) break;
if(i>=x) return 1;
else return 0;
}

int encode(int a[4][4])
{
int i,j,b;
for(i=0;i<=3;i++)
for(j=0;j<=i;j++)
if(prime(a[i][j]))
while(1)
{
b=a[i][j]+1;
if(prime(b)) return b;
}
for(i=0;i<=3;i++)
for(j=1;j<=3;j++)
return a[i][j];
}

第1个回答  推荐于2016-10-07
encode()方法里while(1)死循环,一楼正解,有个小错误,isprime()方法应提前,否则编译不通过
#include <stdio.h>
int main()
{
void encode(int a[4][4]);
int isprime(int x);
int a[4][4],i,j;
printf("请输入数组A:\n");
for(i=0;i<=3;i++)
for(j=0;j<=3;j++)
scanf("%d",&a[i][j]);
printf("数组A为:\n");
for(i=0;i<=3;i++)
{
for(j=0;j<=3;j++)
printf("%3d",a[i][j]);
printf("\n");
}
encode(a);
printf("变化后为:\n");
for(i=0;i<=3;i++)
{
for(j=0;j<=3;j++)
printf("%3d",a[i][j]);
printf("\n");
}
return 0;
}

int isprime(int x){
int i;
for (i=2;i<=x/2;i++)
{
if (x%i==0)
{
return 0;
}
}
return 1;
}
int NextPrime(int x){
int i=x;
while (!isprime(++i));
return i;
}

void encode(int a[4][4])
{
int i,j;
for(i=0;i<=3;i++)
for(j=0;j<=i;j++)
if(isprime(a[i][j]))
{
a[i][j]=NextPrime(a[i][j]);
}
}追问

不好意思,再麻烦一下,能在我原来的基础上改一下在运行吗

追答

重点在while循环的判断上,这里的作用和上面程序中的NextPrime()函数类似,并省去了下面不必要的for循环语句,关于代码的可读性,你自己来个对比吧。
#include
int main()
{
int encode(int a[4][4]);
int prime(int x);
int a[4][4],i,j;
printf("请输入数组A:\n");
for(i=0;i=x) return 1;
else return 0;
}

int encode(int a[4][4])
{
int i,j,b;
for(i=0;i<=3;i++)
for(j=0;j<=i;j++)
if(prime(a[i][j]))
while(!prime(++a[i][j]))
{
b=a[i][j]+1;
}
return b;
}

参考资料:楼上

本回答被提问者采纳
第2个回答  2011-07-15
我帮你修改了一下代码
#include <stdio.h>
void encode(int a[4][4]);
int prime(int x);
int NextPrime(int x);
int main()
{
int a[4][4],i,j;
printf("请输入数组A:\n");
for(i=0;i<=3;i++)
for(j=0;j<=3;j++)
scanf("%d",&a[i][j]);
printf("数组A为:\n");
for(i=0;i<=3;i++)
{
for(j=0;j<=3;j++)
printf("%3d",a[i][j]);
printf("\n");
}
encode(a);
printf("变化后为:\n");
for(i=0;i<=3;i++)
{
for(j=0;j<=3;j++)
printf("%3d",a[i][j]);
printf("\n");
}
return 0;
}
int NextPrime(int x)//这里求下一个素数
{
int i=x;
while (!isprime(++i));
return i;
}

int isprime(int x)//这是判断素数函数
{
int i;
for (i=2;i<=x/2;i++)
{
if (x%i==0)
{
return 0;
}
}
return 1;
}

void encode(int a[4][4])
{
int i,j;
for(i=0;i<=3;i++)
for(j=0;j<=i;j++)
if(isprime(a[i][j]))
{
a[i][j]=NextPrime(a[i][j]);
}
}
把函数声明全部放在主函数之前,这样就没有问题了,谢谢 三棵树的阳台 的建议。
相似回答