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 を求めます。