Re: Разряд числа ?
От: Кодт Россия  
Дата: 06.03.06 16:09
Оценка: 4 (1) +1
Привет!

> Помогите решить пример. Можна рекомендации.

> Найти все целые числа в инткрвале 1..1000, которые ==
> с последними розрядами своих квадратов(пример: 5*5=25,25*25=625).


Для k-разрядных (имеются в виду десятичные разряды) чисел, задача сводится к поиску решений
x*x == x + (10^k)*y
x*(x-1) == (10^k)*y

Этого уже достаточно для того, чтобы проверять полным перебором.
for(int x=1; x<=1000; ++x)
{
  // степень десятки, большая данного числа
  int tens = x<10 ? 10 : x<100 ? 100 : x<1000 ? 1000 : 10000;
  // можно было по-другому находить эту степень - но и так сойдёт

  if((x*x)%tens == x)
    cout << x << endl;
}


Идём дальше.

x*(x-1) == 2^k * 5^k * y

Это значит, что x или x-1 должны делиться на 2^k и на 5^k.
А поскольку x и x-1 взаимно просты, то ровно одно из них делится на 2^k, и ровно второе — на 5^k.

k=1: смотрим вокруг 5^1 = 5, проверяем деление на 2
x=5, x-1=4=2*2
x=6=2*3

k=2: смотрим вокруг нечётных, кратных 5^2 = 25. Проверяем деление на 4
x=25, x-1=24=4*6, x*x=625
x=26=2*13 — не прошло
x=75, x-1=74=2*37 — не прошло
x=76=4*19, x*x=5776

k=3: вокруг 5^3 = 125, проверяем деление на 8
x=125, x-1=124 — не прошло
x=126 — не прошло
x=375, x-1=374 — не прошло
x=376=8*47, x*x=141376
x=625, x-1=624=8*78, x*x=390625
x=626 — не прошло
x=875, x-1=874 — не прошло
x=876 — не прошло

Вот и вся история.
Могу вручную (!) продолжить дальше.
Пользуюсь для проверки калькулятором, хотя это не обязательно, если параллельно считать по модулю 2^k...

k=4: вокруг 3125, деление на 16
x=3125, x-1=3124 — нет
x=3126 — нет
x=9375, x-1=9374 — нет
x=9376=16*586, x*x=87909376

k=5, вокруг 15625, деление на 32
x=15625, x-1=15624 — нет
x=15626 — нет
x=46875, x-1=46876 — нет
x=46876 — нет
x=78125, x-1=78124 — нет
x=78126 — нет

Что-то мне подсказывает, что можно аналитически искать остальные решения...
Posted via RSDN NNTP Server 2.0
Перекуём баги на фичи!
Re: Разряд числа ?
От: rg45 СССР  
Дата: 06.03.06 15:01
Оценка: 1 (1)
Здравствуйте, etreyo, Вы писали:

E>Помогите решить.

E>Найти все целые числа в инткрвале 1..1000, которые равны последним розрядам своих квадратов(например 5*5=25,25*25=625). Помогите в поиске разряда. Может c помощью >> .

Лови:
bool first_is_subnumber_of_second(int first, int second)
{
  while(first != 0)
  {
    if(first % 10 != second % 10)
      return false;
    
    first /= 10;  
    second /= 10;  
  }
  return true;
}

int main()
{
  for(int i = 0; i < 1000; ++i)
  {
    if(first_is_subnumber_of_second(i, i*i))
      std::cout << i << ", " << i*i << std::endl;
  }
}


выводит на экран:

0, 0
1, 1
5, 25
6, 36
25, 625
76, 5776
376, 141376
625, 390625


Эх, добрый я
--
Справедливость выше закона. А человечность выше справедливости.
Разряд числа ?
От: etreyo  
Дата: 06.03.06 14:43
Оценка:
Помогите решить.
Найти все целые числа в инткрвале 1..1000, которые равны последним розрядам своих квадратов(например 5*5=25,25*25=625). Помогите в поиске разряда. Может c помощью >> .

06.03.06 19:35: Перенесено модератором из 'C/C++' — Кодт
Re: Разряд числа ?
От: D189D  
Дата: 06.03.06 15:09
Оценка:
Здравствуйте, etreyo, Вы писали:

E>Помогите решить.

E>Найти все целые числа в инткрвале 1..1000, которые равны последним розрядам своих квадратов(например 5*5=25,25*25=625). Помогите в поиске разряда. Может c помощью >> .


bool is_square(int number_a, int number_b)
{
    while (number_a && number_b && number_a%10==number_b%10)
        number_a/=10, number_b/=10;
    return !number_a || !number_b;
}

int main()
{
    for (int i=1; i<1000; i++)
    {
        if (is_square(i,i*i)) {...}
    }
}
Re: Разряд числа ?
От: Azst Россия  
Дата: 06.03.06 15:26
Оценка:
Здравствуйте, etreyo, Вы писали:

E>Помогите решить.

E>Найти все целые числа в инткрвале 1..1000, которые равны последним розрядам своих квадратов(например 5*5=25,25*25=625). Помогите в поиске разряда. Может c помощью >> .

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
char str1[8], str2[8];
int i=0;
for(long n=0; n<1000; n++)
{
sprintf(str1, "%ld", n);
sprintf(str2, "%ld", n*n);
i = strlen(str2) — strlen(str1);
if(!strncmp(&str2[i], str1, strlen(str1)))
printf("%ld*%ld=%ld\n",n,n,n*n);
}
return 0;
}
Re[2]: Разряд числа ?
От: Azst Россия  
Дата: 06.03.06 15:29
Оценка:
Здравствуйте, Azst, Вы писали:

A>Здравствуйте, etreyo, Вы писали:


E>>Помогите решить.

E>>Найти все целые числа в инткрвале 1..1000, которые равны последним розрядам своих квадратов(например 5*5=25,25*25=625). Помогите в поиске разряда. Может c помощью >> .

Сорри, поформатить забыл .....
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    char str1[8], str2[8];
    int i=0;
    for(long n=0; n<1000; n++)
    {
        sprintf(str1, "%ld", n);
        sprintf(str2, "%ld", n*n);
        i = strlen(str2) - strlen(str1);
        if(!strncmp(&str2[i], str1, strlen(str1)))
            printf("%ld*%ld=%ld\n",n,n,n*n);
    }
    return 0;
}
Re[2]: Верное направление!
От: Аноним  
Дата: 10.03.06 09:10
Оценка:
Здравствуйте, Кодт, Вы писали:

К>x*(x-1) == 2^k * 5^k * y


К>Это значит, что x или x-1 должны делиться на 2^k и на 5^k.

К>А поскольку x и x-1 взаимно просты, то ровно одно из них делится на 2^k, и ровно второе — на 5^k.

Тем самым дело сводится к решению уравнений a*2^k-b*5^k=(+1,-1) в натуральных a,b при всех k.
Если перебора по k достаточно, именно эту задачу решает расширенный алгоритм Евклида.

К>Что-то мне подсказывает, что можно аналитически искать остальные решения...


В свою очередь, что-то мне подсказывает, что аналитически получить зависимость
решений от k будет весьма затруднительно. Хотя надо будет попробовать...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.