Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C] Поиск числа с максимальной суммой цифр


Автор: Denzel666 22.12.2006, 01:08
Запарка ...Хелпаните...

Вывести на на экран эелементы массива целых чисел, имеющих максимальную сумму цифр...

Автор: Kuvaldis 22.12.2006, 01:21

M
Kuvaldis

Реализация на китайском пойдет?
Кто будет за тебя указывать нужный язык программирования??? 
 

Автор: Denzel666 22.12.2006, 02:53
Запарка ...Хелпаните...

Вывести на на экран эелементы массива целых чисел, имеющих максимальную сумму цифр...
[Язык Си]

Автор: doomik 22.12.2006, 14:57
Код

#include <stdio.h>

int Sumof(int Arr[], int I); // Прототип функции

int main()
{
    int I, Max = -2147483647, ArrSize, Id;

        printf("Enter array size:\n"); // Читаем длину массива
        scanf("%d", &ArrSize);
        
        int Arr[ArrSize]; // Создаём массив 
        for ( I = 0; I != ArrSize; I++ ) 
            {
                printf("Enter %d element:\n", I); // Заполняем массив числами
                scanf("%d", &Arr[I]);
                if ( Sumof(Arr, I) > Max ) { // Вызываем функцию и сравниваем разультат с ֵMax
                    Max = Arr[I];
                    Id = I;
                }
            }
    printf("Element Id: %d\nMax element: %d\n", Id, Max); // Печатаем максимальный елемент и его сумму
return 0;
}

int Sumof(int Arr[], int I) // Функция разделает число и подчитавает его сумму чисел
{
    int Sum;
        while ( Arr[I] != 0 ) {
            Sum = Sum + Arr[I] % 10;
            Arr[I] = Arr[I] / 10;
            
        }
Arr[I] = Sum;
return Arr[I];
}


Автор: Dov 22.12.2006, 22:36
Цитата(doomik @  22.12.2006,  13:57 Найти цитируемый пост)
 
Код
printf("Enter array size:\n"); // Читаем длину массива
scanf("%d", &ArrSize);
int Arr[ArrSize]; // Создаём массив
 

doomik, и хде ж тя так учили массив создавать?  smile 

Автор: Denzel666 23.12.2006, 00:25
А можно без функций попроще...И если не сложно с комментариями

Добавлено @ 00:30 
Цитата
Код

int Sumof(int Arr[], int I); // Прототип функции




И что в вашем понимании протатип фцнкции?

Автор: paSha_X 23.12.2006, 03:07
Denzel666
Ну ты даёшь, хоть бы книжку открыл глянул немного, хоть что чем называется знать, ладно уже решать, ну хоть понимать.......толку задачи тогда эти делать........  

Автор: V.A.KeRneL 23.12.2006, 10:32
Цитата(paSha_X @  23.12.2006, 03:07 Найти цитируемый пост)

Denzel666
.......толку задачи тогда эти делать........

Мне кажется, чтобы просто сдать!.. smile

Цитата(Dov @  22.12.2006, 22:36 Найти цитируемый пост)

Цитата(doomik @  22.12.2006,  13:57 Найти цитируемый пост)

Код
printf("Enter array size:\n"); // Читаем длину массива
scanf("%d", &ArrSize);
int Arr[ArrSize]; // Создаём массив


doomik, и хде ж тя так учили массив создавать?  smile


Цитата(doomik @  22.12.2006, 14:57 Найти цитируемый пост)

Код

/*...*/ Max = -2147483647 /*...*/


Да и магические числа тоже... smile

Автор: apook 23.12.2006, 12:08
Код

#include "stdio.h"





void main()
{
int quick_matrix[5][11] ={
{ 1, 2, 5, 8, 7, 9, 10, 5, 5, 3 }, //=55
{ 5, 2, 8, 6, 2, 2, 9, 8, 1, 9 },  //=43
{ 8, 1, 3, 5, 6, 7, 9, 0, 2, 0 },  //=41
{ 4, 1, 7, 9, 1, 4, 9, 6, 5, 10 }, //=56 <--сумма этого ряда больше
{ 4, 7, 4, 4, 2, 4, 0, 5, 5, 7 }   //=42
    }, i, j, q=0;
long x, y=0;


for( i=0; i <5; i++ )
{
    for( x=0, j=0; j <11; j++ )
    {
         x=x +quick_matrix[i][j];  
         }

printf( "Ряд %d == %ld\n", i, x );

if( y <x )
{
    q=i;
    y=x;
    }
    }


printf( "\nРяд №%d имеет наибольшую сумму( %ld )\n", q, y );

return;
}

