中国剩余定理C语言,下面的程序运行出现错误,哪位C语言高手帮忙看下哪里出错啊,急急急。。。

#include<stdio.h>#defineN3voidmain(){intgcd(inta,intb);//判断是否互素intNi(inta,intb);//求逆i... #include<stdio.h>#define N 3
void main(){ int gcd(int a,int b);//判断是否互素 int Ni(int a, int b);//求逆
int b[N],m[N],y[N],M1[N]; int i,n,M,x,t;
for(i=1;i<=N;i++) { printf("b[%d]=",i); scanf("%d",&b[i]); } printf("\n");
for(i=1;i<=N;i++) { printf("m[%d]=",i); scanf("%d",&m[i]); } printf("\n");
for(M=1,i=2,n=m[1];i<=N;i++) { if(gcd(n,m[i])==1) { for(i=1;i<=N;i++) M=M*m[i]; } else return 0; } printf("M=%d\n",M); printf("\n");
for(i=1;i<=N;i++) { M1[i]=M/m[i]; printf("M1[%d]=%d\n",i,M1[i]); } printf("\n");

for(i=1,y[i]=1;y[i]<=m[i]&&i<=N;i++,y[i]=1) { y[i]=Ni(M1[i],m[i]); printf("y[%d]=%d\n",i,y[i]); } printf("\n");
printf("求解同余方程组:\n"); for(i=1;i<=N;i++) { printf("x=%dmod%d\n",b[i],m[i]); } printf("\n");
t=0; for(i=1;i<=N;i++) { printf("%d,%d,%d\n",b[i],M1[i],y[i]); t+=b[i]*M1[i]*y[i]; printf("%d\n",t); x=t%M; } printf("解为:\nx=%dmod%d\n",x,M);}

int gcd(int a,int b){ int t,k=0; if(a<b) { t=a; a=b; b=t; }
do { k=a%b; a=b; b=k; } while(k!=0); return a;}
int Ni(int a, int b){ int i = 0; while(a*(++i)%b!=1); return i;}
展开
 我来答
kaixingui2012
2013-05-19 · TA获得超过4.2万个赞
知道大有可为答主
回答量:1.4万
采纳率:81%
帮助的人:6426万
展开全部
数组下标从0开始
你的int b[N] ; 其可访问的空间数据为b[0]至b[N-1]
你程序中全从1开始,导致内存越界访问,程序运转异常!
先改了试试吧
追问

改了,但是还是有问题!而且答案也出现问题了。

追答
修改这部分代码:
for(M=1,i=2,n=m[1];i<=N;i++)
{
if(gcd(n,m[i])==1)
{
for(i=1;i<=N;i++)
M=M*m[i];
}
else
return 0;
}
改成如下:
for(i=1;i<N;i++)
{
if(gcd(m[i-1],m[i])!=1)
{
printf("error at m[%d]\n" , i );
return 0;
}
}
for(M=1,i=0;i<N;i++)
M=M*m[i];
另:i不能取到N,所以所有的循环退出条件是i<N而不是i<=N
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式