我有一个数组,我需要找到具有最小功率总和的行数。考虑示例数组:
1 1 1
2 2 2
3 3 3
第一行,(index = 0),幂之和等于3(1 ^ 2 + 1 ^ 2 + 1 ^ 2 = 3)。
第二行(index = 1),幂之和等于12(2 ^ 2 + 2 ^ 2 + 2 ^ 2 = 12)。
第三行(index = 2),幂的总和等于27(3 ^ 2 + 3 ^ 2 + 3 ^ 2 = 27)。
但是我的程序显示错误的结果 - 而不是索引0
,它显示索引2
。有什么问题?
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int ** alloc(int n, int m)
{
int **array, i;
array = malloc(sizeof(int*) * n);
for(i=0; i<n; i++)
array[i] = malloc(sizeof(int) * m);
return array;
}
void show(int **array, int n, int m)
{
int i,j;
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
printf("%d\t", array[i][j]);
}
printf("\n");
}
}
void fill(int **array, int n, int m, int x)
{
int i,j;
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
array[i][j] = x;
}
}
}
void dealloc(int **array, int n, int m)
{
int i;
for(i=0; i<n; i++)
free(array[i]);
free(array);
}
int smallest_powers_sum(int **array, int n, int m)
{
int sum = 0, minsum = 0, i, j, minindex = -1;
for(i=0; i<n; i++)
{
minsum = sum;
sum = 0;
for(j=0; j<m; j++)
{
sum += pow(array[i][j], 2);
}
if(minsum <= sum)
minindex = i;
printf("sum = %d, minsum = %d, minindex = %d\n", sum, minsum, minindex);
}
return minindex;
}
int main(int argc, char **argv)
{
int **array, n1 = 3, m1 = 3;
array = alloc(n1, m1);
fill(array, n1, m1, 1);
array[0][0] = 1;
array[0][1] = 1;
array[0][2] = 1;
array[1][0] = 2;
array[1][1] = 2;
array[1][2] = 2;
array[2][0] = 3;
array[2][1] = 3;
array[2][2] = 3;
int sum = smallest_powers_sum(array, n1, m1);
printf("index = %d\n", sum);
dealloc(array, n1, m1);
return 0;
}
答案 0 :(得分:1)
我认为你的意思是:
if(sum <= minsum ){
minindex = i;
minsum = sum;
}
此外,最初将integer_max分配给minsum
。
以下是代码:
int smallest_powers_sum(int **array, int n, int m)
{
int sum = 0, minsum = 1000000, i, j, minindex = -1;
for(i=0; i<n; i++)
{
sum = 0;
for(j=0; j<m; j++)
{
sum += pow(array[i][j], 2);
}
if(sum <= minsum ){
minindex = i;
minsum = sum;
}
printf("sum = %d, minsum = %d, minindex = %d\n", sum, minsum, minindex);
}
return minindex;
}
答案 1 :(得分:0)
这条线会杀死你所有的记忆&#34;之前的行:
minsum = sum;
您应该只更新minsum
以及更新minindex
。
您更新minindex
的条件似乎也是错误的。
答案 2 :(得分:0)
这将是一种方法(虽然是一个简单的版本):
#define NROWS 3
#define NCOLS 3
int *getminrow(int *p, int n)
{
int minval = *p;
int *minaddr = p;
while (n >= 1) {
if (*p < minval) {
minval = *p;
minaddr = p;
}
n--;
p++;
}
return minaddr;
}
int sumrow(int *p, int n)
{
int sum = 0;
while (n >= 1) {
sum += (*p);
n--;
p++;
}
return sum;
}
int main(void)
{
int *array = malloc(NROWS * NCOLS);
int listsum[NROWS];
int i, j;
array[0 * NROWS + 0] = 1;
array[0 * NROWS + 1] = 1;
array[0 * NROWS + 2] = 1;
array[1 * NROWS + 0] = 2;
array[1 * NROWS + 1] = 2;
array[1 * NROWS + 2] = 2;
array[2 * NROWS + 0] = 3;
array[2 * NROWS + 1] = 3;
array[2 * NROWS + 2] = 3;
for (i = 0; i < NROWS; i++) {
for (j = 0; j < NCOLS; j++) {
array[i * NROWS + j] = pow(array[i * NROWS + j], 2);
}
}
for (i = 0; i < NROWS; i++)
listsum[i] = sumrow(&array[i], NCOLS);
printf("Min row: %d\n", getminrow(listsum, NROWS) - listsum);
return 0;
}
答案 3 :(得分:0)
我认为你的逻辑存在一些问题。首先是“if(minisum&lt; = sum)”。它必须是“if(sum&lt; = minisum)”。其次,如果您只是使用这样的编码,那么条件将仅被视为条件i和i-1。所以,我的建议是使用以下脚本更改语法“if(minisum&lt; = sum)”。 (我称之为minisumtemp的新变量。)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int ** alloc(int n, int m)
{
int **array, i;
array = malloc(sizeof(int*) * n);
for(i=0; i<n; i++)
array[i] = malloc(sizeof(int) * m);
return array;
}
void show(int **array, int n, int m)
{
int i,j;
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
printf("%d\t", array[i][j]);
}
printf("\n");
}
}
void fill(int **array, int n, int m, int x)
{
int i,j;
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
array[i][j] = x;
}
}
}
void dealloc(int **array, int n, int m)
{
int i;
for(i=0; i<n; i++)
free(array[i]);
free(array);
}
int smallest_powers_sum(int **array, int n, int m)
{
//int sum = 0, minsum = 0, i, j, minindex = -1;
int sum = 0, minsum = 0, i, j, minindex = 0, minsumtemp; // add new variable : minsumtemp
for(i=0; i<n; i++)
{
minsum = sum;
sum = 0;
for(j=0; j<m; j++)
{
sum += pow(array[i][j], 2);
}
//if(minsum <= sum) this the problem
// minindex = i;
if (i==0) minsumtemp = sum; // initialized first value for minsumtep
if (sum<=minsumtemp)
{
minindex = i;
minsumtemp = sum;
}
printf("sum = %d, minsum = %d, minindex = %d\n", sum, minsum, minindex);
}
return minindex;
}
int main(int argc, char **argv)
{
int **array, n1 = 3, m1 = 3;
array = alloc(n1, m1);
fill(array, n1, m1, 1);
array[0][0] = 1;
array[0][1] = 1;
array[0][2] = 1;
array[1][0] = 2;
array[1][1] = 2;
array[1][2] = 2;
array[2][0] = 3;
array[2][1] = 3;
array[2][2] = 3;
int sum = smallest_powers_sum(array, n1, m1);
printf("index = %d\n", sum);
dealloc(array, n1, m1);
return 0;
}