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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
adilet
0 / 0 / 0
Регистрация: 18.06.2011
Сообщений: 16
#1

как проверить цифру, на то что она является степенью тройки - C++

20.09.2011, 23:21. Просмотров 1301. Ответов 16
Метки нет (Все метки)

как проверить цифру, на то что она является степенью тройки? помогите плиз
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.09.2011, 23:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос как проверить цифру, на то что она является степенью тройки (C++):

Как на стадии компиляции проверить что число является степенью двойки - C++
Очень простой вопрос - как на стадии компиляции проверить что число является степенью двойки? Как проверить на стадии исполнения знаю, но...

Определить, является ли введённое натуральное число целой степенью тройки - C++
Определить, является ли введённое натуральное число целой степенью числа 3

Определить, является ли введенное число степенью тройки, если да - то какой - C++
#include <stdio.h> #include <conio.h> #include <vcl.h> #pragma hdrstop ...

Проверить, является ли число степенью 3 - C++
Данное целое число N ( > 0). Если оно есть степенно числа 3 , то вывести TRUE, если не является - вывести FALSE . С++

Проверить, является ли число степенью двойки - C++
Бьюсь с самого утра все никак. Условия Дано натуральное число N. Выведите слово YES, если число N является точной степенью двойки, или...

Проверить, является ли вводимое число степенью числа 3 - C++
Помогите, в 22 строке выводит ошибку: "Требуется while". Программа должна проверять вводимое число является ли оно степень числа 3 ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BoBaH26
30 / 30 / 0
Регистрация: 02.12.2010
Сообщений: 255
20.09.2011, 23:36 #2
Вот, пожалуйста:
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
// Pr.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include "conio.h"
#include "iostream"
using namespace std;
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    int s=3,n;
    cout<<"Vvedite chislo:\n";
    cin>>n;
    for (int i=1;i<=200;i++)
    {
        if (s==n) 
        {
            cout<<"\n"<<n<<" yavlyaetsa stepenyu 3";
            break;
        }
        s=s*3;
    }
    if (s!=n) cout<<"\n"<<n<<" ne yavlyaetsa stepenyu 3";
    _getch();
    return 0;
}
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
20.09.2011, 23:50 #3
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
#include <stdio.h>
 
int is_power_of(unsigned val, unsigned pow)
{
   int rem;
   
   if (1 == val) 
   {
      return val;
   }
 
   do
   {
      rem = val % pow;
      val /= pow;
   } while (!rem && val != pow);
 
   return (rem == 0);
}
 
int main()
{
   printf("81 pow of 3? %s\n", is_power_of (81,3) ? "true" : "false");
   printf("27 pow of 3? %s\n", is_power_of (27,3) ? "true" : "false");
   printf("34 pow of 3? %s\n", is_power_of (34,3) ? "true" : "false");
   printf("4 pow of 3? %s\n", is_power_of (4,3) ? "true" : "false");
   printf("3 pow of 3? %s\n", is_power_of (3,3) ? "true" : "false");
   printf("1 pow of 3? %s\n", is_power_of (1,3) ? "true" : "false");
   printf("2 pow of 3? %s\n", is_power_of (2,3) ? "true" : "false");
   return 0;
}
Добавлено через 2 минуты
BoBaH26,
Цитата Сообщение от BoBaH26 Посмотреть сообщение
for (s=3 ; s<=n
будет лучше
2
BoBaH26
30 / 30 / 0
Регистрация: 02.12.2010
Сообщений: 255
20.09.2011, 23:50 #4
alex_x_x, конечно, написано умно, я даже кое-чего не понимаю. Но по-моему мой вариант проще, следовательно, эффективнее?

Добавлено через 25 секунд
А, вот тут, да. Согласен.
1
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
20.09.2011, 23:52 #5
BoBaH26, наверно, тут просто какая мысль первая в голову придет
вообще да, ваше логичнее и эффективнее, так как операция умножения в принципе дешевле деления
но кстати стоит начинать с s=1, единица тоже степень 3ки
0
BoBaH26
30 / 30 / 0
Регистрация: 02.12.2010
Сообщений: 255
20.09.2011, 23:59 #6
Поправочка: s<n не совсем то, т.к. до нашего числа он даже не дойдет))

Добавлено через 6 минут
alex_x_x, согласен с Вами, начинать надо с 1, да я еще знаю С++ не на высоком уровне, поэтому в голову пришло сразу это. А Вы, я так понял, делаете через функцию, что тоже не есть хорошо)
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
21.09.2011, 00:07 #7
ну, даже самые оптимизированные библиотечные функции математической библиотеки - все-таки функции)
структура все же
0
BoBaH26
30 / 30 / 0
Регистрация: 02.12.2010
Сообщений: 255
21.09.2011, 00:17 #8
Но, получается, у Вас тоже есть эти элементарные функции, так при этом, Вы еще "нагружаете" программу пользовательской функцией "is_power_of".
А для 1 в моем варианте лучше будет сделать условие, которое будет стоять перед циклом:
if (n==1) cout<<"\n"<<n<<" yavlyaetsa stepenyu 3"; else <А вот тут цикл>.
0
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
21.09.2011, 00:58 #9
BoBaH26, функция обеспечивает универсальность. Вариант alex способен проверять не только степень тройки именно благодаря тому, что он выполнен в виде функции. Кстати, в C/C++ вызов функции обходится достаточно дёшево, так что не смертельно. Вы слышали про рекурсивные алгоритмы?

