【中国の剰余定理】C言語実装

1.C言語コード

コードの説明: (1 回限りの) 合同方程式を解くためのC 言語コード。合同方程式系の定義: (画像は百度百科事典から):
ここに画像の説明を挿入

使用方法:
(1) コンパイルして実行します。

(2) 最初の行に、方程式系の方程式の数rを表す整数を入力します。

(3) 残りのr行には、各方程式系の剰余係数を表す 2 つの整数を各行に入力します

(4) Enter を押して方程式系のを出力します。

使用上の注意: (1) 方程式の剰余と剰余は
大きな整数 (数百桁) ではなく、

(2) 方程式の数は 100 (配列で定義) 以下でなければなりません。そうしないと、配列の添え字がオーバーフローします。

#include <stdio.h>

int reverse(int k, int m);  // 函数,返回k模m的逆元

int main()
{
    
    
	int i;
	int r;       // 方程组中的方程个数 (不能超过100)
	int b[100];  // 余数数组
	int m[100];  // 模数数组
	int mul = 1;
	int M[100];  // M数组
	int M1[100];  // M'数组
	int x = 0;  // 方程组的根
	
//	printf("%d", reverse(3, 7));  // 一行测试代码
	
	scanf_s("%d", &r);  // 选用安全的输入函数,避免可能的栈溢出(攻击)
	for(i = 0;i < r;i ++)
	{
    
    
		scanf("%d %d", &b[i], &m[i]);
		mul *= m[i];
	}
	
	for(i = 0;i < r;i ++)
	{
    
    
		M[i] = mul / m[i];
	}
	
	for(i = 0;i < r;i ++)
	{
    
    
		M1[i] = reverse(M[i], m[i]);
	}
	
	for(i = 0;i < r;i ++)
	{
    
    
		x += M1[i] * M[i] * b[i];
	}
	
	x %= mul;
	
	printf("%d", x);
	
	return 0;
}

int reverse(int k, int m)
{
    
    
	int i;
	for(int i = 1;i < m;i ++)
	{
    
    
		if(k * i % m == 1)
		{
    
    
			return i;
		}
	}
	return -1;
}

2. テストケース

(古代編) 今日、数がわからない物がありますが、四と四の数は葉1、九十九の数は葉2、十一と十一の数は葉3ですが、物はいくつありますか。
(数学バージョン) x = 1 mod 4; x = 2 mod 9; x = 3 mod 11. x を求めます。
ここに画像の説明を挿入

Supongo que te gusta

Origin blog.csdn.net/weixin_43031313/article/details/130303240
Recomendado
Clasificación