Помогите решить.
Найти все целые числа в инткрвале 1..1000, которые равны последним розрядам своих квадратов(например 5*5=25,25*25=625). Помогите в поиске разряда. Может c помощью >> .
06.03.06 19:35: Перенесено модератором из 'C/C++' — Кодт
Здравствуйте, 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, Вы писали:
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)) {...}
}
}
Здравствуйте, 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;
}
Здравствуйте, 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;
}
Привет!
> Помогите решить пример. Можна рекомендации.
> Найти все целые числа в инткрвале 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