Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/28: Рейтинг темы: голосов - 28, средняя оценка - 4.57
Belfegor
Ghost
173 / 173 / 40
Регистрация: 16.09.2012
Сообщений: 526
1

Как проверить является ли число точным квадратом?

23.02.2013, 19:43. Просмотров 5750. Ответов 18
Метки нет (Все метки)

как проверить является ли число точным квадратом?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2013, 19:43
Ответы с готовыми решениями:

Проверить является ли введенное число точным квадратом
Помогите пожалуйста Проверить введенное число точным квадратом. с помощью...

Проверить, является ли какой-либо член последовательности точным квадратом
Требуется проверить числовую последовательность является ли какой-либо...

Выяснить, является ли натуральное число N точным квадратом
Составит линейную логическую программу, печатающую значение 1, если указанное...

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

Проверить, является ли целое число трёхзначным, является ли оно квадратом
помогите пожалуйста новичку 1) Введите целое число и проверьте, является ли...

18
Хулиган
85 / 80 / 21
Регистрация: 08.08.2012
Сообщений: 737
23.02.2013, 20:08 2
Цитата Сообщение от Belfegor Посмотреть сообщение
как проверить является ли число точным квадратом?
точный квадрат - это число корень которого целое число..следовательно извлекаем корень и от него отнимаем значение округлённого корня например корень из N =2.7 округляем получится 3 затем 2.7 - 3 =0.3 получается если разность не округлённого корня и округлённого равно 0 то число является точным квадратом

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <cmath>
#include <locale>
using namespace std;
int main() {
setlocale(LC_ALL, "Rus");
double ch;
cout<<"Ââåäèòå ÷èñëî: ";
cin>>ch;
ch=(sqrt(ch)-ceil(sqrt(ch)));
if(ch==0) {
                     cout<<"Òî÷Г*ûé ГЄГўГ*äðГ*ГІ";
                     }
else {
     cout<<"ГЌГҐ òî÷Г*ûé ГЄГўГ*äðГ*ГІ";
}
}
1
palva
3116 / 2246 / 452
Регистрация: 08.06.2007
Сообщений: 8,168
Записей в блоге: 4
23.02.2013, 20:27 3
Плавающие числа представлены в компьютере с некоторой погрешностью, да еще само извлечение корня даст некоторую погрешность, поэтому вряд ли такой алгоритм скажет "да" для достаточно большого квадрата целого числа. Возьмем, например 81. Хотя я не пробовал, но буду удивлен, если данная программа скажет, что это точный квадрат. Я предлагаю так: после извлечения квадрата и округления преобразовать в целый тип, возвести в квадрат и сравнить с исходным целым числом. Если совпадает, значит точный квадрат.
0
Хулиган
85 / 80 / 21
Регистрация: 08.08.2012
Сообщений: 737
23.02.2013, 20:35 4
Цитата Сообщение от palva Посмотреть сообщение
поэтому вряд ли такой алгоритм скажет "да" для достаточно большого квадрата целого числа.
возводил 4-значные числа в квадрат вводил в программу - РАботает!

число 1653 в квадрате = 2732409 - показывает Точный квадрат, 2732409.001 - уже не точный
0
palva
3116 / 2246 / 452
Регистрация: 08.06.2007
Сообщений: 8,168
Записей в блоге: 4
23.02.2013, 20:44 5
Хулиган, Согласен. Здесь целые числа, и мои опасения беспочвенны. Хотя во всех учебниках и пишут, что сравнение плавающих чисел на равенство/неравенство некорректно.
0
Nick Alte
Эксперт С++
1648 / 1020 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
23.02.2013, 20:46 6
Точность чисел в формате double 15-16 десятичных значащих цифр.
0
palva
3116 / 2246 / 452
Регистрация: 08.06.2007
Сообщений: 8,168
Записей в блоге: 4
23.02.2013, 20:52 7
Здесь не точность важна. Чтобы результативно сравнить числа на равенство, они должны быть представлены с абсолютной точностью. А для плавающих чисел такое бывает в исключительных случаях. Целое значение это один из таких случаев. А вот возможность double представлять целые числа с бОльшей абсолютной величиной, чем int здесь является преимуществом.
0
daslex
1291 / 535 / 177
Регистрация: 02.08.2011
Сообщений: 2,756
23.02.2013, 21:07 8
palva, ничто не мешает сравнивать разность чисел.
Если сравнивать разность чисел и ставить условие >= (<=) 0.0000000001, например, то как вы думаете, какой первый точный квадрат должен быть ошибочен?