надеюсь по столбцам не надо искать

Автор: Dov 23.12.2006, 13:14
Цитата(apook @  23.12.2006,  11:08 Найти цитируемый пост)
надеюсь по столбцам не надо искать

Не только по столбцам, но и по строкам тоже не надо. 
apook, ты хоть читай, о чём речь идёт.  smile 

Автор: doomik 23.12.2006, 15:27
Цитата
doomik, и хде ж тя так учили массив создавать?  smile

Меня не учили сам учился  smile 

У меня всё скомпилилось без ошибок( gcc ) 
Попробывал через MinGW Developer Studio тоже скомпилилось только переменная Max выдаёт странное число. 
Тогда я заменил старую функцию на эту функцию и всё бегает.

Код

int Sumof(int Arr[], int I) 
{
    int Sum = 0, CopyArr = 0;
  CopyArr = Arr[I];
        while ( CopyArr != 0 ) {
            Sum = Sum + CopyArr % 10;
            CopyArr = CopyArr / 10;
            
        }
Arr[I] = Sum;
return Arr[I];
}




Microsoft Visual C++ 6.0 - Выдал 3 ошибки 
Цитата

error C2057: expected constant expression
error C2466: cannot allocate an array of constant size 0
error C2133: 'Arr' : unknown size

И все они на 9 строке --> т.е там где я и создавал массив.
Вот это упрямое существо не могу заставить компилить smile

Цитата
Да и магические числа тоже... smile

Почему магические  smile  ? это размер максимальный типа  int -> int  -2,147,483,648 -> +2,147,483,647


Denzel666
Цитата
А можно без функций попроще...И если не сложно с комментариями

Можно.

Код

#include <stdio.h>
int main()
{
    int I, Max = -2147483647, ArrSize, Id;
        printf("Enter array size:\n"); // Читаем длинну массива
        scanf("%d", &ArrSize);
        
        int Arr[ArrSize]; // Создаём массив 
    int Sum[ArrSize]; // Создаём ещё один для суммы
        
        for ( I = 0; I != ArrSize; I++ ) 
            {
                printf("Enter %d element:\n", I); // Заполняем массив числами
                scanf("%d", &Arr[I]);
                Sum[I] = 0; // Инициализируем массив Sum нулём
        }
//  Разделяем каждое число в массиве Arr  и присваиваем сумму к массиву Sum
        for ( I = 0; I != ArrSize; I++ ) {  
                while ( Arr[I] > 0 ) {
                    Sum[I] = Sum[I] + Arr[I] % 10;
                    Arr[I] = Arr[I] / 10;
                }
            }

/* Ищем максимальную сумму  в массиве Sum, если найдена то Id получает её индекс а Max  получает сумму */
        for ( I = 0; I != ArrSize; I++ ) {
            if ( Sum[I] > Max ) 
                Max = Sum[I];
                Id = I;
        }
                
// Печатаем максимальную сумму найденную в массиве + её индекс        
        printf("Element Id: %d\nMax element: %d\n", Id, Max);
return 0;
}

Пробывал компилить под MinGW Developer Studio всё бегает но в Microsoft Visual C++ 6.0 опять проблемы с массивом  smile .
Я считаю вариант с функцией был лучше но это моё мнение  smile 

Цитата
И что в вашем понимании протатип фцнкции? 

В книжке всё должно быть расписано  smile 

Автор: Dov 23.12.2006, 16:08
Цитата(doomik @  23.12.2006,  14:27 Найти цитируемый пост)
Microsoft Visual C++ 6.0 - Выдал 3 ошибки 

Дело в том, что размер статического массива должен быть известен во время компиляции. Позтому он должен быть константой. Как оно могло у тебя работать, я диву даюсь.  smile 

