检查数字是2的幂,如果输入是数字

时间:2017-04-05 00:17:54

标签: c arrays

我想检查数组中的数字是否为2的幂。

我编写了以下代码,但它没有工作,它会跳过检查数字是否为2的幂并打印最后一句的部分。

另外,如果有人可以帮我检查输入是否是数字而不是任何其他字符。 谢谢! 更新两件事的力量是有效但我仍然没有弄清楚如何检查输入是否是一个数字,而不是任何其他的字符

   #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]==1&&a!=1){
             printf("The number %d is a power of 2:%d=2^%d\n",a,a,count);
             sum+=count;
        }
    }
    printf("Total exponent num is %d\n",sum);
  return 0;
}

2 个答案:

答案 0 :(得分:3)

您对2的权力的检查是错误的:您将2完全分解为1,但以下if错误地检查了numbers[k]==0

检查应该是numbers[k]==1,因为当您从2的幂中除去所有两个时,最终得到2 0 ,即1

注意:您可以使用this Q&A中描述的位技巧检查数字是否为2的幂而没有循环。

答案 1 :(得分:1)

你的例子中有很多事情是这个问题的偶然事件。例如,分配数组和读取用户输入只是分散注意力而无法找到解决方案。首先集中精力调试算法:

#include <stdbool.h>

bool is_power_of_two(int n)
{
        while (n % 2 == 0 && n > 1){ /* While x is even and > 1 */
             n/= 2;
        }
        return n == 0;
}

int main()
{
    return !is_power_of_two(2);
}

现在,您可以优化该功能,直到它给出正确的结果。简单的解决方法是将n == 0替换为n == 1。现在,您可以添加更多测试,在添加每个测试时运行该程序:

int main()
{
    return  is_power_of_two(0)
        +  !is_power_of_two(1)
        +  !is_power_of_two(2)
        +   is_power_of_two(3)
        +  !is_power_of_two(4)
        /* negative numbers can never be an exact power of a positive */
        +   is_power_of_two(-1)
        +   is_power_of_two(-2)
        +   is_power_of_two(-3);
}

一旦你对你的功能有了一些信心,你就可以在你的程序中使用它来处理数组。

当您介绍一个读取输入的函数时,您需要在x的参数中使用之前检查malloc()是否为否定。更好的方法是使用无符号类型确保它不是负数:

unsigned int x;
printf("Enter size of input:\n");
if (scanf("%u", &x) != 1) {
    fprintf(stderr, "That's not a valid size!\n");
    return EXIT_FAILURE;
}
int *numbers = malloc(x * sizeof *numbers);
if (!numbers) {
    fprintf(stderr, "Couldn't allocate memory for %u numbers!\n", x);
    return EXIT_FAILURE;
}