Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 给定基和指数计算幂时变量的包装_C - Fatal编程技术网

C 给定基和指数计算幂时变量的包装

C 给定基和指数计算幂时变量的包装,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); }

这就是我所做的,但是,一些变量的包装正在发生,因此,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()函数几乎正确。
高效整数幂函数的平方运算的良好计划使用。
即使使用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);
5.建议:检查
scanf()
的结果

6.推荐@twalberg创意:使
m
成为无符号类型或检查消极性

7.候选人简化。不需要
(m>0)
,因为在第一次循环和后续循环中它已经大于0,使用
m/2
修复,它将不会为0

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

当值溢出时,您希望发生什么行为?如果输入较大,溢出是不可避免的。嗯..溢出是无法避免的,但对于溢出范围内的值..它应该显示正确吗?…假设我给出的值为2 10,其中基数为2,指数为10,那么它返回的值为1!!哦,我想我误解了你的问题。我想你是在问为什么代码不起作用。对吗?如果是的话,你能描述一下你运行了哪些测试用例,你做了什么来调试代码,等等?是的。我想我有点做错了…高达2到8次方。当函数中的z保持在65536范围内时,值会很好…但对于其余部分,如2 9或2 10。返回1@RakeshKumar您还应该验证顶部的
m
是否为非负,或者为其切换到无符号类型…@chux我无法为int64\t数据类型包含它。我之前包括了,但您建议的scanf/printf格式不起作用。但无论如何,感谢您指出逻辑错误:)@Rakesh_Kumar Alternative:
printf(“值为%lld”,(long-long)pow)
。对于
scanf()
,它更复杂。建议创建自己的
#ifdef SCNd64#define RK_SCNd64 SCNd64#else#define RK_SCNd64“lld”#endif
,或类似的东西。
// scanf("%ld %ld", &x, &n);
if (2 == scanf("%" SCNd64 "%"  SCNd64, &x, &n)) GoodToGo();
//while (m > 0 && m % 2 == 0)
while (m % 2 == 0)