Проверьте, является ли число степенью двойки и является ли вход числом
я хочу проверить, являются ли числа в массиве степенью 2,
я написал следующий код, но он не работает, он пропускает ту часть, которая чикает, если число равно степени двух, и печатает последнее предложение.
кроме того, если кто-то может помочь мне в том, как проверить, является ли вход номером, а не каким-либо другим charctar.
Спасибо!
Что я уже пробовал:
#include <stdio.h> #include <stdlib.h> int main() { int x; int i; int k; int count=0; int a; int sum=0; printf("Enter size of input:\n"); scanf("%d",&x); int *numbers=malloc(sizeof(int)*x); if (x<0){ printf("Invalid size\n"); } else { printf("Enter numbers:\n"); for(i=0;i<x;++i){ scanf("%d",&numbers[i]); } } for(k=0;k<x;++k) { count=0; a=numbers[k]; while (((numbers[k] % 2) == 0) && numbers[k] > 1){ /* While x is even and > 1 */ numbers[k]/= 2; ++count; } if (numbers[k]==0){ printf("The number %d is a power of 2:%d=2^%d\n",a,a,count); sum+=a; } } printf("Total exponent num is %d\n",sum); return 0; }
PIEBALDconsult
Пятно отладки должно сделать свое дело. Я особенно думаю, что вы должны изучить числа[k] после цикла while и перед тестированием на ноль.
Member 13106348
я попробовал отладку, но ничего не вышло :\ я до сих пор не знаю проблемы .. я изменил if statmnet на if (numbers[k]==0), и теперь он работает только для ввода одного числа.
PIEBALDconsult
А что было раньше?
С каким набором чисел вы тестировали? Какой результат вы получили?
[no name]
Да, я понимаю, что ты имеешь в виду. Вы запустили программу и думали, что отлаживаете ее, но не потрудились использовать точки останова, чтобы пройти через ваш код и изучить переменные. Итак, нет, вы не отлаживали свою программу, чтобы увидеть, что она делает.
[no name]
Изучение того, как использовать отладчик, - это действительно полезный навык, которому вы должны научиться.
Member 13106348
могу ли я выучить его за полдня ?
PIEBALDconsult
Нет. Но вы можете начать.
nv3
Сначала, конечно, отладьте свой код. Как только вы это сделаете, обратите внимание, что существует гораздо более эффективный метод проверки того, является ли число степенью 2:
int x;
если (x & (x-1) == 0)
// да, это сила двух
Я оставляю это на ваше усмотрение, чтобы доказать, почему и как этот маленький трюк работает.
PIEBALDconsult
Но скажет ли он вам экспоненту?
nv3
Нет, это не так. Просто независимо от того, является ли число степенью двойки или нет. Показатель степени также может быть определен в куске линейного кода с помощью 12-битной таблицы поиска и трех rsp. шесть сдвигов.