试图提高p的幂的矩阵,但我没有发现错误。谁能帮助和解释问题?我刚刚开始使用C编程,因此非常感谢您的帮助。用户应输入一个矩阵并将其提高到p的幂。
int main() {
int n, p;
printf("Number of Rows/Colums of square matrix: ");
scanf("%d", &n);
printf("to the power of: ");
scanf("%d", &p);
int m[n][n];
int r[n][n];
printf("Elements\n");
for (int b = 0; b < n; b++) {
for (int d = 0; d < n; d++) {
printf("[%d][%d] = ", b + 1, d + 1);
scanf("%d", &m[b][d]);
}
}
int sum = 0;
for (int i = 0; i < p; i++) {
for (int b = 0; b < n; b++) {
for (int d = 0; d < n; d++) {
for (int k = 0; k < n; k++) {
sum += m[b][k] * m[k][d];
}
r[b][d] = sum;
sum = 1;
}
}
for (int b = 0; b < n; b++) {
for (int d = 0; d < n; d++) {
m[b][d] = r[b][d];
r[b][d] = 0;
}
}
}
printf("RESULT:-\n");
for (int c = 0; c < n; c++) {
for (int d = 0; d < n; d++) {
printf("%d ", m[c][d]);
}
printf("\n");
}
getch();
return 0;
}
答案 0 :(得分:2)
您的程序逻辑在多个层次上都是错误的。
这是您更正的程序。仍有改进的空间(将代码分解为功能,使用更好的变量命名,使用比残酷矩阵乘法更有效的算法,正确处理p为0的情况),但我尝试尽可能地坚持原始的错误实现。
这是一种方法:我们有三个矩阵:r
结果,m
用户提供的矩阵和temp
临时矩阵。
m
复制到r
,这是p = 1
的结果p - 1
次r
和m
相乘并将结果放入temp
temp
复制到r
r
包含提升到m
幂的p
。#include <stdio.h>
int main() {
int n, p;
printf("Numer of Rows/Colums of sq matrix: ");
scanf("%d", &n);
printf("to the power of: ");
scanf("%d", &p);
int m[n][n];
int r[n][n];
int temp[n][n];
printf("Elements\n");
for (int b = 0; b < n; b++) {
for (int d = 0; d < n; d++) {
printf("[%d][%d] = ", b + 1, d + 1);
scanf("%d", &m[b][d]);
}
}
// r = m
// temp = m
for (int b = 0; b < n; b++) {
for (int d = 0; d < n; d++) {
r[b][d] = m[b][d];
}
}
for (int i = 0; i < p - 1; i++) // p - 1 because for p = 1, r already
{ // contains the result
int sum = 0;
// temp = r * m
for (int b = 0; b < n; b++)
{
for (int d = 0; d < n; d++)
{
for (int k = 0; k < n; k++)
{
sum += m[b][k] * r[k][d];
}
temp[b][d] = sum;
sum = 0;
}
}
// r = temp
for (int b = 0; b < n; b++) {
for (int d = 0; d < n; d++) {
r[b][d] = temp[b][d];
}
}
}
printf("RESULT:\n");
for (int c = 0; c < n; c++)
{
for (int d = 0; d < n; d++)
{
printf("%d ", r[c][d]);
}
printf("\n");
}
return 0;
}
答案 1 :(得分:2)
我认为您的代码中存在各种逻辑问题。
外循环是错误的,因为您的循环量要少一倍。
第二,您需要一个编写代码的缓冲矩阵。
另一个问题是,当您将行/列值相乘时,始终使用原始矩阵。这在逻辑上是错误的,您需要将计算出的当前功率乘以原始矩阵。
我也不明白为什么将sum
变量重置为1而不是0。
类似的事情应该起作用:
#include <stdio.h>
int main() {
int n, p;
printf("Numer of Rows/Colums of sq matrix: ");
scanf("%d", &n);
printf("to the power of: ");
scanf("%d", &p);
int m[n][n];
int r[n][n];
int tmp[n][n];
printf("Elements\n");
for ( int b = 0 ; b < n ; b++ ) {
for ( int d = 0 ; d < n ; d++ ) {
printf("[%d][%d] = ", b+1, d+1);
scanf("%d", &m[b][d]);
r[b][d] = m[b][d];
}
}
int sum = 0;
//you loop 1 time less of the power
for (int i = 0; i < p - 1; i++)
{
for ( int b = 0 ; b < n ; b++ )
{
for (int d = 0 ; d < n ; d++ )
{
for (int k = 0 ; k < n ; k++ )
{
sum += r[b][k]*m[k][d];
}
tmp[b][d] = sum;
sum = 0;
}
}
for ( int b = 0 ; b < n ; b++ ) {
for ( int d = 0 ; d < n ; d++ ) {
//m[b][d] = r[b][d];
r[b][d] = tmp[b][d];
}
}
}
printf("RESULT:-\n");
for (int c = 0 ; c < n ; c++ )
{
for (int d = 0 ; d < n ; d++ )
{
printf("%d ", r[c][d]);
}
printf("\n");
}
getchar();
return 0;
}
我只是指出,此解决方案可能不适用于p <1
答案 2 :(得分:2)
我建议您将这个复杂的问题分解为较小的问题。
创建较小的函数,对其进行测试以确保它们正常工作,然后下一步调用这些函数,直到获得完整的函数为止。
您需要以一个矩阵开始:a[m][n]
。它保存的值应该是整数,浮点数还是双精度数?确保可以创建不同大小的矩阵。您对行和列的限制应该是什么?
从读取和写入矩阵的方法开始。
接下来是将多个两个矩阵放在一起的方法:c[m][n] = a[m][k]*b[k][n]
。 a
中的列数与b
中的行数匹配,或者您不能相乘。
将矩阵提高到整数幂p > 1
意味着将起始矩阵自身乘以p
倍。您能看到一个要求是起始矩阵必须为正方形吗? (#行==#列)如果不正确,则不能提高为整数幂。
您将需要一个循环来提高p次幂。每次循环时,您将调用矩阵乘法方法c = mult(a, b)
。每次传递都会获取上一个调用的输出,并将其作为调用中的第一个矩阵:c = mult(c, b)
。
如果您以此方式攻击问题,则应该能够解决它。在继续之前,请务必仔细测试每个步骤。
这称为分解。这是解决一般问题,尤其是计算机科学问题的基石。
答案 3 :(得分:1)
您的代码中存在多个问题:
t
计算r * m
的结果,然后在下一步之前将其复制到r
。sum
应该重新初始化为0
,或者最好在0
循环之前初始化为k
。这是更正的版本:
#include <stdio.h>
int main() {
int n, p;
printf("Number of Rows/Colums of square matrix: ");
if (scanf("%d", &n) != 1 || n <= 0)
return 1;
printf("to the power of: ");
if (scanf("%d", &p) != 1 || p < 0)
return 1;
int m[n][n];
int r[n][n];
int t[n][n];
printf("Elements\n");
for (int b = 0; b < n; b++) {
for (int d = 0; d < n; d++) {
printf("[%d][%d] = ", b + 1, d + 1);
if (scanf("%d", &m[b][d]) != 1)
return 1;
r[b][d] = b == d; // initialize r to identity matrix
}
}
for (int i = 0; i < p; i++) {
for (int b = 0; b < n; b++) {
for (int d = 0; d < n; d++) {
int sum = 0;
for (int k = 0; k < n; k++) {
sum += r[b][k] * m[k][d];
}
t[b][d] = sum;
}
}
for (int b = 0; b < n; b++) {
for (int d = 0; d < n; d++) {
r[b][d] = t[b][d];
}
}
}
printf("RESULT:\n");
for (int c = 0; c < n; c++) {
for (int d = 0; d < n; d++) {
printf("%3d ", r[c][d]);
}
printf("\n");
}
return 0;
}
注意:
上面的代码适用于正幂,包括0
会产生单位矩阵。
但是请注意,此方法对于大功率而言效率低下,int
可能对于大功率而言仍然会溢出。