目标:我要求准确性我需要显示100位数字或至少50位
尝试1:首先我使用了整数变量,然后它只显示了10位
尝试2:在我的朋友的帮助下,我使用了指针概念,它成功输入了50到100位,但指针变量只显示10位数
我写的程序是
#include <stdio.h>
#include <string.h>
main()
{
int *p;
p=(int*)malloc(100*sizeof(int));
*p=1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890;
printf("%d",*p);
}
在执行上述程序时,我得到了垃圾值
提前致谢
答案 0 :(得分:4)
您需要使用bignum(任意精度大数字)库,因为原生int
或long
具有受C实现限制的精度 - 即硬件(通常为32或64位;另请参阅<stdint.h>
标题和int32_t
&amp; int64_t
类型。我建议使用GMPlib;你需要精通C才能使用这些库。阅读documentation of GMLib。
不要尝试自己编码bignumber算法。你会使用效率低下的算法。用于bignums的高效算法难以理解和发明。你仍然可以获得博士学位。所以使用一些现有的 bignum库。
所以你可能会编写如下代码来将你的bignum乘以137并打印结果
mpz_t bign;
mpz_t bigr;
// initialize bign from a literal string
mpz_init_set_str (bign,
"12345678901234567890123456789012345678901234567890"
"12345678901234567890123456789012345678901234567890",
10);
// initialize bigr
mpz_init(bigr);
/// compute bigr = bign * 137 (137 is a long, not a bignum)
mpz_mul_si(bigr, bign, 137L);
/// print bigr on stdout in base 10
mpz_out_str (stdout, 10, bigr);
/// clear all the numbers
mpz_clear(bign);
mpz_clear(bigr);
在安装了GMP的Linux系统上,您可以使用以下代码编译此类代码(在yoursource.c
中):
gcc -Wall -Wextra -g yoursource.c -lgmp -o yourprog
在其他系统上,您可能需要-I
的{{1}}和-L
个参数。调试程序后,请让编译器使用gcc
请注意,某些语言(Common Lisp,Scheme,Python)内置了bignums。
顺便说一下,您的-O2
功能错误地定义了。它应该定义为main
...
答案 1 :(得分:3)
要回答第一部分,单个signed integer
(假设32位)可以取-2,147,483,648和+2,147,483,647之间的值
这是你的十位数的来源。
根据您的编译器,您可能有unsigned long long
可用(64位),但仍然只提供最大值或0..18,446,744,073,709,551,615
(20位)
处理100位数字需要一些jiggery-pokery!
答案 2 :(得分:2)
您不能将这么长的数字存储在int
变量或指向int
类型的指针中。
如果int
为32位,则范围为[-2147483647,+ 2147483647]。 C data types
要存储大值,可以使用char指针并使用字符串常量初始化它。
例如:
#include <stdio.h>
#include <stdlib.h>
main()
{
char *p = "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890";
printf("%s\n",p);
}
答案 3 :(得分:2)
int * p = malloc(100*sizeof(int));
为100 int
的数组分配内存。
*p= ....
实际上与
相同p[0]=...
所以这个
*p=1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890;
分配给int
。
int
可能不会超过32位(在某些平台上更少)。最大的32位(正)整数是2147483647
。
答案 4 :(得分:2)
C是一种接近硬件的语言。因此,您需要了解其数据类型的存储功能和限制。
PC上的int只能存储32位或64位值,具体取决于您的硬件和操作系统版本。
是的,您可以实现用于处理更大值的例程,并且使用链接的数字列表是一种方法。