Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/40: Рейтинг темы: голосов - 40, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 04.07.2018
Сообщений: 21

Разработать функцию, определяющую, является ли натуральное число квадратом какого-либо другого целого числа

21.08.2018, 21:01. Показов 8679. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Разработать функцию, определяющую, является ли натуральное число квадратом какого-либо другого целого числа. Не использовать стандартную функцию вычисления корня.
Помогите пожалуйста, как можно это осуществить?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.08.2018, 21:01
Ответы с готовыми решениями:

Алгоритм определения является ли натуральное число степенью какого-либо натурального числа
Помогите на гос.экзамене. Т.е. Вводится одно натуральное число, а выводом должно быть - число (тоже натуральное), если такое есть,...

Описать функцию проверяющую является ли число квадратом некоторого целого числа
Описать функцию целого типа, возвращающую 1, если целый параметр K (> 0) является квадратом некоторого целого числа, и 0 в противном...

Проверить является ли число квадратом целого числа
такой вопрос: как сделать условие - если квадратный корень выражения целочисленный -> выполняется действие

12
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
22.08.2018, 07:14
Лучший ответ Сообщение было отмечено Tr4um как решение

Решение

C++
1
2
3
4
5
6
7
bool IsRoot(int n)
{ int i;
for(i=1; i*i<=n; i++)
;
if (i*i==n) return true;
else return false;
}
На эффективность не претендую.

Добавлено через 2 минуты
Пардон. Это Си, а не плюсы
C
1
2
3
4
5
6
7
int IsRoot(int n)
{ int i;
for(i=1; i*i<=n; i++)
;
if (i*i==n) return 1;
else return 0;
}
1
677 / 479 / 216
Регистрация: 06.09.2013
Сообщений: 1,312
22.08.2018, 08:25
Лучший ответ Сообщение было отмечено Байт как решение

Решение

