Показать сообщение отдельно
  #2  
Старый 17.02.2010, 13:55
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

А такие числа есть ?

( вообще то это уже математика, которой ужасно давно не занимался поэтому, если кто найдет ошибки - исправьте )

Пусть исходное число = y*100 + x
где x - натуральное число от 0 до 99.
y - любое положительное натуральное число.
(т.е. число 123= 1*100 + 23)

Введем z представляющую порядок
Т.е. z = 10, 100, 1000, .... ( z=10^n)
и
y < z ( если z= 100 y=0..99)

Тогда задачу можно представить в виде системы:

1. y < z
2. (y*100 + x)*2 = x*z + y

2: y*200 - y = x*z - x*2
y * 199 = x * (z - 2)

Подставим в 1.

x * (z - 2) / 199 < z
x*z - x*2 < z * 199
-x*2<z(199-x)
z>-x*2/(199-x)
z - любое ( к сожалению в первом варианте у меня z выходила отрицательным, что означало отсутствие таких чисел, но при переписывании нашел ошибку ).
Зато формула y = x * (z - 2) / 199 позволяет быстро перебрать все варианты в пределах Int64. Я делал это так:
Код:
procedure TForm1.tbChislaClick(Sender: TObject);
var
  x : Integer;
  Zmax, y,z: Int64;
  Surse, Dest: Int64;
begin
  Memo1.Clear;
  ZMax := High(Int64) div 100;// чтобы не вылезти за пределы
  for x := 1 to 99 do
  begin
    z := 10;
    while z <= ZMax do
    begin
      y := x * (z - 2);
      if (y mod 199) = 0 then // y должно быть целым числом
      begin
        y := y div 199;
        Memo1.Lines.Add(Format('(%d) %d - %d',[z, x, y] )); 
      end;
      z := z*10;
    end;
  end;
  Memo1.Lines.Add('STOP');
end;
Но ни одного решения не нашел.
Ответить с цитированием