这就是我所做的,但是,发生了一些变量包装,因此,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/