C программа для отображения числа, если оно является степенью 2 в массиве - PullRequest
0 голосов
/ 12 ноября 2018
#include <stdio.h>
#include <math.h>

int main(){
    int num,i;
    scanf("%d",&num);

    int a[num];
    for (i=0; i<num; i++){
       scanf("%d",&a[i]);
    }

    for (i=0; i<num+1; i++){
        if (pow(2,i) == a[i]){
            printf("%d\n",a[i]);
        }
    }
}

Я пытаюсь создать программу, которая отображает целое число в массиве, если оно является степенью двойки.ех;массив содержит целое число (1,2,4,9), он будет печатать только 1,2 и 4.

Что не так с этим кодом?Он работает в некоторых тестовых случаях, но в большинстве - нет.

Ответы [ 4 ]

0 голосов
/ 12 ноября 2018

Другие методы, предложенные для проверки, является ли число степенью двойки, делают предположения о представлении чисел.Этого следует избегать.Всегда пишите для ясности и мобильности.

bool is_power_of_2 (int n)
{
    if (n < 1) {
        return false;
    }

    while (n % 2 == 0) {
        n = n / 2;
    }

    return (n == 1);
}
0 голосов
/ 12 ноября 2018

Чтобы проверить, является ли число степенью n с рекурсивной функцией:

function isPowOfn(int n, int number) {
    return (number == 1 ? TRUE : (number % n != 0 ? FALSE : isPowOfn(n, number / n)));
}

или (в соответствии с предложением WhozCraig)

function isPowOfn(int n, int number) {
    return value == 1 || (value % n == 0 && isPowOfn(n, number / n))
}

Примеры ввода-вывода:

in: 2, 6  
processing: 3  
out: FALSE  

in: 2, 16  
processing: 8 - 4 - 2 - 1  
out: TRUE  

in: 2, 162  
processing: 81
out: FALSE

in: 3, 81
processing: 27 - 9 - 3 - 1
out: TRUE

in: 5, 244140625
processing: 48828125 - 9765625 - 1953125 - 390625 - 78125 - 15625 - 3125 - 625 - 125 - 25 - 5 - 1
out: TRUE

in: 4, 67957741992
processing: 16989435498
out: FALSE
0 голосов
/ 12 ноября 2018
/* Function to check if x is power of 2*/
bool isPowerOfTwo (int x) 
{ 
  /* First x in the below expression is for the case when x is 0 */
  return x && (!(x&(x-1))); 
} 

Пояснение : для степени 2 установлен только 1 бит. Если мы вычтем 1 из степени 2, то все неустановленные биты после единственного установленного бита станут установленными; и установленный бит становится неустановленным.

Если x - это степень 2, x&(x-1) будет равно 0. (!(x&(x-1))) будет равно 1. И возвращаемое выражение будет равно 1.
Логическое И (&&) этого выражения с x должно гарантировать, что это не будет истинно, если x равно 0.

0 голосов
/ 12 ноября 2018

Если value является степенью двойки, устанавливается только один бит:

#include <stdbool.h>
#include <limits.h>

bool is_pow_of_2(unsigned value)
{
    int count = 0;
    for (unsigned shift = 0; shift < sizeof(value) * CHAR_BIT; ++shift) {
        if (value & 1 << shift)  // test if bit shift is set
            ++count;
        if (count > 1)      // if there a more than one bits set in value
            return false;  //  it cannot be a power of 2
    }

    return true;
}

План Б:

bool is_pow_of_2(signed value)
{
    if(value <= 0)
        return false;

    // ...
...