Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.03.2013, 02:13   #1
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию Ошибка "Access violation"

Доброго времени суток, уважаемые). Начал изучать "С++. Освой на примерах.". Начал выполнять упражнения и столкнулся с ошибкой, которая в заголовке. Вот код:
PHP код:
/*Напишите программу, которая определит и выведет на экран один сомножитель
из N, который можно вычеркнуть из произведения 1!*2!*3!*...*N! так, чтобы
оставшееся произведение было точным квадратом */
#include <iostream.h>
#include <conio.h>
//---------------------------------------------------------------------------

int main()
{
  
__int64* Array=0;
  
int n,k// n - число факториалов, К - номер сомножителя, который вырезаем
  
__int64 multiplication// выражение 1!*2!*3!*...*N! без К-того элемента массива
  
bool breakdown=false;
  
bool find=false;
  
cout<<"vvedite N\n";
  
cin>>n;
//выделение памяти
  
Array=(__int64*) realloc(Array,sizeof(__int64)*n);
/*заполнение массива факториалами*/
  
for (int i=1;i<=n;i++)
  {
    Array[
i]=1;
    for (
int j=1;j<=i;j++)
    {
      Array[
i]=Array[i]*j;
    }
    
cout<<i<<" element ="<<Array[i]<<"\n";
  }
 
// поиск равенства
  
for (int i=1;i<=100;i++) // i - число которое будем возводить в степень
  
{
    
k=1;
    while (
k<=n/* будем поочередно вырезать K-тый
элемент из массива, а все остальные перемножать (произведение заносим в multiplication) и 
сравнивать с i*i */
    
{
      
multiplication=1;
      for (
int j=1;j<=n;j++) 
// тут происходит перемножение всех элементов, кроме К-того
      
{
        
multiplication=j==multiplication multiplication*Array[j];
// если произведение всех сомножителей, кроме первого, меньше полного квадрата
// i-того числа, значит полный квадрат "i+1" будет тоже больше произведения, и дальше
// производить поиск бесполезно
        
if (multiplication<i*i&&k==1breakdown=true;
      }
// собственно сравнение
      
if (multiplication==i*i)
      {
       
cout<<"i="<<i<<"; i*i="<<i*i;
       
cout<<"; multiplication="<<multiplication<<"; k="<<k;
       
cout<<"; Array[k]="<<Array[k]<<"\n";
       
find=true
       }
      if (
breakdown) break;
      
k++;
    }
    if (
breakdown) break;
  }
  if (
find==falsecout << "Net takih\n";
// освобождение памяти 
 
free(Array);
  
getch();

Не пойму, где косяк, ведь выделяю и освобождаю память под массив правильно. Юзаю Borland C++ Builder. Ось - Win 7.
Спасибо, что заглянули)). И ОГРОМНОЕ СПАСИБО за ответы.
UPD
Протрассировал прогу, ошибка вылетает после getch();
Если помог, проси поставить минус. Будь оригинален!

Последний раз редактировалось Rin; 19.03.2013 в 02:46. Причина: Забыл упомянуть компилятор и ось. Прокомментировал код.
Rin вне форума Ответить с цитированием
Старый 19.03.2013, 06:56   #2
OktXIV
Пользователь
 
Регистрация: 16.02.2013
Сообщений: 18
По умолчанию

/*заполнение массива факториалами*/
for (int i=1;i<=n;i++)
{
Array[i]=1;
for (int j=1;j<=i;j++)
{
Array[i]=Array[i]*j;
}
cout<<i<<" element ="<<Array[i]<<"\n";
}

нумерация элементов начинается с 0 до n-1
OktXIV вне форума Ответить с цитированием
Старый 19.03.2013, 10:49   #3
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Благодарю! Зависания по ночам с книгами меня когда-нибудь погубит). Как всегда туплю.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 19.03.2013, 11:39   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

На самом деле, там не надо перемножать. Уже при N=8 результат не влезет в int, при N=10 не влезет и в __int64. Слишком быстро растущая функция для решения "в лоб".
Abstraction вне форума Ответить с цитированием
Старый 19.03.2013, 16:14   #5
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Это лишь начало книги, главное было научиться использовать циклы, условные операторы, и выборку. 23! или 24! не влезет в int64. Можно использовать "long double", но и тут будет трабл, ибо в мантиссе значащих чисел лишь 20. Хоть это и просто упражнение, но интересно, как выкрутиться из этой ситуации?
Если помог, проси поставить минус. Будь оригинален!

Последний раз редактировалось Rin; 19.03.2013 в 16:26.
Rin вне форума Ответить с цитированием
Старый 19.03.2013, 16:21   #6
ArmanPrestige
Главное желание.
Форумчанин
 
Регистрация: 28.11.2011
Сообщений: 122
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
при N=10 не влезет и в __int64.
http://msdn.microsoft.com/en-us/libr...(v=vs.80).aspx

Цитата:
Maximum value for a variable of type __int64
9223372036854775807
Я могу, Я хочу, Я буду!
ArmanPrestige вне форума Ответить с цитированием
Старый 19.03.2013, 17:09   #7
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

ArmanPrestige, и что Вы хотите сказать? Теперь посчитайте 1!*2!*3!*...*10!. Элементарная оценка сверху скажет Вам, что это больше 2^78. Более того, можно оценить и результат при N=9, он тоже не влезает.

Цитата:
Можно использовать "long double", но и тут будет трабл, ибо в мантиссе значащих чисел лишь 20. Хоть это и просто упражнение, но интересно, как выкрутиться из этой ситуации?
Заведомо рабочий способ - считать простые множители. Квадрат - это такое число, в разложение которого на простые множители каждый множитель входит в чётной степени. Составить табличку N*M, где M - число простых чисел от 2 до N; заполнить степенями для факториалов; посмотреть, можно ли вычеркнуть строку так, чтобы сумма оставшихся элементов в каждом столбце была чётной.
Возможно, можно ещё подумать и доказать, скажем, что при любом N>6 решения не существует (если что, я понятия не имею, существуют ли они).

Последний раз редактировалось Abstraction; 19.03.2013 в 17:11.
Abstraction вне форума Ответить с цитированием
Старый 19.03.2013, 17:19   #8
ArmanPrestige
Главное желание.
Форумчанин
 
Регистрация: 28.11.2011
Сообщений: 122
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
ArmanPrestige, и что Вы хотите сказать? Теперь посчитайте 1!*2!*3!*...*10!. Элементарная оценка сверху скажет Вам, что это больше 2^78. Более того, можно оценить и результат при N=9, он тоже не влезает.
Извините, проглядел. Не заметил что произведение факториалов. Мне почему-то показалась сумма факториалов.
Я могу, Я хочу, Я буду!
ArmanPrestige вне форума Ответить с цитированием
Старый 20.03.2013, 13:41   #9
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

for Abstraction
Поэксперементировал, значится. Ввел i<9223372036854775807 в условии цикла. Равенство выполняется только при N=2, во всех остальных случаях выводит "Net takix".
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 20.03.2013, 14:28   #10
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Поэксперементировал, значится. Ввел i<9223372036854775807 в условии цикла. Равенство выполняется только при N=2, во всех остальных случаях выводит "Net takix".
Ищите ошибку. 1!*3!*4! = 144 = 12^2.
Abstraction вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Access violation at address in module "Project1.exe"... NewLamer&Programer Помощь студентам 12 23.11.2012 14:54
Ошибка: "Access violation at address 004035BE in module Project1" haker270 Общие вопросы Delphi 4 25.04.2012 22:33
Ошибка "Access violation at address 004043A8 in module 'Project1.exe'. Read of address 00FF5A53." ms.Karishka Общие вопросы Delphi 6 14.04.2011 22:18
Ошибка: " class EAccessViolatiossViolation with n with message 'Access violation at address 0052D1D5..." lutdan Помощь студентам 4 02.04.2011 04:29
Ошибка "Acces violation" в чем может быть причина TRIZER Общие вопросы Delphi 2 02.05.2010 12:10