找到具有最小幂的总和的行数,C

时间:2016-12-28 12:30:25

标签: c arrays algorithm

我有一个数组,我需要找到具有最小功率总和的行数。考虑示例数组:

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

4 个答案:

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