2016-12-28 52 views
0

我有一个数组,其中我需要找到具有最小权幂总和的行数。考虑的示例阵列:找到权力总和最小的行数,C

1 1 1 
2 2 2 
3 3 3 

第一行,(索引= 0),功率的总和等于3(1^2 + 1^2 + 1^2 = 3)。

第二行(index = 1),幂的和等于12(2^2 + 2^2 + 2^2 = 12)。

第三行(索引= 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; 
} 

回答

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; 
} 
+0

它并没有帮助,因为对于阵列'1 1 1 3 3 3 2 2 2'它显示索引'2':http://pastie.org/private/nyhnpig0m8l80laoefg – mirx

+0

尝试上述方法..它会工作 – JerryGoyal

0

此行杀死以前行的所有 “记忆”:

minsum = sum; 

您应该只更新minsum与更新minindex在一起。

此外,您的条件更新minindex似乎是错误的方式。

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; 
} 
0

我认为有逻辑中的一些问题。首先“如果(minisum < =总和)”。它必须是“如果(总和< = minisum)”。其次,如果你只是使用这样的编码,那么条件将被视为只有条件我和i-1。所以,我建议用下面的脚本改变语法“if(minisum < = 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; 
} 
+0

wkwkwkwk ...我为我可怜的英语语言技能表示歉意。我只是想帮助解决问题。 (关于语法,谢谢修正) – wanarabuana

+0

'我为我的英语语言能力不好而道歉.'不要 - 任何人都不会成为“母语人士”('wkwkwkwk'&profile image:near印度尼西亚?)。只要让你的电脑帮你(使用拼写检查器),并尽量使你的贡献容易理解。 (_Not_说你在这方面做得不好。) – greybeard

+0

好的......谢谢你的朋友...... – wanarabuana