用给定的基数和指数计算功率时包装变量

时间:2013-11-26 08:40:58

标签: c

这就是我所做的,但是,变量的一些包装正在发生,因此,z变为0或一些负值,我无法克服这种情况。

void pow(int64_t z,int64_t m)
{
  int64_t pow=1;
  while(m>0)
  {
    while(m>0 && m%2==0)
    {
      m=m-2;
      z=z*z;
    }
    m=m-1;
    pow=pow*z;
  }
  printf("value is %ld",pow);
}

int main()
{
  int64_t x,n;
  printf("Enter base and exponent\n");
  scanf("%ld %ld",&x,&n);
  pow(x,n);
  getch();
  return 0;
}

其中z - >基数 和m - >指数。 我尝试使用int64_t在头文件中提供的long long,但结果是一样的。有人可以帮我解决这个问题。

1 个答案:

答案 0 :(得分:2)

pow()函数几乎是正确的 很好地计划使用平方来实现有效的整数幂函数 即使使用1 9223372036854775807,代码也能快速运行。比简单循环要好得多。

1. OP平方的while()循环应为

// m=m-2;
m = m/2;

2.使用int64_t时,请使用正确的格式说明符。

#include <inttypes.h>
...
// printf("value is %ld",pow);
printf("value is %" PRId64, pow);
...
// scanf("%ld %ld", &x, &n);
scanf("%" SCNd64 "%"  SCNd64, &x, &n);

3.OP应该改进格式

4.避免将pow()命名为标准数学函数

// void pow(int64_t z,int64_t m)
void RK_pow(int64_t z, int64_t m)

5.建议:检查scanf()的结果。

// scanf("%ld %ld", &x, &n);
if (2 == scanf("%" SCNd64 "%"  SCNd64, &x, &n)) GoodToGo();

6.推荐@twalberg想法:让m成为无符号类型或检查否定性。

7.Candidate简化。不需要(m > 0)因为它已经知道在开始时和随后的循环中大于0,m/2修复,它不会是0。

//while (m > 0 && m % 2 == 0)
while (m % 2 == 0)