Форум программистов, компьютерный форум CyberForum.ru

Дано натуральное число n. Выяснить, является ли оно полным квадратом - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Asti7
0 / 0 / 0
Регистрация: 11.03.2014
Сообщений: 36
05.09.2014, 20:01     Дано натуральное число n. Выяснить, является ли оно полным квадратом #1
Дано натуральное число n. Выяснить, является ли оно полным квадратом. Определить функцию, позволяющую распознавать полные квадраты.
C++
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.09.2014, 20:01     Дано натуральное число n. Выяснить, является ли оно полным квадратом
Посмотрите здесь:

C++ Дано целое число N (> 1). Если оно является простым
Дано натуральное число N. Определить, является ли оно палиндромом. Число-палиндром можно читать справа налево и слева направо одинаково. Например, C++
Ввести натуральное число N. Определить, является ли оно совершенным C++
C++ Дано натуральное число n. Выяснить, является ли оно полным квадратом.Определить функ-цию, позволяющую распознавать полные квадраты
Дано натуральное число N. Если оно C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2139 / 972 / 223
Регистрация: 30.11.2013
Сообщений: 3,241
05.09.2014, 20:10     Дано натуральное число n. Выяснить, является ли оно полным квадратом #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
 
bool polnuukvadrat(int num)
{
    for(int i=1;i<= num/2;i++)
    {
        if(i*i == num)
            return true;
    }
    return false;
}
int main()
{   
    cout << polnuukvadrat(9) << endl;
    return 0;
}
Asti7
0 / 0 / 0
Регистрация: 11.03.2014
Сообщений: 36
05.09.2014, 20:14  [ТС]     Дано натуральное число n. Выяснить, является ли оно полным квадратом #3
Выводит ошибку в начале
Holmes
 Аватар для Holmes
5 / 5 / 1
Регистрация: 24.08.2014
Сообщений: 78
05.09.2014, 20:21     Дано натуральное число n. Выяснить, является ли оно полным квадратом #4
C++
1
2
double a=sqrt(n) ;
std::cout<<((int)a == a ? "целое" : "дробное"<<std::endl;
Вроде так.
Asti7
0 / 0 / 0
Регистрация: 11.03.2014
Сообщений: 36
05.09.2014, 20:26  [ТС]     Дано натуральное число n. Выяснить, является ли оно полным квадратом #5
Получается еще больше ошибок((
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
05.09.2014, 20:27     Дано натуральное число n. Выяснить, является ли оно полным квадратом #6
Цитата Сообщение от Holmes Посмотреть сообщение
Вроде так.
Не-а
C++
1
2
3
int a = round(sqrt(n));
if(a*a == n) std::cout << "Yes";
else std::cout << "No";
Добавлено через 25 секунд
Цитата Сообщение от Asti7 Посмотреть сообщение
Получается еще больше ошибок((
здесь все коды - это не полный код, а основная часть программы
Asti7
0 / 0 / 0
Регистрация: 11.03.2014
Сообщений: 36
05.09.2014, 20:36  [ТС]     Дано натуральное число n. Выяснить, является ли оно полным квадратом #7
Цитата Сообщение от Dani Посмотреть сообщение
здесь все коды - это не полный код, а основная часть программы
А чего здесь не хватает? Вроде библиотека и объявление данных есть
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
05.09.2014, 20:39     Дано натуральное число n. Выяснить, является ли оно полным квадратом #8
А, недосмотрел код rikimaru2013. Значит так какая-то проблема
Asti7
0 / 0 / 0
Регистрация: 11.03.2014
Сообщений: 36
05.09.2014, 21:00  [ТС]     Дано натуральное число n. Выяснить, является ли оно полным квадратом #9
Цитата Сообщение от Dani Посмотреть сообщение
А, недосмотрел код rikimaru2013. Значит так какая-то проблема
Можете помочь,пожалуйста?)))
zss
Модератор
Эксперт С++
 Аватар для zss
5952 / 5557 / 1787
Регистрация: 18.12.2011
Сообщений: 14,201
Завершенные тесты: 1
05.09.2014, 22:23     Дано натуральное число n. Выяснить, является ли оно полным квадратом #10
Вместо
C++
1
cout << polnuukvadrat(9) << endl;
Я бы написал
C++
1
2
3
4
if(polnuukvadrat(9))
   cout<<"yes\n";
else 
   cout<<"no\n";
KOPOJI
Модератор
 Аватар для KOPOJI
16242 / 6453 / 390
Регистрация: 12.06.2012
Сообщений: 19,355
05.09.2014, 22:39     Дано натуральное число n. Выяснить, является ли оно полным квадратом #11
zss, можно и с тернарным, чуть сократить..
C++
1
cout << (polnuukvadrat(9) ? "yes" : "no") << endl;
Цитата Сообщение от Asti7 Посмотреть сообщение
Выводит ошибку в начале
наверное, одна из ошибок - это ругань на отсутствие
C++
1
#include "stdafx.h"
Если, конечно, это студия..
Asti7, а что за ошибка?
_Ivana
2189 / 1394 / 124
Регистрация: 01.03.2013
Сообщений: 4,151
Записей в блоге: 2
05.09.2014, 22:43     Дано натуральное число n. Выяснить, является ли оно полным квадратом #12
rikimaru2013, чтож так неоптимально то - до половины числа всегда бежать, можно прекращать безобразие когда квадрат больше числа. Да и шаг можно сделать не единицей а двойкой и для нечетных начинать с 1 а для четных с 2. Sqrt, перевод во флоаты и математическая библиотека это конечно хорошо, но от себя предложу такой вариант:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    if (a == 0) SetWindowTextW(hwndSta3, L"yes, 0^2=0");
    else {
        unsigned int x0, x1 = a;
        do {
            x0 = x1;
            x1 = (x0 + a/x0)>>1;
        } while (x1 < x0);
 
        wchar_t buf[20];
        if (x1*x1 == a) wsprintfW(buf, L"yes, %u^2=%u", x1, a);
        else wsprintfW(buf, L"no, %u^2!=%u", x1, a);
        SetWindowTextW(hwndSta3, buf);
    }
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
05.09.2014, 22:59     Дано натуральное число n. Выяснить, является ли оно полным квадратом #13
_Ivana, можно пару слов о работе алгоритма?
_Ivana
2189 / 1394 / 124
Регистрация: 01.03.2013
Сообщений: 4,151
Записей в блоге: 2
05.09.2014, 23:06     Дано натуральное число n. Выяснить, является ли оно полным квадратом #14
Dani, можно. Наоборот, приятно, что кто-то хочет думать, а не просто во флоаты переводить, math подключать и sqrt писать, формируя в результате огромный ассемблерный код
Для начала почитайте вот здесь Вычисление квадратного корня , ближе к концу. Там теория с некоторыми ссылками. А в данном случае я применил эту теорию (метод Ньютона вычисления квадратного корня) к целому типу, он сходится неприлично быстро, и в конце остается только проверить, точное ли значение корня целого типа получилось в результате или нет.
Да, условие проверки выхода из цикла сделано такое, потому что начальное приближение корня у нас равно самому числу, значит в процессе последовательных приближений оно может только уменьшаться, а если вдруг увеличилось - у нас начались "биения" младшего бита, алгоритм сошелся, но эти биения будут бесконечны.
SlavaSSU
213 / 158 / 44
Регистрация: 17.07.2012
Сообщений: 580
05.09.2014, 23:59     Дано натуральное число n. Выяснить, является ли оно полным квадратом #15
ну тогда еще и так можно)

C++ (Qt)
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
#include <iostream>
 
using namespace std;
 
typedef long long li;
 
int main()
{
    li n;
    cin >> n;
    li lf = 0, rg = (li)(1e9);
    while(rg - lf > 1LL)
    {
        li mid = (lf + rg) / 2;
        if(mid * mid > n)
            rg = mid;
        else
            lf = mid;
    }
 
    for(li i = lf; i <= rg; i++)
        if(i * i == n)
        {
            cout << "YES " << i << " * " << i << " == " << n << endl;
            return 0;
        }
 
    cout << "NO" << endl;
 
    return 0;
}
_Ivana
2189 / 1394 / 124
Регистрация: 01.03.2013
Сообщений: 4,151
Записей в блоге: 2
06.09.2014, 00:43     Дано натуральное число n. Выяснить, является ли оно полным квадратом #16
Ну да, еще один метод решения уравнения - Вейерштрасса (дихотомии/половинного деления). Сходится помедленнее Ньютона, но тоже гораздо лучше всего вышепредложенного. Единственно что, я бы начальную правую границу все-таки взял не от балды
C++
1
rg = (li)(1e9);
, а равной исходному числу
C++
1
rg = n;
да и остальной код можно оптимизировать, но идея понятна.
ЗЫ вообще любой метод решения уравнений здесь подойдет.

Добавлено через 22 минуты
C++
1
2
3
4
5
6
7
8
9
10
    unsigned int lf = 0, rg = a + 1;
    do {
        unsigned int mid = (lf + rg)>>1;
        if (mid * mid > a) rg = mid; else lf = mid;
    } while(rg - lf > 1);
 
    wchar_t buf[50];
    if (lf*lf == a) wsprintfW(buf, L"yes, %u^2=%u", lf, a);
    else wsprintfW(buf, L"no, %u^2!=%u", lf, a);
    SetWindowTextW(hwndSta3, buf);
При таком начальном значении и логике изменения rg никогда не может быть точным корнем из a, значит проверять его нечего - проверяем только lf.

ЗЫ ждем кто вспомнит другие методы, например, секущих
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.09.2014, 16:53     Дано натуральное число n. Выяснить, является ли оно полным квадратом
Еще ссылки по теме:

Дано натуральное число n. Определите, является ли оно степенью числа 2, и если является, то выведите значение этой степени C++
Проверить, является ли целое число трёхзначным, является ли оно квадратом C++
C++ Дано натуральное число. Определить оканчивается ли оно цифрой 7 C++

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

Или воспользуйтесь поиском по форуму:
Asti7
0 / 0 / 0
Регистрация: 11.03.2014
Сообщений: 36
06.09.2014, 16:53  [ТС]     Дано натуральное число n. Выяснить, является ли оно полным квадратом #17
Цитата Сообщение от _Ivana Посмотреть сообщение
if (a == 0) SetWindowTextW(hwndSta3, L"yes, 0^2=0");
* * else {
* * * * unsigned int x0, x1 = a;
* * * * do {
* * * * * * x0 = x1;
* * * * * * x1 = (x0 + a/x0)>>1;
* * * * } while (x1 < x0);
wchar_t buf[20];
* * * * if (x1*x1 == a) wsprintfW(buf, L"yes, %u^2=%u", x1, a);
* * * * else wsprintfW(buf, L"no, %u^2!=%u", x1, a);
* * * * SetWindowTextW(hwndSta3, buf);
* * }
А можете пожалуйста помочь с полной программой? А то я путаюсь и ошибки получаются))
Yandex
Объявления
06.09.2014, 16:53     Дано натуральное число n. Выяснить, является ли оно полным квадратом
Ответ Создать тему
Опции темы

Текущее время: 19:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru