在疯狂的在线搜索3-4天后发布此问题,但没有任何帮助。老实说,在这一点上,我认为我甚至不知道该搜索什么。我真的需要一些"指针"关于如何处理指针和数组,这件事正在扼杀我。
我只是尝试使用二进制求幂方法计算整数求幂。这是我的计算代码2 ^ n的代码 -
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <gmp.h>
// Compute z = x^n
void mpz_binexp_pow(mpz_t z, const mpz_t x, const mpz_t n) {
/*
* Local variables
*/
char *pointer = NULL;
char *pc = NULL;
char *c = NULL;
pointer = (char*) malloc(sizeof(mpz_t));
pc = pointer;
/*
* Get the binary representation of the exponent
*/
c = mpz_get_str(pointer,2,n);
c[strlen(c)+1] = '\0';
printf("%s\n\n",c);
/*
* Perform left to right binary exponentiation steps
*/
/*for(int i = 0;i<strlen(c);i++) {
mpz_pow_ui(z, z, 2);
if (c[i] == '1')
mpz_mul(z, z, x);
printf("%c - \n", c[i]);
//gmp_printf("%Zd\n", z);
}*/
while(*c){
mpz_pow_ui(z, z, 2);
if (*c == '1')
mpz_mul(z, z, x);
c++;
printf("%c - \n", *c);
//gmp_printf("%Zd\n", z);
}
free(pc);
}
int main(int argc, char *argv[]) {
mpz_t z; mpz_init(z); mpz_set_ui(z,1);
mpz_t x; mpz_init(x); mpz_set_ui(x,2);
mpz_t n; mpz_init(n); mpz_set_ui(n,1449728);
mpz_binexp_pow(z,x,n);
return 0;
}
对于像2,3等小型指数来说,一切都很好。但对于像显示的那样的相对较大的数字,事情真的变得疯狂了(我需要这个以比我在这里展示的更大的指数工作)
现在,当我多次运行此代码时,我得到的正确输出只有15次执行中的1次,我认为这并不重要。我无法弄清楚出了什么问题。我得到了正确的二元代表。通过打印我可以看到的指数。例如,二进制代表。指数1449728的数字是101100001111100000000。现在,当我进入循环执行l2r步骤时,几乎每次程序在最后一个零序列中的第三个零之后被搞乱,即它正确执行直到1011000011111000 这一点。有时我会看到其他一些字符,如&#39;?&#39;和&#39;&gt;&#39;而不是其余的零,有时我只是没有看到任何东西,程序卡住了。发生了什么事?
我非常肯定这是一个指针问题而且我的指针知识非常弱但我真的很想知道如何解决这个问题以及背后发生的事情以及我做错了什么。
修改 这个问题已经解决了。我希望关闭或删除这个问题。