c - 当计算能力给定底数和指数时变量的包装

标签 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 ,但结果是相同的。有人可以帮助我解决这个问题吗?

最佳答案

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.候选简化。不需要 (m > 0) ,因为它一开始就已知大于 0,并且在后续循环中,通过 m/2 修复,它不会为 0。

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

关于c - 当计算能力给定底数和指数时变量的包装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20212049/

相关文章:

c - 当小数部分为0时,如何提取C中double的整数和小数部分?

c - 如何使用 GTK Notebook 向浏览器添加选项卡?

c - KdTree C 实现导致核心转储

c++ - 继续没有 msvcrt.dll

c - 服务器程序卡在 read() 函数上,但 write() 函数在客户端程序中运行良好

c - fscanf 不读取文件

c - PowerPC 从内存中的已知地址加载方法地址并调用该方法

c - 从头打印链表

c# - C# 中 C 的 unsigned long 相当于什么

c - 在 C 语言中,验证参数和处理错误的一些最常用选项是什么?