c语音线性方程组

7bb1d3588e734d4887e15fbd5d099047.jpg

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

long long int a[10][10] = { 0 }, b[10][10]; char str[40]; int x = 0, y = 0;

long long int gongyue(long long int m, long long int n) {

    if (m == 0 || n == 0) { return 1; }

    if (m < 0) { m = -m; }if (n < 0) { n = -n; }

    while (m % n && n % m) { if (m > n) { m -= n; } else { n -= m; } }

    return m < n ? m : n;

}

int luru(int i, int k) {

    int j = 1, n = 0; long long int t = 1;

    while (1) {

        if (str[i] >= '0' && str[i] <= '9') { n *= 10; n += str[i] - '0'; if (t > 1) { j *= 10; } }

        else if (str[i] == '-') { t = -1; }

        else if (str[i] == '.') { a[y][k] = t * n; n = 0; if (t == -1) { t = 2; } else { t = 3; } }

        else if (str[i] == '/') { a[y][k] = t * n; n = 0; t = -2; }

        else if (str[i] == '\0' || str[i] == ' ') {

            if (t == 2) { if (n) { t = gongyue(n, j); b[y][k] = j / t; a[y][k] *= b[y][k]; a[y][k] -= n / t; } }

            else if (t == 3) { if (n) { t = gongyue(n, j); b[y][k] = j / t; a[y][k] *= b[y][k]; a[y][k] += n / t; } }

            else if (t == -2) { t = gongyue(a[y][k], n); a[y][k] /= t; b[y][k] = n / t; }

            else { a[y][k] = t * n; }

            break;

        }i++;

    }

    while (str[i] == ' ') { i++; }

    return i;

}

void print() {

    printf("\n\n方程\n ");

    for (int i = 0; i < y; i++) {

        if (i) { printf(" "); }int k = 0;

        for (int j = 0; j < x; j++) {

            if (a[i][j] == 0) { continue; }

            else if (a[i][j] == 1 && b[i][j] == 1) { if (k) { printf("+"); }printf(" X%d", j); k = 1; continue; }

            else if (a[i][j] == -1 && b[i][j] == 1) { printf("- X%d", j); k = 1; continue; }

            else if (k && (a[i][j] > 0)) { printf("+ %I64d", a[i][j]); }

            else if (a[i][j] < 0) { printf("- %I64d", -a[i][j]); }

            else { printf("%I64d", a[i][j]); }

            if (b[i][j] != 1) { printf("/%I64d", b[i][j]); }

            printf("*X%d", j); k = 1;

        }if (k == 0) { printf("0"); }

        printf(" = ");

        if (b[9][i] == 1) { printf(" %I64d", a[9][i]); }

        else { printf(" %I64d/%I64d", a[9][i], b[9][i]); }printf("\n");

    }
}

void swap(int i, int l) {

    for (int j = 0; j < 10; j++) {

        a[9][j] = a[i][j]; a[i][j] = a[l][j]; a[l][j] = a[9][j];

        b[9][j] = b[i][j]; b[i][j] = b[l][j]; b[l][j] = b[9][j];

    }

}

void sub(int i, int l, int j) {

    for (int k = 0; k < 10; k++) {

        if (k == x) { k = 9; }

        if (k == j) { continue; }

        a[l][k] = a[l][k] * b[i][k] * b[l][j] - b[l][k] * a[i][k] * a[l][j];

        b[l][k] *= b[i][k] * b[l][j];

        long long int t = gongyue(a[l][k], b[l][k]);

        a[l][k] /= t; b[l][k] /= t;

    }

}

void solve() {

    int i, j, k, l;

    for (i = 0; i < y; i++) {

        a[i][9] = a[9][i]; b[i][9] = b[9][i];

    }

    for (i = j = 0; i < y; i++, j++) {

        for (l = i; j < x; j++) {

            while (a[l][j] == 0 && l < y) { l++; }

            if (l < y) { if (l != i) { swap(i, l); }break; }l = i;

        }if (j == x) { break; }

        long long int a1 = a[i][j], b1 = b[i][j];

        if (a1 < 0) { a1 = -a1; b1 = -b1; }

        for (k = j; k < 10; k++) {

            if (k == x) { k = 9; }

            a[i][k] *= b1; b[i][k] *= a1;

            long long int t = gongyue(a[i][k], b[i][k]);

            a[i][k] /= t; b[i][k] /= t;

        }

        for (l = 0; l < y; l++) {

            if (a[l][j] != 0 && i != l) { sub(i, l, j); a[l][j] = 0; }

        }

    }

}

void show() {

    int i, j, k, l, t;

    for (i = 0; i < y; i++) {
        if (i < x) {
            for (j = 0; j < x; j++) {

                if (a[i][j] != 0) { break; }

            }if (j == x && a[i][9] != 0) { printf("\n\n无解!"); return; }
        }
        else {
            for (j = 0; j < x; j++) {

                if (a[i][j] != 0) { printf("\n\n无解!"); return; }

            }if (a[i][9] != 0) { printf("\n\n无解!"); return; }
        }
    }

    printf("\n\n通解\n ");

    for (i = j = 0; j < x; j++, i++) {
        l = i;

        for (; i < y; i++) {

            if (a[i][j] != 0) { break; }

        }if (j) { printf(" "); }

        printf("X%d = ", j);

        if (i == y) { i = l - 1; printf(" X%d\n", j); continue; }

        t = 0;

        if (a[i][9] != 0) {

            if (b[i][9] == 1) { printf("%I64d", a[i][9]); }

            else { printf("%I64d/%I64d", a[i][9], b[i][9]); }t = 1;

        }

        for (k = j; k < x; k++) {

            if (k == j) { continue; }

            if (a[i][k] > 0) {

                if (b[i][k] == 1) {

                    if (a[i][k] == 1) { printf(" - X%d", k); }

                    else { printf(" - %I64d*X%d", a[i][k], k); }

                }

                else { printf(" - %I64d/%I64d*X%d", a[i][k], b[i][k], k); }t = 1;

            }

            else if (a[i][k] < 0) {

                if (t) { printf("+"); }

                if (b[i][k] == 1) {

                    if (a[i][k] == -1) { printf(" X%d", k); }

                    else { printf(" %I64d*X%d", -a[i][k], k); }

                }

                else { printf(" %I64d/%I64d*X%d", -a[i][k], b[i][k], k); }t = 1;

            }

        }if (t == 0) { printf(" 0"); }printf("\n");

    }

}

int main() {

    while (1) {
        x = y = 0;

        int i, k, r, m = 1;

        for (i = 0; i < 10; i++) {

            for (k = 0; k < 10; k++) {

                b[i][k] = 1; a[i][k] = 0;

            }

        }

        printf("请输入方程左部:\n"); loop:

        while ((r = scanf("%[^\n]%*c", str)) == 1) {

            i = k = m = 0;

            while (str[i] != '\0') { i = luru(i, k); k++; if (k > x) { x = k; } }y++;

        }if (m) { while (getchar() != '\n'); goto loop; }

        printf("请输入方程右部:\n");

        while (getchar() != '\n');

        r = scanf("%[^\n]%*c", str);

        if (r == 0) { getchar(); memset(str, '\0', sizeof(str)); }

        k = y; y = 9; i = r = 0;

        while (str[i] != '\0') { i = luru(i, r); r++; }y = k;
        //a[i][9]与a[9][i]的起因
        system("CLS");

        print();
        if(x<10&&y<10){ solve(); show();}
        else { printf("超出限制\n"); }
        while (getchar() != '\n');

        system("CLS");

    }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值