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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
adilet
0 / 0 / 0
Регистрация: 18.06.2011
Сообщений: 16
20.09.2011, 23:21     как проверить цифру, на то что она является степенью тройки #1
как проверить цифру, на то что она является степенью тройки? помогите плиз
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.09.2011, 23:21     как проверить цифру, на то что она является степенью тройки
Посмотрите здесь:

C++ В целочисленном массиве найти и напечатать те элементы, которые являются степенью 2. Написать функцию, проверяющую, является ли число степенью 2.
C++ Проверить, является ли вводимое число степенью числа 3
C++ Как подправить программу, что бы она проверяла является ли строчка полиндромом без пробелов
C++ проверить моно ли в шестеричную запись числа вставить цифр 2 так,что она стала совершенной
Дано натуральное число n. Определите, является ли оно степенью числа 2, и если является, то выведите значение этой степени C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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;
}
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
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
будет лучше
BoBaH26
30 / 30 / 0
Регистрация: 02.12.2010
Сообщений: 255
20.09.2011, 23:50     как проверить цифру, на то что она является степенью тройки #4
alex_x_x, конечно, написано умно, я даже кое-чего не понимаю. Но по-моему мой вариант проще, следовательно, эффективнее?

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

Добавлено через 6 минут
alex_x_x, согласен с Вами, начинать надо с 1, да я еще знаю С++ не на высоком уровне, поэтому в голову пришло сразу это. А Вы, я так понял, делаете через функцию, что тоже не есть хорошо)
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
21.09.2011, 00:07     как проверить цифру, на то что она является степенью тройки #7
ну, даже самые оптимизированные библиотечные функции математической библиотеки - все-таки функции)
структура все же
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 <А вот тут цикл>.
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
21.09.2011, 00:58     как проверить цифру, на то что она является степенью тройки #9
BoBaH26, функция обеспечивает универсальность. Вариант alex способен проверять не только степень тройки именно благодаря тому, что он выполнен в виде функции. Кстати, в C/C++ вызов функции обходится достаточно дёшево, так что не смертельно. Вы слышали про рекурсивные алгоритмы?

К тому же всегда можно "посоветовать" компилятору сделать функцию встраиваемой, добавив inline перед её заголовком.
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;
}
как вариант
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. Можно сохранить функцию и пользоватся ей при необходимости, просто подключая ее.
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 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 способов.
А где у вас проверка собственно на степень?
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 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;
}
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
21.09.2011, 12:56     как проверить цифру, на то что она является степенью тройки #14
fasked, для эстетического созерцания алгоритм хорош Но для практики не уверен. А случай n=3 у Вас верный? А то кажется, что он особняком стоит
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
21.09.2011, 12:57     как проверить цифру, на то что она является степенью тройки #15
Цитата Сообщение от Thinker Посмотреть сообщение
А случай n=3 у Вас верный? А то кажется, что он особняком стоит
Да, надо добавить к случаю с единицей.
Цитата Сообщение от Thinker Посмотреть сообщение
для эстетического созерцания алгоритм хорош Но не для практики.
Благодарю
BoBaH26
30 / 30 / 0
Регистрация: 02.12.2010
Сообщений: 255
21.09.2011, 16:45     как проверить цифру, на то что она является степенью тройки #16
Thinker, по условию не требуется выводить саму степень, следовательно, незачем усложнять программу. Но если уж очень хочется, то можно сделать условие, как предложил Paporotnik. Т.е. инкреметировать счетчик, пока число, деленное в каждой итерации на 3 не станет равным 1.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.09.2011, 17:50     как проверить цифру, на то что она является степенью тройки
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
21.09.2011, 17:50     как проверить цифру, на то что она является степенью тройки #17
Цитата Сообщение от BoBaH26 Посмотреть сообщение
Thinker, по условию не требуется выводить саму степень
Покажите тот момент, где я вывожу степень
Yandex
Объявления
21.09.2011, 17:50     как проверить цифру, на то что она является степенью тройки
Ответ Создать тему
Опции темы

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