Автор: Denzel666 24.12.2006, 01:07
Задачу не поняли наверно...
Нужно например в массиве a{34.56.789.32.987} вывести 3 и 5-й элементы-a[2]=789 и a[4]=987...Потому что сумма цифр их в массиве является максимальной-24(7+8+9)...

Автор: Pete 24.12.2006, 16:46
Что-то http://forum.vingrad.ru/topic-128282/kw-%F1%F3%EC%EC%E0-%F6%E8%F4%F0-%EC%E0%F1%F1%E8%E2%FB.html много...

Автор: Dov 24.12.2006, 18:50
Цитата(Denzel666 @  24.12.2006,  00:07 Найти цитируемый пост)
Задачу не поняли наверно...

Denzel666, ты сам её не понял, даже после того, как Pete тебе решение выложил в дубликате твоей темы. 

Автор: Alexeis 24.12.2006, 18:58

M
alexeis1
Модератор: создавать дубликаты тем запрещено правилами форума!

Автор: adejneka 24.12.2006, 21:31
Цитата(Dov @ 22.12.2006,  22:36)
Цитата(doomik @  22.12.2006,  13:57 Найти цитируемый пост)
 
Код
printf("Enter array size:\n"); // Читаем длину массива
scanf("%d", &ArrSize);
int Arr[ArrSize]; // Создаём массив
 

doomik, и хде ж тя так учили массив создавать?  smile

Объявления переменных, перемешанные с операторами, и массивы переменной длины допускаются в ISO C99.

Автор: Dov 24.12.2006, 22:52
Цитата(adejneka @  24.12.2006,  20:31 Найти цитируемый пост)
допускаются в ISO C99.

ISO C99 фтопку  smile 

Автор: V.A.KeRneL 25.12.2006, 11:12
Цитата(Dov @  24.12.2006, 22:52 Найти цитируемый пост)

ISO C99 фтопку  smile

Конечно, НЕТ!
Но и использовать такие новомодные фишки, забивая на предыдущий стандарт и версию компилятора, как это делает doomik, я слитаю, тоже НЕправильно. Потому как, например, лучший GCC для чистого C -- 2.95.

Автор: V.A.KeRneL 28.12.2006, 15:57
Цитата(doomik @  23.12.2006, 15:27 Найти цитируемый пост)

Почему магические  smile  ? это размер максимальный типа  int -> int  -2,147,483,648 -> +2,147,483,647

Есть такой термин: «магическое число». Это такие числа, которые употребляются в программе, хотя естественно не должны, т.к. ничего не говорят сами по себе о природе своего происхождения. Их надо заменять на «символьные константы». Например, в данном случае, лучше было бы написать не 
Код

/*...*/ Max = -2147483647 /*...*/

, а 
Код

/*...*/ Max = INT_MIN /*...*/

, предварительно подключив <limits.h>.
И тогда бы ты, как раз, не ошибся на единичку: INT_MIN == -2,147,483,648, а не -2,147,483,647.

Автор: Denzel666 29.12.2006, 00:28
Спасиба за ответы...

Автор: Rockie 29.12.2006, 18:43
Цитата(adejneka @  24.12.2006,  21:31 Найти цитируемый пост)
Объявления переменных, перемешанные с операторами, и массивы переменной длины допускаются в ISO C99.

?!  smile 
интересно, где такой массив создастся? в стеке? 

Цитата(adejneka @  24.12.2006,  21:31 Найти цитируемый пост)
Объявления переменных, перемешанные с операторами

adejneka, а как это?

Автор: V.A.KeRneL 29.12.2006, 19:14
Цитата(adejneka @  24.12.2006, 21:31 Найти цитируемый пост)

... массивы переменной длины допускаются в ISO C99.

adejneka, Вы не совсем корректно выразились и, поэтому, вполне логично, что некоторые Все превратно поняли.
Правильно было бы написать, что стандарт C99 допускает не «массивы переменной длины», а «массивы, длина которых [при инициализации] задаётся переменной».

Автор: Rockie 29.12.2006, 20:45
Цитата(V_A_KeRneL @  29.12.2006,  19:14 Найти цитируемый пост)
 «массивы, длина которых [при инициализации] задаётся переменной».

V_A_KeRneL, ну да, из примера понятно о чем речь. 
adejneka, а можно ссылку? мне действительно непонятно, где создастся такой массив. 
Цитата(Rockie @  29.12.2006,  18:43 Найти цитируемый пост)
интересно, где такой массив создастся? в стеке? 




Автор: adejneka 29.12.2006, 22:19
Массивы, длина которых задается неконстантным выражением, создаются в стеке. Во многих старых компиляторах С была псевдофункция alloca, делавшая примерно то же самое (для одномерных массивов), но с другим синтаксисом:
Код

int
foo_old(int n)
{
  int *a = alloca ((n+17)*sizeof(*a));
  bar (a);
  return a[3]+a[n-11];
}

int
foo_99(int n)
{
  int a[n+17];
  bar (a);
  return a[3]+a[n-11];
}

Этот код на моей машине транслируется в
Код

foo_old:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $24, %esp
    movl    %esi, -4(%ebp)
    movl    8(%ebp), %esi
    movl    %ebx, -8(%ebp)
    leal    98(,%esi,4), %eax
    andl    $-16, %eax
    subl    %eax, %esp
    leal    19(%esp), %ebx
    andl    $-16, %ebx
    movl    %ebx, (%esp)
    call    bar
    movl    -44(%ebx,%esi,4), %eax
    addl    12(%ebx), %eax
    movl    -8(%ebp), %ebx
    movl    -4(%ebp), %esi
    leave
    ret


Операторы, перемешанные с объявлениями:
Код
int
quux (int k)
{
  if (k>11) goto xxx;
  {
    puts ("k<=11");
    int n = 42-k;
  xxx:
    if (k*k>33+8*k) n = k;
    return n;
  }
}

Автор: Rockie 30.12.2006, 21:29
adejneka, чудеса прям smile



Автор: Pete 30.12.2006, 22:25
Цитата(adejneka @  29.12.2006,  23:19 Найти цитируемый пост)
Во многих старых компиляторах С была псевдофункция alloca

Ее использование не одробряется (http://www.opennet.ru/man.shtml?topic=alloca&russian=0&category=&submit=%F0%CF%CB%C1%DA%C1%D4%D8+man)

Автор: Rockie 30.12.2006, 23:41
вот-вот. если честно, непонятно как она вообще работает. память ведь для процесса imho отводится заранее
Цитата
Во многих системах alloca не может быть использована в листе аргументов вызова функции, так как пространство под стек, зарезервированное alloca появится в середине стека для аргументов функций.  



Автор: adejneka 31.12.2006, 08:35
Цитата(Rockie @  30.12.2006,  23:41 Найти цитируемый пост)
вот-вот. если честно, непонятно как она вообще работает. память ведь для процесса imho отводится заранее

Надеюсь, под "памятью для процесса" Вы имеете в виду "фрейм стека для вызова функции", а не "кучу для процесса"?
На x86 `alloca' можно реализовать, например, так: фрейм стека разбивается на две части - статическую, содуржащую локальные переменные, и динамическую. Статическая часть размещается в начале фрейма, указатель на ее начало помещается в EBP. Динамическая часть размещается после статической, указатель на ее конец помещается в ESP. `alloca' уменьшает ESP и возвращает его новое значение. Доступ к аргументам функции и локальным переменным осуществляется с фиксированным на этапе компиляции смещением от EBP.

Автор: Rockie 1.1.2007, 22:27
Цитата(adejneka @  31.12.2006,  08:35 Найти цитируемый пост)
Надеюсь, под "памятью для процесса" Вы имеете в виду "фрейм стека для вызова функции", а не "кучу для процесса"?

с кучей понятно, вроде такие массивы и называются динамическими. А имею в виду вот этот:
Код

scanf("%d", &ArrSize);
int Arr[ArrSize]; // Создаём массив

а к примеру так случайно нельзя по стандарту ISO C99 делать?
Код

string currentType;
cout<<"Enter type ";
cin>>currentType;
currentType x;

В любом случае сведения очень интересные, за что и дал по репе smile



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