Я новичок в С++ не могу решить данную задачу.
К примеру, дано число 48, 48^2 = 2304, 4^3 + 8^3 = 576, 576 * 4 = 2304, 2304 = 2304.
Возьмем число 52, 52^2 = 2704, 5^3 + 2^3 = 133, 133 * 4 = 532, 532 !=2704
Я новичок в С++ не могу решить данную задачу.
К примеру, дано число 48, 48^2 = 2304, 4^3 + 8^3 = 576, 576 * 4 = 2304, 2304 = 2304.
Возьмем число 52, 52^2 = 2704, 5^3 + 2^3 = 133, 133 * 4 = 532, 532 !=2704
Впрочем, ладно, держите :)
int main()
{
int N;
cin >> N;
cout << ((N==48) ? "YES":"NO");
}
Минусующие, сначала врубитесь в ответ, ладно? :)
Любое двузначное число можно представить в виде формулы для цифр 10 * d1 + d2 ( 1 <= d1 <= 9 && 0 < d2 <= 9), и ваша задача сводится к решению уравнения
(10 * d1 + d2)^2 = 4 * (d1^3 + d2^3)
Это значит, что левая часть уравнения должна делиться на 4, и если учесть, что при d2 == 0 имеем 100 * d1^2 = 4 * d1^3 <=> 25 = d1 не удовлетворяющее уравнение, то не трудно заметить, что для этого d2^2 должен делиться на 4, то есть:
d2 == 2 || d2 == 4 || d2 == 6 || d2 == 8
Формула диктует также, что если d2 четное, то и d1 должен быть четным. И если копать дальше, то заметим, что d2 / 4 тоже должен иметь значение >= 2, а значит d2 == 8, следовательно(по формуле) d1 == 4 и Harry from Kiev прав в своем ответе. Но если не копать, то имеем:
for(int d1 = 2; d1 < 10; d1 += 2)
for (int d2 = 2; d2 < 10; d2 += 2) {
int n = 10 * d1 + d2;
if (n * n == 4 * (d1 * d1 * d1 + d2 * d2 * d2))
cout << n << ' ';
//или сравнение
//((N == n) ? "YES":"NO")
}
template<typename T>
vector<short> get_digits(T number)
{
short num_digits = floor(log10(abs(number ? number : 1)) + 1);
vector<short> digs(num_digits);
for (; num_digits; num_digits--, number /= 10)
digs[num_digits - 1] = (number % 10);
return digs;
}
int main()
{
int n;
cin >> n;
auto digs = get_digits(n); // получить вектор из цифр числа
short sum = pow(digs[0], 3) + pow(digs[1], 3); // сумма кубов цифр
bool res = (pow(n, 2) == sum*4);
cout << boolalpha << res << endl;
return 0;
}
log10, pow — неоправданное привлечение арифметики с плавающей точкой в целочисленную задачу. Уверены ли вы в корректности своего алгоритма, если, например, вызов pow(10, 2) может запросто вернуть 99.99...? Такие реализации функции pow существуют.
– wololo
Mar 22 '22 at 20:06