From 4022e5c95210631e4aceb08eaf9d9071aa5aefc4 Mon Sep 17 00:00:00 2001 From: Richard Qin Date: Tue, 15 Sep 2026 08:16:43 +0800 Subject: Set up a git repo --- tests/upload/matrix-1.sy | 309 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 309 insertions(+) create mode 100644 tests/upload/matrix-1.sy (limited to 'tests/upload/matrix-1.sy') diff --git a/tests/upload/matrix-1.sy b/tests/upload/matrix-1.sy new file mode 100644 index 0000000..e8d4131 --- /dev/null +++ b/tests/upload/matrix-1.sy @@ -0,0 +1,309 @@ +int map1[110][110], i, j, k, l, m, n, p, vis[110][110], num; +int just[110][110]; +int just2[110][110]; + +int myabs(int a) +{ + if (a >= 0) + return a; + else + return -1 * a; +} + +void print(int map[][110], int n) //打印矩阵 +{ + int i,j; + i = 1; + while (i <= n) + { + j = 1; + while (j < n) + { + //printf("%d ", map[i][j]); + putf("%d ",map[i][j]); + j = j + 1; + } + putf("%d ",map[i][j]); + i = i + 1; + } +} + +void init_vis() +{ + int i = 0; + int j = 0; + while (i < 110) + { + j = 0; + while (j < 110) + { + vis[i][j] = 0; + j = j + 1; + } + i = i + 1; + } +} + +int slove(int map[][110], int n) //三阶行列式求值,高阶的请自动忽略 +{ + init_vis(); + int i, j, ans = 0; + if (n == 1) + return map[1][1]; + if (n == 2) + return map[1][1] * map[2][2] - map[1][2] * map[2][1]; + i = 1; + while (i <= n) + { + int help = 1; + j = 0; + while (j < n) + { + int cnt = i + j; + cnt = cnt % n; + if (cnt == 0) + cnt = n; + if (vis[1 + j][cnt] == 0) + { + help = help * map[1 + j][cnt]; + vis[1 + j][cnt] = 1; + } + else + break; + j = j + 1; + } + ans = ans + help; + i = i + 1; + } + init_vis(); + i = 1; + while (i <= n) + { + int help = 1; + j = 0; + while (j < n) + { + int cnt = i + j; + cnt = cnt % n; + if (cnt == 0) + cnt = n; + if (vis[n - j][cnt] == 0) + { + help = help * map[n - j][cnt]; + vis[n - j][cnt] = 1; + } + j = j + 1; + } + ans = ans - help; + i = i + 1; + } + return ans; +} + +void get(int numi, int numj, int map[][110], int n) //得到余子式 +{ + int help[110][110], i, j, k, l; + i = 0; + while (i < n + 10) + { + j = 0; + while (j < n + 10) + { + help[i][j] = 1; + j = j + 1; + } + i = i + 1; + } + + i = 1; + while (i <= n - 1) + { + j = 1; + while (j <= n - 1) + { + if (i >= numi && j < numj) + { + help[i][j] = map[i + 1][j]; + } + else + { + if (i >= numi && j >= numj) + { + help[i][j] = map[i + 1][j + 1]; + } + else + { + if (i < numi && j >= numj) + { + help[i][j] = map[i][j + 1]; + } + else + { + if (i < numi && j < numj) + { + help[i][j] = map[i][j]; + } + } + } + } + j = j + 1; + } + i = i + 1; + } + + i = 0; + while (i <= n - 1) + { + j = 0; + while (j <= n - 1) + { + just[i][j] = help[i][j]; + j = j + 1; + } + i = i + 1; + } +} + +int getans(int nn) //求当前行列式为just时,just的值。 +{ + int map[110][110]; + int i, j; + i = 1; + while (i <= nn) + { + j = 1; + while (j <= nn) + { + map[i][j] = just[i][j]; + j = j + 1; + } + i = i + 1; + } + if (nn == 2) + return map[1][1] * map[2][2] - map[1][2] * map[2][1]; + else + { + if (nn == 1) + return map[1][1]; + else + { + int cnb = 0; + int i = 1; + while (i <= nn) + { + get(1, i, map, nn); //得到当前余子式 just + // printf("pay attention!\n"); + if (i % 2 == 1) + cnb = cnb + map[1][i] * getans(nn - 1); + else + cnb = cnb - map[1][i] * getans(nn - 1); + i = i + 1; + } + return cnb; + } + } +} +int gcd(int m, int n) //求逆矩阵时约分 +{ + if (m < n) + gcd(n, m); + if (n == 0) + return m; + else + return gcd(n, m % n); +} +void final(int n, int m) //打印当前两个值相除得到的最简分数 +{ + if (n * m < 0) + { + putch(45); + final(myabs(n), myabs(m)); + return; + } + if (m == 1) + putf("%d ",n); + else + { + if (n % m == 0) + putf("%d ",n/m); + else + { + if (n < 0 && m < 0) + { + n = -n; + m = -m; + } + putf("%d/%d ", n / gcd(n, m), m / gcd(n, m)); + } + } +} +int main() +{ + //freopen("matrix-1.in", "r", stdin); + //printf("please input the determinant`s size:\n");//输入矩阵的规格 + //scanf("%d", &n); + n = getint(); + + i=0; + while(i