Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > сумма элементов столбца


Автор: Vicipi 24.5.2008, 17:36
Легкая задачка не получается:
Дан двумерный массив N*M чисел. Выведите в строку тот столбец двумерного массива, чья сумма элементов максимальна. 

Входные данные: В первой строке числа N и M через пробел. Далее - двумерный массив N*M. Все числа во входе положительные и не превосходят 101. 

Выходные данные: Выведите в строку тот столбец двумерного массива, чья сумма элементов максимальна. Если таких столбцов несколько, выведите столбец с минимальным индексом. (расположенный левее в массиве). 

Пример входных данных 
2 3 
1 8 3 
4 1 6 

Пример выходных данных 
8 1 
вот че написала, почему не работает?
Код

int main(int argc, char* argv[])
{
 int N,M,u,i,mas[101][101]={0},sum=0,k=0,st;
 scanf("%d %d",&N,&M);
 for( u=0;u<N;u++)
{for( i=0;i<M;i++)
  scanf("%d",&mas[u][i]);
  }
 for( u=0;u<N;u++)
{sum=0;
for(i=0;i<M;i++)
 sum =+mas[i][u];
  if(sum>k){k==sum;st=u;}

   }
    for(i=0;i<N;i++)
    printf("%d ",mas[i][st]);
 getch();
        return 0;
}



Автор: rrrFer 24.5.2008, 18:28
Vicipi 
ошибки:
1) if(sum>k){k==sum;st=u;}

2) sum =+mas[i][j];
так работает:
Код

#include <stdio.h>
#include <stdlib.h> //для system("pause");
int main(int argc, char* argv[]){
    int N,M,j,i,mas[101][101],sum=0,max,st;
    scanf("%d %d",&N,&M);
    for(j=0;j<N;j++)
            for(i=0;i<M;i++)
                scanf("%d",&mas[j][i]);
    for(j=0,printf("\n");j<N;j++)
            for(i=0,printf("\n");i<M;i++)
                printf("%d",mas[j][i]);
    for(j=0,max=0;j<N;j++){
        sum=0;
        for(i=0;i<M;i++)
            sum+=mas[i][j];
        if(sum>max){
            max=sum;
            st=j;
        }
    }
    for(i=0,printf("\n");i<N;i++)
        printf("%d ",mas[i][st]);
    system("pause");
    return 0;
}

однако если сумма положительная, для отрицательной надо модифицировать немного...

Автор: Vicipi 24.5.2008, 19:22
а почему для отрицательных не подходит?

Автор: rrrFer 24.5.2008, 19:46
если все суммы столбцов будут отричательными, то ниразу не выполнится
Код

if(sum>max){
            max=sum;
            st=j;
        }

потому что max=0;
чтобы это исправить я бы что-нибудь такое написал:
Код

    bool fl;
    for(j=0,max=0,fl=0;j<N;j++){
        sum=0;
        for(i=0;i<M;i++)
            sum+=mas[i][j];
        if(fl==0||sum>max){
            max=sum;
            fl=1;
            st=j;
        }
    }

Автор: Vicipi 25.5.2008, 20:09
эта задача с contester.tsure.ru, при тестировании: неверный ответ на тесте 3. Что то не учтено...я не знаю что не так

Автор: rrrFer 26.5.2008, 06:14
Vicipi, 
я просто рпавил твою программу, а вот сейчас посмотрел на условие:
Цитата

Входные данные: В первой строке числа N и M через пробел. Далее - двумерный массив N*M. Все числа во входе положительные и не превосходят 101. 

Выходные данные: Выведите в строку тот столбец двумерного массива, чья сумма элементов максимальна. Если таких столбцов несколько, выведите столбец с минимальным индексом. (расположенный левее в массиве).

входные данные - это выходит файл, а не с клавы надо размер массива вводить.
массив может быть любого размера, т.е. ошибка возможно в :
Код

mas[101][101];

ну и выводить то надо тоже наверно в файл
тогда вот так:
Код

#include <stdio.h>
int main(int argc, char* argv[]){
    int N,M,j,i,**mas,sum=0,max,st;
    bool fl;
    FILE *f=fopen("in.txt","r");
    fscanf(f,"%d %d",&N,&M);
    mas=new int*[N];
    for(j=0;j<N;j++){
        mas[j]=new int[M];
            for(i=0;i<M;i++)
                fscanf(f,"%d",&mas[j][i]);
    }fclose(f);
    for(j=0,max=0,fl=0;j<N;j++){
        sum=0;
        for(i=0;i<M;i++)
            sum+=mas[i][j];
        if(sum>max||fl==0){
            max=sum;
            st=j; fl=1;
        }
    }
    for(i=0,fopen("out.txt","w"),printf("\n");i<N;i++)
       fprintf(f,"%d ",mas[i][st]);
    return 0;
}

а если учесть вот это:
Цитата

Все числа во входе положительные и не превосходят 101

то сумма не может быть отрицательной, и возможно надо сделать проверку чтоб числа не превосходили 101, но я думаю это не твоя уже задача

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)