On-line: гостей 0. Всего: 0 [подробнее..]
Программисты всех стран, объединяйтесь!

АвторСообщение



ссылка на сообщение  Отправлено: 14.09.18 16:50. Заголовок: Определить делится ли целое число нацело на квадрат другого целого числа


Вот очень простое задание (смотрите Problem with my code to find if a number is divisible by a perfect square), но требующее аккуратности при написании кода.

Задание, как следует из вопроса, представленного по ссылке, состоит в том, чтобы для заданного целого числа x определить делится ли оно нацело на квадрат другого числа i из диапазона [2, i * i <= x]..

Для этой задачи важно, чтобы в цикле не было бы переполнения целых чисел, иначе программа будет иметь неопределенное поведение.

Вот как может выглядеть соответствующая функция, которая определяет заданное условие, как показано в нижеприведенной демонстрационной программе, для чисел из диапазона [0, N), где N - некоторое произвольное число (в демонстрационной программе установленное равным 100)..

 
#include <stdio.h>

_Bool divisible_by_perfect_square( unsigned int x )
{
unsigned int i = 2;

while ( i <= x / i && x % ( i * i ) != 0 ) i++;

return i <= x / i;
}

int main( void )
{
const unsigned int N = 100;

for ( unsigned int i = 0; i < N; i++ )
{
if ( divisible_by_perfect_square( i ) )
{
printf( "%2u is divisible by a perfect square.\n", i );
}
}
}


Вывод программы на консоль:

 
4 is divisible by a perfect square.
8 is divisible by a perfect square.
9 is divisible by a perfect square.
12 is divisible by a perfect square.
16 is divisible by a perfect square.
18 is divisible by a perfect square.
20 is divisible by a perfect square.
24 is divisible by a perfect square.
25 is divisible by a perfect square.
27 is divisible by a perfect square.
28 is divisible by a perfect square.
32 is divisible by a perfect square.
36 is divisible by a perfect square.
40 is divisible by a perfect square.
44 is divisible by a perfect square.
45 is divisible by a perfect square.
48 is divisible by a perfect square.
49 is divisible by a perfect square.
50 is divisible by a perfect square.
52 is divisible by a perfect square.
54 is divisible by a perfect square.
56 is divisible by a perfect square.
60 is divisible by a perfect square.
63 is divisible by a perfect square.
64 is divisible by a perfect square.
68 is divisible by a perfect square.
72 is divisible by a perfect square.
75 is divisible by a perfect square.
76 is divisible by a perfect square.
80 is divisible by a perfect square.
81 is divisible by a perfect square.
84 is divisible by a perfect square.
88 is divisible by a perfect square.
90 is divisible by a perfect square.
92 is divisible by a perfect square.
96 is divisible by a perfect square.
98 is divisible by a perfect square.
99 is divisible by a perfect square.


Обратите внимание, что даже на сайте Stackoverflow, где помещен исходный вопрос, решение задания у многих вызывает трудности.:)

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 2 [только новые]





ссылка на сообщение  Отправлено: 15.09.18 12:13. Заголовок: Функцию divisible_by..


Функцию divisible_by_perfect_square можно переписать также таким образом. что она будет возвращать число, на квадрат которого делится аргумент функции, или 0 в случае, если такое число не найдено.

Например,

 
#include <stdio.h>

unsigned int divisible_by_perfect_square( unsigned int x )
{
unsigned int i = 2;

while ( i <= x / i && x % ( i * i ) != 0 ) i++;

return i <= x / i ? i : 0;
}

int main(void)
{
const unsigned int N = 100;

for ( unsigned int i = 0; i < N; i++ )
{
unsigned int n = divisible_by_perfect_square( i );
if ( n )
{
printf( "%2u is divisible by square %2u.\n", i, n * n );
}
}
}


Вывод программы на консоль:
 
4 is divisible by square 4.
8 is divisible by square 4.
9 is divisible by square 9.
12 is divisible by square 4.
16 is divisible by square 4.
18 is divisible by square 9.
20 is divisible by square 4.
24 is divisible by square 4.
25 is divisible by square 25.
27 is divisible by square 9.
28 is divisible by square 4.
32 is divisible by square 4.
36 is divisible by square 4.
40 is divisible by square 4.
44 is divisible by square 4.
45 is divisible by square 9.
48 is divisible by square 4.
49 is divisible by square 49.
50 is divisible by square 25.
52 is divisible by square 4.
54 is divisible by square 9.
56 is divisible by square 4.
60 is divisible by square 4.
63 is divisible by square 9.
64 is divisible by square 4.
68 is divisible by square 4.
72 is divisible by square 4.
75 is divisible by square 25.
76 is divisible by square 4.
80 is divisible by square 4.
81 is divisible by square 9.
84 is divisible by square 4.
88 is divisible by square 4.
90 is divisible by square 9.
92 is divisible by square 4.
96 is divisible by square 4.
98 is divisible by square 49.
99 is divisible by square 9.


Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 18.09.18 16:05. Заголовок: Если есть желание на..


Если есть желание написать соответствующую функцию (например, показанную в первом сообщении этой темы) на языке C++, то она может выглядеть следующим образом, как показано в демонстрационной программе.

 
#include <iostream>
#include <iomanip>
#include <functional>

template <typename T>
bool divisible_by_perfect_square( T x ) requires std::is_integral_v<T>
{
T i = 2;

while ( i <= x / i && x % ( i * i ) != 0 ) i++;

return i <= x / i;
}

int main()
{
const unsigned int N = 100;

for ( unsigned int i = 0; i < N; i++ )
{
if ( divisible_by_perfect_square( i ) )
{
std::cout << std::setw( 2 ) << i <<" is divisible by a perfect square.\n";
}
}
}


В этой программе используются конструкция C++ 17 requires.
Чтобы код компилировался, например, компилятором gcc HEAD 9.0.0 201809, то следует задать опцию компилятора -fconcepts.

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 31
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет