这就是我所做的,但是,变量的一些包装正在发生,因此,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,但结果是一样的。有人可以帮我解决这个问题。
答案 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)