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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.09.2013, 00:43   #1
xTODx
Новичок
Джуниор
 
Регистрация: 26.09.2013
Сообщений: 1
Плохо Арифметическое переполнение.

В общем, задача такая:
Вводим цифру n от 2 до 9.
Нужно найти самое меньшее число, что бы n было последней цифрой, и если умножить число на n, то n переносилось вперёд, а те цифры что были, остаются позади.

Код:
Program Inform;
uses crt;
var n, a, b, k, m, l, z, c, t, g, des, i : longint;
    err: integer;
    s, s1, s2, sa, sb, s3, s4: string;
begin
     t:= 0;
     writeln('Vvedite chislo N ot 2 do 9');
     readln(n);
     if (2<=n) AND (n<=9) then
     begin
     des:=1;
     k:=n;
     z:=0;
     a:=0;
     writeln('Idet Raschet');
     while t = 0 do
           begin
           m:=k*n+l;
           Str(m,s);
           g:=length(s);
           if g > 1 then
              begin
              s1:= copy(s, 0, 1);
              s2:= copy(s, 1, 2);
              Val(s1,k,err);
              Val(s2,l,err);
              end
           else
               begin
               s1:=copy(s,0,1);
               val(s1,k,err);
               l:=0;
               end;
           z:=z+1;
           for i:=1 to z do
           des:= des* 10;
           a:=(a+m*des);
           b:=a*n;
           Str(a, sa);
           Str(b, sb);
           s3:= copy(sa,0,-1);
           s4:= copy(sb,0, 1);
           if s3=s4 then
             begin
             Writeln('Chislo 1 = ', a);
             Writeln('chislo 2 =', b);
             t:= 1;
             end
           end
     end
     else
     begin
     writeln('ne verno');
     readln;
     end
end.
Вот такой набросок вышел. Как бы реализовать верно эту задачу?
xTODx вне форума Ответить с цитированием
Старый 26.09.2013, 02:01   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Наверное, без длинной арифметики не обойтись.
Как видится решение:
(10 * k + n) * n = n * 10 ^ length(k) + k откуда k = n * (10 ^ length(k) - n) / (10 * n - 1).
Само число 10 * k + n.
Перебираем длину числа k, пока не сможем нацело поделить.
Код:
#include <iostream>

using namespace std;

int
main()
{
    const int lim = 10;
    for (long long unsigned int n = 2; n < 10; ++n) {
        int i = 1, p = 10;
        while (n * (p - n) % (10 * n - 1) && i < lim) {
            p *= 10;
            ++i;
        };
        cout << n << " - ";
        if (i == lim)
            cout << "No";
        else
            cout << n * (p - n) / (10 * n - 1) * 10 + n;
        cout << endl;
    }
}
Находит только для 4 - 102564 (остальные не помещаются).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 26.09.2013, 09:51   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

BDA спасибо за предоставленный алгоритм.

я адаптировал код (c) BDA под Delphi
и воспользовался типом данных int64
нашлись ещё числа для 2 и 8:
Цитата:
Код:
2 :
 105263157894736842
210526315789473684

3 :  not found (overflow)
4 :
 102564
410256

5 :  not found (overflow)
6 :  not found (overflow)
7 :  not found (overflow)
8 :
 1012658227848
8101265822784

9 :  not found (overflow)
похоже, что дальше без длинной арифметики никуда...

p.s. А вообще, решения для всех n от 2 до 9 существуют? можно это доказать аналитически?

p.p.s. если не ошибаюсь, в .NET есть встроенная поддержка длинных чисел, возможно, там можно попытаться найти решение.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.09.2013, 10:14   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var n,i,k,j,m: integer;
    s1,s2: String;
begin
  for n:=2 to 9 do begin
    s1:=''; s2:=''; i:=n; k:=0;
    repeat
      s1:=IntToStr(i)+s1;
      m:=i*n+k;
      i:=m mod 10;
      s2:=IntToStr(i)+s2;
      k:=m div 10;
    until (i=n) and (k=0);
    Memo1.Lines.Add(Format('%s*%d=%s',[s1,n,s2]));
  end;
end;
Код:
105263157894736842*2=210526315789473684
1034482758620689655172413793*3=3103448275862068965517241379
102564*4=410256
102040816326530612244897959183673469387755*5=510204081632653061224489795918367346938775
1016949152542372881355932203389830508474576271186440677966*6=6101694915254237288135593220338983050847457627118644067796
1014492753623188405797*7=7101449275362318840579
1012658227848*8=8101265822784
10112359550561797752808988764044943820224719*9=91011235955056179775280898876404494382022471
Плясал отсюда
Изображения
Тип файла: jpg Безымянный.JPG (60.1 Кб, 32 просмотров)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 26.09.2013 в 10:17.
Аватар вне форума Ответить с цитированием
Старый 26.09.2013, 10:45   #5
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,136
По умолчанию

Цитата:
если не ошибаюсь, в .NET есть встроенная поддержка длинных чисел, возможно, там можно попытаться найти решение.
не ошибаетесь. Но она там кажись не полная, только то, что нужно для криптографии.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 26.09.2013, 10:54   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Utkin, спасибо за информацию.

Теперь, после поста от Аватара, в рамках данной темы, длинная арифметика утратила актуальность, уже есть готовое полноценное решение!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти среднее арифметическое их квадратов и среднее арифметическое их модулей. (Турбо паскаль) erte Помощь студентам 1 30.10.2012 13:08
Арифметическое переполнение GamBitFRK Помощь студентам 1 09.05.2012 22:22
С++ Найти среднее арифметическое положительных и среднее арифметическое отрицательных чисел, минимальное по модулю число. Юрик 530 Помощь студентам 4 03.12.2011 16:26
Циклы. Арифметическое переполнение. sqr Паскаль, Turbo Pascal, PascalABC.NET 5 09.11.2011 01:18
Арифметическое переполнение hasana Помощь студентам 2 04.11.2010 18:08