(я этого не знаю, но полагаю достаточно большое число). Число легко округляется на число с погрешностью лучшей чем 0.000000001
0
palva
3116 / 2246 / 452
Регистрация: 08.06.2007
Сообщений: 8,168
Записей в блоге: 4
23.02.2013, 21:22 9
Цитата Сообщение от daslex Посмотреть сообщение
ничто не мешает сравнивать разность чисел.
Я зарекся так делать. Однажды я так сделал и моя программа на некоторых процессорах стала вылетать по так называемому переполнению снизу (это была машина IBM360) На IBM PC такого поведения сопроцессора не предусмотрено, но когда-то при вычитании очень близких но неравных чисел, если получался машинный ноль, то программа останавливалась. Еще называлось исчезновение точности.
0
ITcrusader
Эксперт С++
177 / 163 / 21
Регистрация: 12.02.2013
Сообщений: 410
23.02.2013, 21:38 10
Цитата Сообщение от daslex Посмотреть сообщение
palva, ничто не мешает сравнивать разность чисел.
Ух, мешает. palva абсолютно прав. Сравнение вещественных чисел вообще - целое искусство и имеет мнооожество вариаций. На чисметах в свое замучился постигать эти тайны.
0
daslex
23.02.2013, 21:43
  #11

Не по теме:

palva,
ITcrusader,

вы сравниваете число с числом, но не разность и проверку результата на условие допустимой погрешности. Я правильно понял?

0
palva
3116 / 2246 / 452
Регистрация: 08.06.2007
Сообщений: 8,168
Записей в блоге: 4
23.02.2013, 22:37 12
Цитата Сообщение от daslex Посмотреть сообщение
Я правильно понял?
А я даже не понял что вы спросили. Я знаю что процессор может вычесть два числа и получить разность, может сравнить два числа и определить, которое из них больше. Может быть, современные процессоры могут еще что-то экзотическое...
0
Kuzia domovenok
2421 / 2151 / 525
Регистрация: 25.03.2012
Сообщений: 7,749
Записей в блоге: 1
23.02.2013, 22:42 13
самый быстрый способ - хранить массив точных квадратов всех чисел в нужном диапазоне и использовать двоичный поиск по массиву.
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <iostream>
#include <stdint.h>
const uint16_t squares[] = {
    0, 1, 4, 9,
    16, 25, 36, 49,
    64, 81, 100, 121,
    144, 169, 196, 225,
    256, 289, 324, 361,
    400, 441, 484, 529,
    576, 625, 676, 729,
    784, 841, 900, 961,
    1024, 1089, 1156, 1225,
    1296, 1369, 1444, 1521,
    1600, 1681, 1764, 1849,
    1936, 2025, 2116, 2209,
    2304, 2401, 2500, 2601,
    2704, 2809, 2916, 3025,
    3136, 3249, 3364, 3481,
    3600, 3721, 3844, 3969,
    4096, 4225, 4356, 4489,
    4624, 4761, 4900, 5041,
    5184, 5329, 5476, 5625,
    5776, 5929, 6084, 6241,
    6400, 6561, 6724, 6889,
    7056, 7225, 7396, 7569,
    7744, 7921, 8100, 8281,
    8464, 8649, 8836, 9025,
    9216, 9409, 9604, 9801,
    10000, 10201, 10404, 10609,
    10816, 11025, 11236, 11449,
    11664, 11881, 12100, 12321,
    12544, 12769, 12996, 13225,
    13456, 13689, 13924, 14161,
    14400, 14641, 14884, 15129,
    15376, 15625, 15876, 16129,
    16384, 16641, 16900, 17161,
    17424, 17689, 17956, 18225,
    18496, 18769, 19044, 19321,
    19600, 19881, 20164, 20449,
    20736, 21025, 21316, 21609,
    21904, 22201, 22500, 22801,
    23104, 23409, 23716, 24025,
    24336, 24649, 24964, 25281,
    25600, 25921, 26244, 26569,
    26896, 27225, 27556, 27889,
    28224, 28561, 28900, 29241,
    29584, 29929, 30276, 30625,
    30976, 31329, 31684, 32041,
    32400, 32761, 33124, 33489,
    33856, 34225, 34596, 34969,
    35344, 35721, 36100, 36481,
    36864, 37249, 37636, 38025,
    38416, 38809, 39204, 39601,
    40000, 40401, 40804, 41209,
    41616, 42025, 42436, 42849,
    43264, 43681, 44100, 44521,
    44944, 45369, 45796, 46225,
    46656, 47089, 47524, 47961,
    48400, 48841, 49284, 49729,
    50176, 50625, 51076, 51529,
    51984, 52441, 52900, 53361,
    53824, 54289, 54756, 55225,
    55696, 56169, 56644, 57121,
    57600, 58081, 58564, 59049,
    59536, 60025, 60516, 61009,
    61504, 62001, 62500, 63001,
    63504, 64009, 64516, 65025
};
inline bool is_square(uint16_t x) {
    const uint16_t *p = squares;
 
    if (p[128] <= x) p += 128;
    if (p[ 64] <= x) p +=  64;
    if (p[ 32] <= x) p +=  32;
    if (p[ 16] <= x) p +=  16;
    if (p[  8] <= x) p +=   8;
    if (p[  4] <= x) p +=   4;
    if (p[  2] <= x) p +=   2;
    if (p[  1] <= x) p +=   1;
 
    return (p[0] == x);
}
0
daslex
1291 / 535 / 177
Регистрация: 02.08.2011
Сообщений: 2,756
23.02.2013, 22:46 14
palva, троллим уже?

Что тут не понятного
C++
1
2
if (a-b==0)  //Проверка с числом
if (fabs(a-b)>eps) //Проверка на разность с допустимой погрешностью
0
palva
3116 / 2246 / 452
Регистрация: 08.06.2007
Сообщений: 8,168
Записей в блоге: 4
23.02.2013, 23:23 15
Kuzia domovenok, вот так тоже быстро
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
 
int main()
{
    __int64 a=156438768;
    __int64 s,t;
    a = a*a; 
//    a = a*a+1;
// Проверка числа a на точный квадрат
    s=a/2;
    for(;;) {
        t=(s + a/s)/2;
        if (t==s) break;
        s=t;
    }
    if(s*s==a) cout << "Square\n";
    else cout << "Not square\n";
    return 0;
}
0
ITcrusader
Эксперт С++
177 / 163 / 21
Регистрация: 12.02.2013
Сообщений: 410
23.02.2013, 23:27 16
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
самый быстрый способ - хранить массив точных квадратов всех чисел в нужном диапазоне и использовать двоичный поиск по массиву.
Изящный способ
0
palva
3116 / 2246 / 452
Регистрация: 08.06.2007
Сообщений: 8,168
Записей в блоге: 4
23.02.2013, 23:52 17
Мдя, не всегда сходится извлечение корня. Придется так, правда, при a=1 не работает, требуется дополнительная проверка:
C++
1
        if (abs(t-s)<=1) break;
Добавлено через 8 минут
Вот так, чтоб абсолютной величины не было. Но с единицей все равно не работает, надо вначале проверку сделать.
C++
1
        if (t>=s) break;
0
daslex
1291 / 535 / 177
Регистрация: 02.08.2011
Сообщений: 2,756
23.02.2013, 23:59 18
Цитата Сообщение от ITcrusader Посмотреть сообщение
Ух, мешает. palva абсолютно прав
если так, то почему и трех часов не прошло до слов
Цитата Сообщение от palva Посмотреть сообщение
Мдя, не всегда сходится
Цитата Сообщение от palva Посмотреть сообщение
Придется так

Не по теме:

Хотя Можете не отвечать. Мне неинтересно уже.

0
palva
3116 / 2246 / 452
Регистрация: 08.06.2007
Сообщений: 8,168
Записей в блоге: 4
24.02.2013, 00:02 19
daslex, извините, если обидел.
0
24.02.2013, 00:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.02.2013, 00:02

Проверить является ли число квадратом
Проверить,N - квадрат числа?Если да,вывести его sqrt.Если нет - ближайший...

Функция: проверить, является ли число полным квадратом
написать на языке С++ Описать функцию IsSquare(K) логического типа,...

Написать функцию, которая будет проверять является ли аргумент точным квадратом
Мне нужно написать функцию которая будет выдавать точный квадрат числа,и...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru