Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/34: Рейтинг темы: голосов - 34, средняя оценка - 4.68
0 / 0 / 0
Регистрация: 11.03.2014
Сообщений: 36
1

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

05.09.2014, 20:01. Показов 6723. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Дано натуральное число n. Выяснить, является ли оно полным квадратом. Определить функцию, позволяющую распознавать полные квадраты.
C++
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.09.2014, 20:01
Ответы с готовыми решениями:

Дано натуральное число n. Выяснить, является ли оно полным квадратом.Определить функ-цию, позволяющую распознавать полные квадраты
Вот пока что сделал, дальше домозговать не могу. #include "stdafx.h" #include "math.h" #include...

Выяснить, является ли заданное число полным квадратом (используя функцию)
#include <stdio.h> int n, i; for(i=1; i< sqrt(n)+1; i++) { if (n==i*i) { cout << "Kvadra";...

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

Дано натуральное число n. Определите, является ли оно степенью числа 2, и если является, то выведите значение этой степени
Дано натуральное число n. Определите, является ли оно степенью числа 2, и если является, то...

16
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
05.09.2014, 20:10 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;
}
0
0 / 0 / 0
Регистрация: 11.03.2014
Сообщений: 36
05.09.2014, 20:14  [ТС] 3
Выводит ошибку в начале
0
5 / 5 / 1
Регистрация: 24.08.2014
Сообщений: 78
05.09.2014, 20:21 4
C++
1
2
double a=sqrt(n) ;
std::cout<<((int)a == a ? "целое" : "дробное"<<std::endl;
Вроде так.
0
0 / 0 / 0
Регистрация: 11.03.2014
Сообщений: 36
05.09.2014, 20:26  [ТС] 5
Получается еще больше ошибок((
0
1405 / 647 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
05.09.2014, 20:27 6
Цитата Сообщение от Holmes Посмотреть сообщение
Вроде так.
Не-а
C++
1
2
3
int a = round(sqrt(n));
if(a*a == n) std::cout << "Yes";
else std::cout << "No";
Добавлено через 25 секунд
Цитата Сообщение от Asti7 Посмотреть сообщение
Получается еще больше ошибок((
здесь все коды - это не полный код, а основная часть программы
0
0 / 0 / 0
Регистрация: 11.03.2014
Сообщений: 36
05.09.2014, 20:36  [ТС] 7
Цитата Сообщение от Dani Посмотреть сообщение
здесь все коды - это не полный код, а основная часть программы
А чего здесь не хватает? Вроде библиотека и объявление данных есть
0
1405 / 647 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
05.09.2014, 20:39 8
А, недосмотрел код rikimaru2013. Значит так какая-то проблема
0
0 / 0 / 0
Регистрация: 11.03.2014
Сообщений: 36
05.09.2014, 21:00  [ТС] 9
Цитата Сообщение от Dani Посмотреть сообщение
А, недосмотрел код rikimaru2013. Значит так какая-то проблема
Можете помочь,пожалуйста?)))
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,713
05.09.2014, 22:23 10
Вместо
C++
1
cout << polnuukvadrat(9) << endl;
Я бы написал
C++
1
2
3
4
if(polnuukvadrat(9))
   cout<<"yes\n";
else 
   cout<<"no\n";
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
05.09.2014, 22:39 11
zss, можно и с тернарным, чуть сократить..
C++
1
cout << (polnuukvadrat(9) ? "yes" : "no") << endl;
Цитата Сообщение от Asti7 Посмотреть сообщение
Выводит ошибку в начале
наверное, одна из ошибок - это ругань на отсутствие
C++
1
#include "stdafx.h"
Если, конечно, это студия..
Asti7, а что за ошибка?
0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
05.09.2014, 22:43 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);
    }
2
1405 / 647 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
05.09.2014, 22:59 13
_Ivana, можно пару слов о работе алгоритма?
0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
05.09.2014, 23:06 14
Dani, можно. Наоборот, приятно, что кто-то хочет думать, а не просто во флоаты переводить, math подключать и sqrt писать, формируя в результате огромный ассемблерный код
Для начала почитайте вот здесь Вычисление квадратного корня , ближе к концу. Там теория с некоторыми ссылками. А в данном случае я применил эту теорию (метод Ньютона вычисления квадратного корня) к целому типу, он сходится неприлично быстро, и в конце остается только проверить, точное ли значение корня целого типа получилось в результате или нет.
Да, условие проверки выхода из цикла сделано такое, потому что начальное приближение корня у нас равно самому числу, значит в процессе последовательных приближений оно может только уменьшаться, а если вдруг увеличилось - у нас начались "биения" младшего бита, алгоритм сошелся, но эти биения будут бесконечны.
1
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
05.09.2014, 23:59 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;
}
0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
06.09.2014, 00:43 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.

ЗЫ ждем кто вспомнит другие методы, например, секущих
0
0 / 0 / 0
Регистрация: 11.03.2014
Сообщений: 36
06.09.2014, 16:53  [ТС] 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);
* * }
А можете пожалуйста помочь с полной программой? А то я путаюсь и ошибки получаются))
0
06.09.2014, 16:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.09.2014, 16:53
Помогаю со студенческими работами здесь

Дано натуральное число n>1. Проверьте, является ли оно простым
Дано натуральное число n&gt;1. Проверьте, является ли оно простым. Программа должна вывести слово YES,...

Дано натуральное число. Определить, является ли оно четным, или оканчивается цифрой 3
Дано натуральное число. Определить, является ли оно четным, или оканчивается цифрой 3. c++ и java

Дано натуральное число. Определить, является ли оно четным, или оканчивается цифрой 3
Дано натуральное число. Определить, является ли оно четным, или оканчивается цифрой 3. Выделить...

Дано натуральное число N. Определить, является ли оно палиндромом. Число-палиндром можно читать справа налево и слева направо одинаково. Например,
Дано натуральное число N. Определить, является ли оно палиндромом. Число-палиндром можно читать...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru