例如:1589745896214758962147852。
这个问题我已经暂时搁置了一段时间。 有什么可能的方法? 什么是最佳做法?
答案 0 :(得分:7)
答案 1 :(得分:1)
您必须处理一个字符串以保存您的号码。
因为签名的长多分为-9223372036854775808且最大为9223372036854775807。
1589745896214758962147852更长。
答案 2 :(得分:1)
这是一个很好的问题......
您可以使用OpennSsl BIGNUM。
这是一个简单的虚拟示例。
#include <stdio.h>
#include <openssl/bn.h>
int main(int argc, char **argv)
{
BIGNUM *fat;
BN_ULONG a, f;
char *resp;
int i;
fat = BN_new();
for (i = 1; i < argc; i++) {
f = atoll(argv[i]);
BN_dec2bn(&fat, "1");
for (a = 2; a <= f; a++) {
BN_mul_word(fat, a);
}
resp = BN_bn2dec(fat);
printf("Fatorial of %s = %s\n", argv[i], resp);
}
return 0;
}
我刚刚发现了一个更好的例子:
#include <stdio.h>
#include <openssl/bn.h>
int main(int argc, char **argv)
{
BIGNUM *fat;
char *resp = NULL;
fat = BN_new();
BN_generate_prime(fat, 80, 1, NULL, NULL, NULL, NULL);
resp = BN_bn2dec(fat);
printf("Big Random Value: %s\n", resp);
}
)
答案 3 :(得分:0)
你的问题定义不明确(在撰写本文时)。
如果您只需要25位数字,那么您可以简单地迭代25次,获得0到9之间的随机数,并将它们编译成一串数字字符。
如果它必须是25位数字(即10 25 &lt; = r&lt; = 10 26 -1)而不是25个随机数字,那么第一个数字必须&gt; = 1(没有前导零)。
如果你需要这些数字来表示一个整数值,你可以在其上执行算术运算,而不是一串数字,那么你将在任何可能的平台上运行C的内置数据类型。将需要至少85位(10 25 / log(2))。
您可以通过将从标准随机数生成器返回的位连接到字节数组来构建85位表示。如果使用标准C库rand()函数,请检查实现的RAND_MAX值;一些实现只生成16位,因此需要注意连接它们,因为它可能不是随机位的整个字。但是,要算术操作这样的数字,你必须创建算术函数来做(或使用“bignum”库)。