中国剩余定理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;} 展开
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;} 展开
1个回答
展开全部
数组下标从0开始
你的int b[N] ; 其可访问的空间数据为b[0]至b[N-1]
你程序中全从1开始,导致内存越界访问,程序运转异常!
先改了试试吧
你的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
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询