Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сумма 5-х степеней цифр числа 
V
    Опции темы
gosn1ck
Дата 22.4.2009, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 18.4.2009

Репутация: 1
Всего: 1



вот собственно задача 
Найдите все числа, которые могут быть представлены в виде 5-х степеней составляющих их цифр. Чему равно произведение всех этих чисел?
вот пример 1634 = 1(в степени 4) + 6(в степени 4) + 3(в степени 4) + 4(в степени 4), но надо для пятых.
мой код

Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  FILE *fin;
  if (SaveDialog1->Execute())
  {
    fin = fopen(SaveDialog1->FileName.c_str(), "wt");
    char buf[128];
    for (long int i = 10000; i <=99999; i ++)
    {
      fprintf(fin,"%i\n", i);;
    }
    fclose(fin);
  }
}
//---------------------------------------------------------------------------
int persing (char *arg)
{
  int rezult, Num = 0 , summa = 0;
  for(int i = 0; arg[i]; i++)
  {
    Num = arg[i]-0x30;
    switch (Num) {
      case 1 : summa = summa + pow(1, 5); break;
      case 2 : summa = summa + pow(2, 5); break;
      case 3 : summa = summa + pow(3, 5); break;
      case 4 : summa = summa + pow(4, 5); break;
      case 5 : summa = summa + pow(5, 5); break;
      case 6 : summa = summa + pow(6, 5); break;
      case 7 : summa = summa + pow(7, 5); break;
      case 8 : summa = summa + pow(8, 5); break;
      case 9 : summa = summa + pow(9, 5); break;

    }
  }
 //ShowMessage(summa);
 return summa;
}

void __fastcall TForm1::Button2Click(TObject *Sender)
{
  ifstream fin;
  int temp, temp2, temp3 = 1;
  if (SaveDialog1->Execute())
  {
    fin.open(SaveDialog1->FileName.c_str());
    if (!fin.good()) fin.close(); // файл не открылся - закрываем поток
    else                          // иначе записываем строки в Memo1
      {
        char buf[128];
        while (fin.getline(buf,sizeof(buf)))
        {
          temp = atoi(buf);
          temp2 = persing(buf);
          if (temp == temp2) {temp3 = temp; ShowMessage(temp3);}
        }
        fin.close();
        ;
      }
  }
}


в 1ой кнопке я просто записал в файл все возможные числа из 5 цифр
во 2ой для переменной temp присваиваю текущее значение числа, а temp2 идёт на персинг цифр в сумму, после персинга сравниваю и вывожу какие именно получились числа.
открываю калькуляр и перемножаю 3 полученных числа (у меня подозрение что их на самом деле больше) и получию 472551890922864 - пишу это число в ответ и получаю отрицательный результат :( помогите найти ошибку?
мои 3 числа - 54748, 92727, 93084

PM MAIL ICQ   Вверх
IKM2007
Дата 22.4.2009, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 3
Всего: 40



gosn1ck, ты правильные числа нашел. Вот код, но твой метод с файлами мне не понравился. Проще так. Это печатаем числа, удовлетворяющие нашим требованиям.
Код

#include <iostream>
#include <cmath>
using namespace std;
void f(int x)
{
int item = x;

for(int a = 0, b = item%10; item; item/=10, b = item%10)
a += pow(b, 5);

if(a == x)
cout<<x<<endl;
}
void main()
{
    
for (int i = 10000; i< 100000; i++)
   f(i);
}


А это конкретно твоя прога.

Код

#include <iostream>
#include <cmath>
using namespace std;
int f(int x)
{
int item = x;

for(int a = 0, b = item%10; item; item/=10, b = item%10)
a += pow(b, 5);


return (a == x)?x:1;
}
void main()
{
    int i, mul = 1;
   for (i = 10000; i< 100000; i++)
        mul *= f(i);

   cout<<mul<<endl;

}



--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
Albor
Дата 22.4.2009, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 2
Всего: 9



Можно примерно так найти нужные числа:
Код

void main()
{ 
    char ch[6];
    char *pch;
    int sum(0);
    for(int i=1; i< 100000;i++)
    {
        pch=ch;
        itoa(i,pch,10);
        sum=0;
        while(*pch!=0)
        {
            switch (*pch)
            {
            case '1':sum+=(int)pow(1,5);break;
            case '2':sum+=(int)pow(2,5);break;
            case '3':sum+=(int)pow(3,5);break;
            case '4':sum+=(int)pow(4,5);break;
            case '5':sum+=(int)pow(5,5);break;
            case '6':sum+=(int)pow(6,5);break;
            case '7':sum+=(int)pow(7,5);break;
            case '8':sum+=(int)pow(8,5);break;
            case '9':sum+=(int)pow(9,5);break;
            }
            pch++;
        }
        if(i==sum) cout<<i<<", ";

    }
    cout<<endl;
}

PM MAIL ICQ   Вверх
gosn1ck
Дата 22.4.2009, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 18.4.2009

Репутация: 1
Всего: 1



IKM2007, а можно с комментировать цикл? мне этот метод тоже особо не нравится, дело в том что значение произведения вылезет за пределы  unsigned long int smile поэтому и извернулся. скажи результат у тебя такой же ? или я калькулятором пользоваться не умею ?)
PM MAIL ICQ   Вверх
Albor
Дата 22.4.2009, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 2
Всего: 9



Цитата(gosn1ck @  22.4.2009,  15:28 Найти цитируемый пост)
значение произведения вылезет за пределы  unsigned long int smile поэтому и извернулся.

