You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何C语言循环中矩阵元素会被对角线元素重复相乘?

3x3矩阵元素乘行对角线元素的异常问题修复

这段C代码意图实现:输入一个3x3矩阵,将每行的每个元素乘以该行的对角线元素,但运行后出现异常——当列索引大于行索引时,元素会被对角线元素乘两次。

原代码

#include <stdio.h>

#define R 3

int a[R][R], i, j;

int main(void) {
    for (i = 0; i < R; i++) {
        for (j = 0; j < R; j++) {
            printf("\nInsira o n%i%i ", i, j);
            scanf("%i", &a[i][j]);
        }
    }

    for (i = 0; i < R; i++) {
        for (j = 0; j < R; j++) {
            a[i][j] = a[i][j] * a[i][i];
        }
    }

    for (i = 0; i < R; i++) {
        printf("\n");
        for (j = 0; j < R; j++) {
            printf("%i   ", a[i][j]);
        }
    }
}

输入示例

9 8 7
6 5 4
3 2 1

异常输出结果

81 648 567
30 25 100
3 2 1

问题原因分析

问题出在第二个嵌套循环:处理第i行时,循环j从0到2,先修改了对角线元素a[i][i](将其变为原数的平方),之后处理j>i的元素时,使用的是已经被修改过的a[i][i](即原对角线值的平方)去乘,导致这些元素被原对角线值乘了两次。

举个例子:

  • 第一行原对角线元素是9,j=0时,a[0][0]被修改为99=81;j=1时,用修改后的81去乘原a[0][1]=8,得到881=648,相当于899,也就是乘了两次9
  • 第二行原对角线元素是5,j=2时,用修改后的25(55)去乘原a[1][2]=4,得到425=100,相当于455,同样乘了两次5
  • 第三行没有j>i的情况,所以结果正常

修复方案

在处理每行之前,先把该行的对角线元素保存到临时变量中,再用这个临时变量去乘该行所有元素,避免修改原对角线元素后影响后续计算。修改后的代码如下:

#include <stdio.h>

#define R 3

int a[R][R], i, j;

int main(void) {
    for (i = 0; i < R; i++) {
        for (j = 0; j < R; j++) {
            printf("\nInsira o n%i%i ", i, j);
            scanf("%i", &a[i][j]);
        }
    }

    for (i = 0; i < R; i++) {
        // 提前保存当前行的对角线元素
        int diag = a[i][i];
        for (j = 0; j < R; j++) {
            a[i][j] = a[i][j] * diag;
        }
    }

    for (i = 0; i < R; i++) {
        printf("\n");
        for (j = 0; j < R; j++) {
            printf("%i   ", a[i][j]);
        }
    }
}

修改后用同样输入,输出会变为符合预期的结果:

81 72 63
30 25 20
3 2 1

内容的提问来源于stack exchange,提问作者Saulo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 18:50:26