Tr4um,
C
1
2
3
4
5
int is_square(int n)
{
    for(int i = 1; n > 0; i += 2) n -= i;
    return !n;
}
3
26 / 23 / 12
Регистрация: 25.06.2018
Сообщений: 91
22.08.2018, 16:51
я бы вначале проверил на 0 и 1, так как это решение. Затем удалил бы четность с проверкой деления на 4, так как 4 это 2 * 2. То есть если чсло делится на 2 и не делится на 4, то оно уже не может иметь решения в целых числах. А затем бы проверял нечетные числа, но до n / 3. Функция возвращает отрицательный результат, если корень не найден.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int isSquare(int i)
{
  if( i == 0 || i == 1)
    return i;
  if( i % 4 == 0)
    return 2 * isSquare(i / 4);
  if(i % 2 == 0)
    return -1;
  for( int i = 3; i < n / 3;  i += 2)
  {
     if( n % i == 0 && (n % (i * i) == 0)
        return i * isSquare(n / (i * i));
  }
   return -1;
}
2
20 / 15 / 5
Регистрация: 28.08.2018
Сообщений: 18
28.08.2018, 21:27
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int has_sqrt(unsigned int v) {
    unsigned int s = 0;
    unsigned int k = 0;
 
    s = 1 << (k + 8); if (s * s <= v) k += 8;
    s = 1 << (k + 4); if (s * s <= v) k += 4;
    s = 1 << (k + 2); if (s * s <= v) k += 2;
    s = 1 << (k + 1); if (s * s <= v) k += 1;
 
    s = 1 << k;
    while (k-- > 0) {
        unsigned int t = s | (1 << k);
        if (t * t <= v) {
            s = t;
        }
    }
 
    return s * s == v || v == 0;
}
3
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
28.08.2018, 22:42
z1ne2wo, не могли бы вы "на пальцах" пояснить идею вашего алгоритма?

Добавлено через 35 минут
Тестирование "в разброс" ошибок не обнаружило.
Но сама структура алгоритма вызывает сомнения.
Возможно, он работает только для чисел типа unsigned int ?
И не является ли он "школьным" вычислением корня "в столбик", только в двоичной с/с ?
1
20 / 15 / 5
Регистрация: 28.08.2018
Сообщений: 18
29.08.2018, 00:59
Вначале находим наибольший единичный бит h такого числа s = h | x1 | x2 | ... | xn (h > x1 > x2 > ... > xn), что v - s*s -> min (>= 0).

Пример:
v = 109561, sqrt(v) = 331 = 101001011(2),
тогда h = 100000000(2), k = 8.
Затем в цикле последовательно находим x1, x2, ..., xn, тем самым получая искомое s.

Продолжение:
s = 1 << 8 = 100000000(2);
k = 7: t = s | 010000000(2) = 110000000(2) [> sqrt(v)]; t * t <= v? - false -> s;
k = 6: t = s | 001000000(2) = 101000000(2) [<= sqrt(v)]; t * t <= v? - true -> s = t;
...
k = 0: t = s | 000000001(2) = 101001011(2) [<= sqrt(v)]; t * t <= v? - true -> s = t.
В итоге, возвращаем Истину, если s - корень v, то есть s*s == v, что эквивалентно v - s*s == 0.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,173
29.08.2018, 04:43
Цитата Сообщение от Байт Посмотреть сообщение
идею вашего алгоритма?
В "традиционной" позиционной системе счисления с любым основанием вы можете вычислять корень числа путем подбора индивидуальных разрядов в направлении от старших к младшим.

Например, в десятичной записи: если нам дано число 73496329, то первым делом мы определим, что 9000 в качестве корня - это слишком много, а 8000 - мало. То есть начинаем с 8000.

Далее подбираем следующий разряд и находим, что 8600 - слишком много, а 8500 - мало.

Далее подбираем следующий разряд и находим, что 8580 - слишком много, а 8570 - мало.

Далее подбираем следующий разряд и находим, что 8574 - слишком много, а 8573 - точно.

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

Именно это и реализовано в алгоритме z1ne2wo.

Добавлено через 2 часа 13 минут
---

Разумеется никто вам не запрещает реализовать метод Ньютона для вычисления корня и просто воспользоваться им

C
1
2
3
4
5
6
unsigned root(unsigned x)
{
  unsigned r = x;
  for (unsigned next_r = (r + x / r) / 2; next_r != r; r = next_r, next_r = (r + x / r) / 2);
  return r;
}
1
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
29.08.2018, 07:06
развивая тему половинного деления
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
 
int main() {
    static const int sqr[] = { 0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225,
     /*в настоящей программе свыше полумиллиона символов и форум не даёт мне их запостить*/
, 2147117569, 2147210244, 2147302921, 2147395600};
 
        const int* s = sqr;
        size_t delta = 23170;
        int x = 2129637904;
        while (delta)
        {
            if (s[delta] <= x) s += delta;
            delta >>= 1;
        }
        cout << (s[delta] == x ? "square" : "not square") << endl;
    return 0;
}
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
29.08.2018, 16:33
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
развивая тему половинного деления
... не забываем, что раздел всё-таки С, а не С++.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
31.08.2018, 20:32
вспомнил как давным давно считал корни на калькуляторе
брал примерный корень
делил число на него
потом средне арифметическое
опять делил
пока числа не были похожи
по мотивам этого накидал програмку
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include "stdio.h"
#include "math.h"
 
int MySqr(int i,double a,int b)
{
 
  double c=b/a;
  int g=round(a);
  int k=round(c);
  printf("   iter %d c=%f  a=%f    a-c=%f  g=%d k=%d\n",++i,c,a,a-c,g,k);
 
  if((fabs(a-c))<0.0001)
    {
   if(round(a)*round(c)==b)
     return 1;
   else
     return 0;
    }
 
  return MySqr(i,(c+a)/2,b);
 
 
 
}
 
 
int main()
{
  int x;
  scanf("%d",&x);
  while(x){
      printf("%d\n",MySqr(0,1,x));
      scanf("%d",&x);
 
  };
 
}

аргумент i это итерации
к примеру число 10000001 за 16 итераций определяет у него нет целочисленных корней
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,173
02.09.2018, 20:49
Цитата Сообщение от ValeryS Посмотреть сообщение
вспомнил как давным давно считал корни на калькуляторе
брал примерный корень
делил число на него
потом средне арифметическое
Это и есть метод Ньютона, реализация которого (целочисленная) приведена в моем ответе выше.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
02.09.2018, 20:52
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Это и есть метод Ньютона,
вполне может быть но я его сам придумал, тому назад много лет, когда на калькуляторах было только "+" "-" "%" и "*"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.09.2018, 20:52
Помогаю со студенческими работами здесь

Вычислить произведение P двух целых чисел x и y,если сумма их квадратов является квадратом другого целого числа
помогите,срочно нужно решить задачу: Вычислить произведение P двух целых чисел x и y,если сумма их квадратов является квадратом другого...

Написать функцию IsSquare(K), проверяющую, является ли K квадратом некоторого целого числа
Описать функцию IsSquare(K ) логического типа, возвращающую TRUE, если целый параметр K (&gt; 0) является квадратом некоторого це-лого...

Определить, является ли введённое с клавиатуры число квадратом целого числа
Написала программу, но выдаёт ошибку то в if то в k=a*a; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; int...

При каких n принадлежащих N, число n^2+3n+2 является квадратом целого числа
При каких n принадлежащих N, число n^2+3n+2 является квадратом целого числа

Как проверить является данное число квадратом целого числа?
Как проверить является данное число квадратом целого числа? подскажите какое необходимо написать условие.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru