Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/40: Рейтинг темы: голосов - 40, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 18.06.2011
Сообщений: 16

Проверить, является ли число степенью тройки

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

Студворк — интернет-сервис помощи студентам
как проверить цифру, на то что она является степенью тройки? помогите плиз
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.09.2011, 23:21
Ответы с готовыми решениями:

Проверить, является ли число степенью тройки
Написать программу, которая предлагает ввести положительное целое число N. Если оно степенью числа 3, то вывести True, если не является -...

Определить является ли число степенью тройки
Помогите , напишете код программы ( Определить является ли число степенью тройки )

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

16
30 / 30 / 5
Регистрация: 02.12.2010
Сообщений: 255
20.09.2011, 23:36
Вот, пожалуйста:
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
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
20.09.2011, 23:50
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
30 / 30 / 5
Регистрация: 02.12.2010
Сообщений: 255
20.09.2011, 23:50
alex_x_x, конечно, написано умно, я даже кое-чего не понимаю. Но по-моему мой вариант проще, следовательно, эффективнее?

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

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

К тому же всегда можно "посоветовать" компилятору сделать функцию встраиваемой, добавив inline перед её заголовком.
0
385 / 229 / 12
Регистрация: 06.07.2011
Сообщений: 512
21.09.2011, 01:05
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
30 / 30 / 5
Регистрация: 02.12.2010
Сообщений: 255
21.09.2011, 11:09
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
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
21.09.2011, 12:00
Зачем деления в алгоритмах?! Вот:

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
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
21.09.2011, 12:47
хех
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
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
21.09.2011, 12:56
fasked, для эстетического созерцания алгоритм хорош Но для практики не уверен. А случай n=3 у Вас верный? А то кажется, что он особняком стоит
1
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
21.09.2011, 12:57
Цитата Сообщение от Thinker Посмотреть сообщение
А случай n=3 у Вас верный? А то кажется, что он особняком стоит
Да, надо добавить к случаю с единицей.
Цитата Сообщение от Thinker Посмотреть сообщение
для эстетического созерцания алгоритм хорош Но не для практики.
Благодарю
0
30 / 30 / 5
Регистрация: 02.12.2010
Сообщений: 255
21.09.2011, 16:45
Thinker, по условию не требуется выводить саму степень, следовательно, незачем усложнять программу. Но если уж очень хочется, то можно сделать условие, как предложил Paporotnik. Т.е. инкреметировать счетчик, пока число, деленное в каждой итерации на 3 не станет равным 1.
0
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
21.09.2011, 17:50
Цитата Сообщение от BoBaH26 Посмотреть сообщение
Thinker, по условию не требуется выводить саму степень
Покажите тот момент, где я вывожу степень
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.09.2011, 17:50
Помогаю со студенческими работами здесь

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

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

Проверить, является ли число степенью двойки
Если число степень 2, то ДА, иначе НЕТ. #include &lt;fstream&gt; #include &lt;cstring&gt; #include &lt;iostream&gt; using namespace std; int main()...

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

Проверить, является ли число точной степенью двойки
Дано натуральное число N. Выведите слово YES, если число N является точной степенью двойки, или слово NO в противном случае. Операцией...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru