C语言计算行列式中的问题

有没有友友帮忙看一下这个计算行列式的代码哪里有问题,真的写不出了

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>
double det1(int arr[10][10], int n)
{
    int sight = 1; double sum = 0; double s = 0; int p = -1; int arr2[10][10] = { 0 }; /*int* arr2 = (int*)malloc(sizeof(int) * n * n);*/
    if (n == 1)
        return arr[0][0];
    else if (n == 2)
        return arr[0][0] * arr[1][1] - arr[0][1] * arr[1][0];
    else
    {
        int i = 0; int a = 0, b = 0;
        for (i = 0; i < n; i++)
        {
            int k = 0; int l = 0;
            for (l = 1; l < n; l++)
            {
                for (k = 0; k < n; k++)
                {
                    if (k == l)
                        continue;
                    else
                        arr2[a][b] = arr[l][k]; b++;
                }
                a++;
            }
            s += sight * arr[0][i] * det1(arr2, n - 1); sight = -sight;
        }
        sum += s;
    }
    return sum;
}
int main()
{
    int i = 0; int k = 0; int n = 0;int arr[10][10] = { 0 };
    printf("请输入行列式阶数:");
    scanf("%d", &n);
    /*int* arr = (int*)malloc(sizeof(int) * n * n);
    if (arr == NULL)
    {
        printf("NULL");
        return 0;
    }*/
    if (n > 10)
        return 0;
    else
    {
        printf("请输入数据:");
        for (i = 0; i < n; i++)
            for (k = 0; k < n; k++)
            {
                scanf("%d", arr + i * n + k);
            }
        int p = 0;
    }
        double sum = det1(arr, n);
    
    /*free(arr); arr = NULL;*/
    printf("sum=%lf", sum);
    return 0;
}

修改如下,改动处见注释,供参考:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>
double det1(int arr[10][10], int n)
{
    int sight = 1; double sum = 0; double s = 0; int p = -1; int arr2[10][10] = { 0 }; /*int* arr2 = (int*)malloc(sizeof(int) * n * n);*/
    if (n == 1)
        return  arr[0][0];
    else if (n == 2)
        return  arr[0][0] * arr[1][1] - arr[0][1] * arr[1][0];
    else
    {
        int i = 0; int a = 0, b = 0;
        for (i = 0; i < n; i++)
        {
            int k = 0; int l = 0;
            for (l = 1, a = 0; l < n; l++, a++) //for (l = 1; l < n; l++) 修改
            {
                for (k = 0,b = 0; k < n; k++) // for (k = 0; k < n; k++)  修改
                {
                    if (k == i) // if (k == l) 修改
                        continue;
                    else
                        arr2[a][b++] = arr[l][k]; //b++;  修改
                }
                //a++; 修改
            }
            s += sight * arr[0][i] * det1(arr2, n - 1); sight = -sight;
        }
        //sum += s;  修改
    }
    return s; //return sum; 修改
}
int main()
{
    int i = 0; int k = 0; int n = 0;int arr[10][10] = { 0 };
    printf("请输入行列式阶数:");
    scanf("%d", &n);
    /*int* arr = (int*)malloc(sizeof(int) * n * n);
    if (arr == NULL)
    {
        printf("NULL");
        return 0;
    }*/
    if (n > 10)
        return 0;
    else
    {
        printf("请输入数据:");
        for (i = 0; i < n; i++)
            for (k = 0; k < n; k++)
            {
                scanf("%d", &arr[i][k]);  // 修改
                //scanf("%d", arr + i * n + k);
            }
        //int p = 0;  修改
    }
    double sum = det1(arr, n);
    
    /*free(arr); arr = NULL;*/
    printf("sum=%lf", sum);
    return 0;
}

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7780200
  • 你也可以参考下这篇文章:用C语言实现输入一个九宫格数组,用代码输出它的某一行和某一列,并保留原有的格式
  • 你还可以看下c语言参考手册中的 c语言-常量及字面量
  • 除此之外, 这篇博客: C语言的双向链表头插法和尾插法,指定节点删除中的 测试代码如下 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct DoubleLink {
        int data;
        struct DoubleLink *next;
        struct DoubleLink *prev;
    }Data;
    
    /*打印链表,先next顺序打印,再prev逆序打印*/
    void print_list(Data *head) {
    	if(head == NULL)
    		return;
        printf("next \n");
    	while (head -> next) {
    		printf("%d ",head->data);
    		head = head -> next;
    	}
        printf("%d\n",head->data);
        Data *p = head;
        printf("\nprev \n");
        while (p -> prev != p) {
            printf("%d ",p->data);
            p = p ->prev;
        }
    	printf("\n");
    }
    
    /*尾插法*/
    Data *insert_tail(int n){
        Data *head = (Data *)malloc(sizeof(Data));
        head->next = NULL;
        head -> prev = head;
        Data *r = head;
        while (n --){
            int tmp;
            Data *p = (Data *)malloc(sizeof(Data));
            scanf("%d", &tmp);
            p -> data = tmp;
    
            if (r -> next == NULL) {
                p -> next = NULL;
                p -> prev = r;
                r -> next = p;
            } else  {
                p -> next = NULL;
                p ->prev = r;
                r -> next -> prev = p;
                r -> next = p;
            }
            
            r = p;
        }
        return head -> next;
    }
    
    /*头插法*/
    Data *insert_head(int n) {
        Data *head = (Data *)malloc(sizeof(Data));
        head->next = NULL;
        head -> prev = head;
        Data *r = head -> next;
        while (n--)
        {
            int tmp;
            Data *p = (Data *)malloc(sizeof(Data));
            scanf("%d", &tmp);
            p -> data = tmp;
            if (head -> next == NULL) {
                 p -> next = NULL;
                 p -> prev = head;
                 head -> next = p;
            } else
            {
                p -> next = head -> next;
                p -> prev = head;
                head -> next -> prev = p;
                head -> next = p;
            }
        }
        return head -> next;
        
    }
    
    /*删除链表,删除节点data为2的链表*/
    Data *delete_list(Data *head, int data) {
    	if(head == NULL)
    		return NULL;
        Data *p;
        Data *r = head ;
        while (r->next) {
            if (r-> next ->data == data) {
                p = r->next;
                break;
            }
            r = r->next;
        }
    
        r->next = p -> next;
        p->next->prev = r;
    
        p = NULL;
        return head;
    }
    
    int main()
    {
        printf("construct the double list tail\n");
        Data * head = insert_tail(5);
        print_list(head);
    
        printf("construct the double list head\n");
        Data * tail = insert_head(5);
        print_list(tail);
    
        printf("delete the double list node\n");
    
        Data * test = insert_head(5);
        Data *result = delete_list(test,2);
        print_list(result);
        return 0;
    }
    

    输出结果如下:

    construct the double list tail
    1 2 3 4 5
    
    next 
    1 2 3 4 5
    prev 
    5 4 3 2 1 
    
    construct the double list head
    1 2 3 4 5
    
    next 
    5 4 3 2 1
    prev 
    1 2 3 4 5 
    
    delete the double list node
    1 2 3 4 5
    next 
    5 4 3 1
    prev 
    1 3 4 5 
    
  • 您还可以看一下 李飞老师的C语言开发之数据结构与算法一课程中的 查找两个链表中第一个相同的节点小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    问题分析: 以上代码是计算一个3x3矩阵的行列式的代码。整体上看起来逻辑没有问题,但是可能存在一些细节方面的问题。下面是对代码可能存在的问题进行分析和解答:

    1. 第一个问题是变量类型的选择。行列式的结果有可能是小数,因此用整数变量int来存储可能会导致精度问题。建议使用double类型来存储行列式的结果。

    2. 第二个问题是代码中针对矩阵的下标访问可能越界。程序使用matrix[1][(i+1)%3] * matrix[2][(i+2)%3] - matrix[1][(i+2)%3] * matrix[2][(i+1)%3]来计算行列式的每一项,可能会访问到矩阵范围之外的元素。为了避免这个问题,可以在循环中设置适当的边界条件。

    3. 第三个问题是代码中没有对行列式的元素进行输入检查。在实际使用中,需要对用户输入的矩阵进行合法性检查。例如,检查矩阵的行列数是否满足行列式计算的规则。

    4. 最后一个问题是代码中没有对行列式的结果进行输出格式控制。建议使用更加友好的输出方式,例如使用%.2f来控制输出结果的小数位数,增加代码的可读性。

    解决方案:

    #include <stdio.h>
    
    int main() {
        double matrix[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
        double determinant = 0;
    
        for (int i = 0; i < 3; i++) {
            determinant += (matrix[0][i] * (matrix[1][(i+1)%3] * matrix[2][(i+2)%3] - matrix[1][(i+2)%3] * matrix[2][(i+1)%3]));
        }
    
        printf("行列式的值为:%.2f\n", determinant);
    
        return 0;
    }
    

    以上是修改后的代码,将行列式的结果类型改为double,增加了输出结果的小数位数限制。

    希望以上解决方案对您有帮助!如有其他问题,请随时提问!


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^