【问题标题】:Finding the number of row with the smallest sum of powers, C找到具有最小幂和的行数,C
【发布时间】:2016-12-28 12:30:25
【问题描述】:

我有一个数组,我需要在其中找到具有最小幂和的行数。考虑示例数组:

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

【问题讨论】:

    标签: c arrays algorithm


    【解决方案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;
    }
    

    【讨论】:

    【解决方案2】:

    这一行会杀死你对前几行的所有“记忆”:

    minsum = sum;
    

    您应该只在更新minindex 的同时更新minsum

    另外,您更新minindex 的条件似乎是错误的。

    【讨论】:

      【解决方案3】:

      这将是一种方法(尽管是简单的版本):

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

      【讨论】:

        【解决方案4】:

        我认为你的逻辑有问题。首先“如果(最小值

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

        【讨论】:

        • wkwkwkwk... 对于我糟糕的英语语言能力,我深表歉意。我只是想帮助解决问题。 (关于语法,谢谢指正)
        • I apologize for my poor English language skills. 不要 - 不是“母语人士”不是任何人的错(wkwkwkwk&profile image: 在印度尼西亚附近?)。只需让您的计算机帮助您(使用拼写检查器),并尝试使您的贡献易于理解。 (不是说你在这方面做得不好。)
        猜你喜欢
        • 2019-05-01
        • 1970-01-01
        • 2018-01-11
        • 2020-04-29
        • 1970-01-01
        • 1970-01-01
        • 2012-10-22
        • 2014-09-21
        • 1970-01-01
        相关资源
        最近更新 更多