Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 逆函数工作正常,但如果在while循环之后工作,则会产生错误的答案_C_Greatest Common Divisor_Chinese Remainder Theorem - Fatal编程技术网

C 逆函数工作正常,但如果在while循环之后工作,则会产生错误的答案

C 逆函数工作正常,但如果在while循环之后工作,则会产生错误的答案,c,greatest-common-divisor,chinese-remainder-theorem,C,Greatest Common Divisor,Chinese Remainder Theorem,我试图实现中国剩余定理,为此我应该找到一些数字的乘法逆。函数正常工作,但如果它在while循环之后工作,则会产生错误的结果 #include<stdio.h> #include<stdlib.h> #include<string.h> main(){ int rem[5],div[5],fac[5]; int t = 0; int c = 0; int m = 1; int d = 0; void inv

我试图实现中国剩余定理,为此我应该找到一些数字的乘法逆。函数正常工作,但如果它在while循环之后工作,则会产生错误的结果

#include<stdio.h>
#include<stdlib.h>
#include<string.h>    
main(){
    int rem[5],div[5],fac[5];
    int t = 0;
    int c = 0;
    int m = 1;
    int d = 0;
    void inverse(int,int);
    //take remainder and divider from user
    while ((rem[t] != -1)  & (div[t] != -1))
    {
        printf("Enter remainder and divider in an order(-1 -1 to finish):");
        scanf_s("%d" "%d", &rem[t], &div[t]);
        if (rem[t] != -1 & div[t] != -1)
            t++;
        else {
            printf("You ask to stop! Thank you.\n");
            div[t] = -1;
            rem[t] = -1;
        }
    }

    while ((div[c] != -1) & (rem[c] != -1)) {/* print until face null character */
        printf("%d . character is %d and %i\n", c + 1,rem[c], div[c]);
        m = m*div[c];
        c++;
    }
    printf(" m is %d\n", m);

    //implement crt algorithm
    while ((div[d] != -1) & (rem[d] != -1)) {
        fac[d] = m/div[d];
        printf(" m(%d) is %d\n",d+1, fac[d]);
        inverse(div[d], fac[d]);
        d++;
    }

    inverse(5,21);//this lines works if I first enter -1 -1 
    inverse(7,15);
    system("pause");
    //return 0;
}
//this is for finding gcd and inverse
int a, b, i;
int k = 1;
int q[10];
int r[10];
int x[10];
int y[10];

void inverse(int a, int b){
    q[1] = (a / b);
    r[1] = a%b;
    q[0] = a;
    r[0] = b;
    //find gcd of two numbers
    while (r[k] != 0){
        k = k++;
        q[k] = r[k - 2] / r[k - 1];
        r[k] = r[k - 2] % r[k - 1];
    }
    printf("gcd of %d and %d is: %d\n", a, b, r[k - 1]);
    //check whether these two numbers are relatively prime,if it is then find inverse
    if (r[k - 1] != 1)
        printf("These two numbers should be relatively prime\n");
    else{
        x[k - 1] = -q[k - 1];
        y[k - 1] = 1;
        i = k - 1;

        while (i > 1){
        x[i - 1] = -x[i] * q[i - 1] + y[i];
        y[i - 1] = x[i];
        i = i - 1;
        }
        //check whether the inverse of number is less than 0, if it is then add the modulo
        if ((x[1] % a) < 0)
        printf("multiplicative inverse of %d in mod %d is %d\n", b, a, (x[1] % a) + a);

        else
        printf("multiple inverse of %d in mod %d is %d\n", b, a, x[1] % a);

    }
}
#包括
#包括
#包括
main(){
国际货币基金组织[5],部门[5],外交部[5];
int t=0;
int c=0;
int m=1;
int d=0;
无效逆(int,int);
//从用户处获取余数和除法器
while((rem[t]!=-1)和(div[t]!=-1))
{
printf(“按顺序输入余数和除法器(-1-1完成):”;
扫描(“%d”%d“,&rem[t],&div[t]);
如果(rem[t]!=-1和div[t]!=-1)
t++;
否则{
printf(“您要求停止!谢谢您。\n”);
div[t]=-1;
rem[t]=-1;
}
}
而((div[c]!=-1)和(rem[c]!=-1)){/*打印到面空字符*/
printf(“%d.字符为%d和%i\n”,c+1,rem[c],div[c]);
m=m*div[c];
C++;
}
printf(“m是%d\n”,m);
//crt算法的实现
while((div[d]!=-1)和(rem[d]!=-1)){
fac[d]=m/div[d];
printf(“m(%d)是%d\n”,d+1,fac[d]);
逆(div[d],fac[d]);
d++;
}
逆(5,21);//如果我首先输入-1-1,这行就可以工作
逆(7,15);
系统(“暂停”);
//返回0;
}
//这是为了求gcd和逆
int a,b,i;
int k=1;
int q[10];
int r[10];
int x[10];
int y[10];
无效反向(整数a,整数b){
q[1]=(a/b);
r[1]=a%b;
q[0]=a;
r[0]=b;
//查找两个数字的gcd
while(r[k]!=0){
k=k++;
q[k]=r[k-2]/r[k-1];
r[k]=r[k-2]%r[k-1];
}
printf(“%d和%d的gcd是:%d\n”,a,b,r[k-1]);
//检查这两个数是否是相对素数,如果是则求逆
如果(r[k-1]!=1)
printf(“这两个数字应该是相对素数\n”);
否则{
x[k-1]=-q[k-1];
y[k-1]=1;
i=k-1;
而(i>1){
x[i-1]=-x[i]*q[i-1]+y[i];
y[i-1]=x[i];
i=i-1;
}
//检查数字的倒数是否小于0,如果是,则添加模
如果((x[1]%a)<0)
printf(“mod%d中%d的乘法逆是%d\n”,b,a,(x[1]%a)+a);
其他的
printf(“mod%d中%d的多重逆是%d\n”,b,a,x[1]%a);
}
}

我看到的主要问题是使用
intk=1在全局范围内。如果在反向方法(
k=1
)中初始化
k
),则不会继续引用以前的计算


另外,我不确定C的语义,但在Java
k=k++实际上不会增加
k
。您可能只需要
k++

您确定所有while循环中都应该有一个
&
?你知道
&
&
之间的区别吗?首先,谢谢你的回答。我删除了第二个表达式,但它给出了相同的答案我从来没有想过。。。但是,由于赋值k=k首先发生,后增量发生在旧的k上,我猜这在C中也不起作用。非常感谢。我在倒数中使用int k,现在它起作用了。没问题,这看起来很有趣。