К тому же всегда можно "посоветовать" компилятору сделать функцию встраиваемой, добавив inline перед её заголовком.
0
Paporotnik
383 / 227 / 7
Регистрация: 06.07.2011
Сообщений: 512
21.09.2011, 01:05 #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include<iostream>
int main()
{
    int m;
    std::cin>>m;
    if (m<=0) std::cout<<"not ok"<<std::endl;
    while (!(m%3))    
       m=m/3;
    if (m==1) std::cout<<"ok"<<std::endl;
    else std::cout<<"not ok"<<std::endl;
    std::cin>>m;
}
как вариант
0
BoBaH26
30 / 30 / 0
Регистрация: 02.12.2010
Сообщений: 255
21.09.2011, 11:09 #11
talis, с рекурсивными алгоритмами знаком, но фактически делал только на Паскале. На С++ еще не доводилось, надо будет заняться..
Paporotnik, способ хороший, но опять же, можно нулевую степень вынести в отдельный условный алгоритм, а в else записать сам цикл
C++
1
while (!(m%3))
Причем не заставлять программу постоянно делить число m на 3, а сразу, если при исходном числе условие выполняется, выдать блок:
C++
1
2
{cout<<"ok";
 break;} // Чтобы не зацикливаться.
Тогда Ваш вариант будет, наверно, лучшим.

Добавлено через 13 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Pr.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include "conio.h"
#include "iostream"
using namespace std;
 
 
int _tmain(int argc, _TCHAR* argv[])
{
        int m,a;
        cout<<"Vvedite osnovanie: \n"; //Чтобы сделать универсальную программу,
        cin>>a;                        //если надо не 3, а например, 7, то вводим 7.
    cout<<"Vvedite chislo:\n";
        cin>>m;
    if (m==1) cout<<"ok"<<endl; else
             if ((m<=0)||(m%a)) cout<<"not ok"<<endl; else
         cout<<"ok"<<endl;
    _getch();
    return 0;
}
Согласитесь, самый рациональный вариант из всех предложенных, причем идеи взяты из всех 3 способов.

Добавлено через 14 минут
Кстати, можно сделать данный вариант в виде функции, например, kratnost (int x, int y), где x - основание, а y - само число, т.е. проверяем, является ли y степенью x. Можно сохранить функцию и пользоватся ей при необходимости, просто подключая ее.
0
Thinker
Эксперт C++
4226 / 2200 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
21.09.2011, 12:00 #12
Зачем деления в алгоритмах?! Вот:

C++
1
2
3
4
5
6
7
8
9
int Is_deg(unsigned long a)
{
   unsigned long b = 1;
   if (a == 0)
      return 0;
   while (b < a)
      b *= 3;
   return a == b;
}
Цитата Сообщение от adilet Посмотреть сообщение
как проверить цифру, на то что она является степенью тройки? помогите плиз
Правильнее сказать проверить число.

Цитата Сообщение от BoBaH26 Посмотреть сообщение
Вы еще "нагружаете" программу пользовательской функцией "is_power_of".
Но, согласитесь, ваш цикл
C++
1
for (int i=1;i<=200;i++)
не блещет универсальностью. Число 200 с потолка взято. Хорошо зато, что делений нет в вашем алгоритме.


Цитата Сообщение от BoBaH26 Посмотреть сообщение
Согласитесь, самый рациональный вариант из всех предложенных, причем идеи взяты из всех 3 способов.
А где у вас проверка собственно на степень?
0
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
21.09.2011, 12:47 #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
#include <stdio.h>
 
int is_power_of(int n) {
    int s = 0;
 
    if (n == 1)
        return 1;
 
    for ( ; n; n /= 10)
        s += n % 10;
    
    return s == 9 ? 1 : s > 9 ? is_power_of(s) : 0;
}
 
int main()
{
   printf("81 pow of 3? %s\n", is_power_of (81) ? "true" : "false");
   printf("27 pow of 3? %s\n", is_power_of (27) ? "true" : "false");
   printf("34 pow of 3? %s\n", is_power_of (34) ? "true" : "false");
   printf("4 pow of 3? %s\n", is_power_of (4) ? "true" : "false");
   printf("3 pow of 3? %s\n", is_power_of (3) ? "true" : "false");
   printf("1 pow of 3? %s\n", is_power_of (1) ? "true" : "false");
   printf("2 pow of 3? %s\n", is_power_of (2) ? "true" : "false");
   return 0;
}
0
Thinker
Эксперт C++
4226 / 2200 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
21.09.2011, 12:56 #14
fasked, для эстетического созерцания алгоритм хорош Но для практики не уверен. А случай n=3 у Вас верный? А то кажется, что он особняком стоит
1
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
21.09.2011, 12:57 #15
Цитата Сообщение от Thinker Посмотреть сообщение
А случай n=3 у Вас верный? А то кажется, что он особняком стоит
Да, надо добавить к случаю с единицей.
Цитата Сообщение от Thinker Посмотреть сообщение
для эстетического созерцания алгоритм хорош Но не для практики.
Благодарю
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.09.2011, 12:57
Привет! Вот еще темы с ответами:

Дано целое число N (> 0). Проверить,является ли оно степенью числа 3. С++ - C++
Дано целое число N (&gt; 0). Если оно является степенью числа 3, то вывести true, если не является — вывести false.

Как подправить программу, что бы она проверяла является ли строчка полиндромом без пробелов - C++
Где есть ошибка в программе. И как подправить программу, что бы она проверяла является ли строчка полиндромом без пробелов. 1.#include...

Считать из файла строку и проверить является она палидромом - C++
Нужно считать из файла строку и проверить является она палидромом или нет?в си++

Для заданной строчки проверить, является ли она числом - C++
Для заданной строчки проверить, является ли она числом. Если нет,то посчитать сумму всех чисел, которые встречаются в данной строчке: ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.09.2011, 12:57
Ответ Создать тему
Опции темы

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