Конечно, результат - 7-байтное число. используй double для результата.
PM MAIL ICQ   Вверх
math64
Дата 22.4.2009, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Произведение в unsigned long int конечно не влезет.
А зачем switch у gosn1ck и Albor ? Вы думете компилятор посчитает pow() на этапе компиляции?
Чтобы ускорить выполнение программы, степени нужно вычислить заранее:
Код

int powers5[10];
void calcpowers5() {
  for(int i = 0; i < 10; i++)
    powers5[i] = (int)pow(i,5);
}

int persing (char *arg)
{
  int summa = 0;
  for(int i = 0; arg[i]; i++) {
    int Num = arg[i]-0x30;
    summa += powers5[Num];
  }
   return summa;
}

void main() {
  calcpowers5();
  ...
}

PM   Вверх
Albor
Дата 22.4.2009, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 2
Всего: 9



Цитата(math64 @  22.4.2009,  15:51 Найти цитируемый пост)
Вы думете компилятор посчитает pow() на этапе компиляции?

Я проверил, всё считается. Конечно код не очень, т.к. на скорую руку.
math64, а почему может не считаться?
-------------------ПОЗЖЕ----------------------
Я Вас понял, конечно, вместо pow лучше было подставить константы.

Это сообщение отредактировал(а) Albor - 22.4.2009, 16:05
PM MAIL ICQ   Вверх
math64
Дата 22.4.2009, 16:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



он будет считаться, но считаться на этапе выполнение, компилятор не знает, что pow(1, 5) = 1 и всегда будет вызывать возведение в степень, а тогда смысла с switch никакого. В данном случае можно записать все степени в таблицу и посчитать их один раз.
Или так:
Код

#define POW5(n) (n*n*n*n*n)

switch(num) {
   case 1: sum += POW5(1); break;
   case 2: sum += POW5(2); break;
   case 3: sum += POW5(3); break;
   case 4: sum += POW5(4); break;
   case 5: sum += POW5(5); break;
   case 6: sum += POW5(6); break;
   case 7: sum += POW5(7); break;
   case 8: sum += POW5(8); break;
   case 9: sum += POW5(9); break;
}

В этом случае компилятор посчитает степени на этапе компиляции и switch будет действительно полезен.
PM   Вверх
gosn1ck
Дата 22.4.2009, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 18.4.2009

Репутация: 1
Всего: 1



здорово, спасибо, об этом даже не подумал.
PM MAIL ICQ   Вверх
IKM2007
Дата 22.4.2009, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 3
Всего: 40



Цитата(gosn1ck @  22.4.2009,  15:28 Найти цитируемый пост)
IKM2007, а можно с комментировать цикл? мне этот метод тоже особо не нравится, дело в том что значение произведения вылезет за пределы  unsigned long int  поэтому и извернулся. скажи результат у тебя такой же ? или я калькулятором пользоваться не умею ?)

Результат тот же, что и у тебя. Вот нормально работающий код, не выходит за пределы.
Код

#include <iostream>
#include <cmath>
using namespace std;
int f(int x)
{
int item = x;

for(int a = 0, b = item%10; item; item/=10, b = item%10)
a += pow(b, 5);


return (a == x)?x:1;
}
void main()
{
    unsigned long int i, mul = 1;
   for (i = 10000; i< 100000; i++)
        mul *= f(i);

   cout<<mul<<endl;

}



--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
IKM2007
Дата 22.4.2009, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 3
Всего: 40



gosn1ck, заменил цикл for циклом while, так легче поймешь. Еще передаю параметр в функцию по ссылке.
Код

#include <iostream>
#include <cmath>
using namespace std;
int f(int &x)//используем ссылку, чтобы избежать большой траты времени на копирование
{
int item, a, b;
item = x;// копируем X
a = 0;//здесь будет сумма 5-х степеней цифр числа
b = item%10;//последниая цифра числа
while(item)//пока item ненулевое значение
{
a += pow(b, 5);
item/=10;//убираем последную цифру
b = item%10;//последная цифра получившегося числа
}

return (a == x)?x:1;//если сумма равна числу, возращает это число, если нет, возращает 1
}
void main()
{
    int i;
    unsigned long int mul = 1;
   for (i = 10000; i< 100000; i++)
        mul *= f(i);

   cout<<mul<<endl;

}


Это сообщение отредактировал(а) IKM2007 - 22.4.2009, 17:01


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
math64
Дата 23.4.2009, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



IKM2007, передавая параметр по ссылке ты времени не экономишь, а наоборот больше тратишь - ссылка это фактически тот же указатель, только более удобный синтаксис, будет лишняя команда 
Код

; int& x;
; int item;
; item = x;
  mov ebx, x
  mov eax, dword ptr[ebx]
  mov item, eax

вместо
Код

; int x;
; int item;
; item = x;
  mov eax, x
  mov item, eax

Кроме того, у тебя больше времени уходит на вычисление степеней - зачем экономить на мелочах?
PM   Вверх
IKM2007
Дата 23.4.2009, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 3
Всего: 40



...

Это сообщение отредактировал(а) IKM2007 - 23.4.2009, 15:05


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
gosn1ck
Дата 28.4.2009, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 18.4.2009

Репутация: 1
Всего: 1



IKM2007, у переменной mul должен быть тип double, но вот вопрос как мне его вывести полностью в целом виде, а не 4,7e+14 ?
PM MAIL ICQ   Вверх
math64
Дата 28.4.2009, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Код

printf("%.0f\n", mul);

PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0597 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.