超大型整數相加怎麽整?
這怎末搞啊?用字符串 模拟手工加减法 都科学研究了,还要把底层函数全写一遍吗?当然不用
所以,使用 mpfr
一个例子
计算 10^1000000
#include <stdio.h>
#include <mpfr.h>
int main(void) {
mpfr_t a, b, c;
mpfr_inits2(10000000, a, b, c, NULL);
mpfr_set_str(a, "10", 10, MPFR_RNDD);
mpfr_set_str(b, "1000000", 10, MPFR_RNDD);
mpfr_pow(c, a, b, MPFR_RNDD);
mpfr_printf("%.0Rf\n", c);
mpfr_clears(a, b, c, NULL);
mpfr_free_cache();
return 0;
}
参考: https://fishc.com.cn/forum.php?mod=redirect&goto=findpost&ptid=204663&pid=5618893 wp231957 发表于 2021-12-8 11:21
用字符串 模拟手工加减法
可以演示一下嗎,我也知道用字符串,但是那個輸入形式給我整不會了
本帖最后由 jackz007 于 2021-12-8 13:18 编辑
#include <stdio.h>
char * foo1(char s[])
{
char i , j , m ;
for(m = 0 ; s ; m ++) s -= '0' ;
for(i = 0 ; i < m ; i ++) s = s ;
s = m ;
return s ;
}
char * foo2(char s[])
{
char i , j , m ;
for(m = s , i = 0 ; i < m ; i ++) s = s + '0' ;
s = '\0' ;
return s ;
}
void add(char c[] , char a[] , char b[])
{
char e , i , j , k , t ;
for(k = e = 0 , i = a , j = b ; i > 0 && j > 0 ; i -- , j --, k ++) {
c = (a + b + e) % 10 ;
e = (a + b + e > 9) ? 1 : 0 ;
}
if(i) {
for(; i > 0 ; i -- , k ++) {
c = (a + e) % 10 ;
e = (a + e > 9) ? 1 : 0 ;
}
} else if(j) {
for(; j > 0 ; j -- , k ++) {
c = (b + e) % 10 ;
e = (b + e > 9) ? 1 : 0 ;
}
}
if(e) {
c[++ k] = 1 ;
e = 0 ;
}
for(i = 0 ; i < k / 2 ; i ++) {
t = c ;
c = c ;
c = t ;
}
c = k ;
}
main(void)
{
char a , s ;
int d , f , i , k ;
scanf("%s" , s) ;
for(f = 1 , i = k = 0 ; s && k < 2 ; k ++) {
for(; s && (s < '0' || s > '9') ; i ++) ;
for(d = 0 ; s >= '0' && s <= '9'; d ++) a = s ;
a = '\0' ;
i += d ;
if(d > 30) {
fprintf(stderr , "变量 %d 长度超限。\n" , k + 1) ;
f = 0 ;
break ;
}
}
if(f) {
add(a , foo1(a) , foo1(a)) ;
printf("总和 : %s\n" , foo2(a)) ;
}
}
编译、运行实况:
D:\0002.Exercise\C>g++ -o x x.c
D:\0002.Exercise\C>x
99999999999999999999999999999,1
总和 : 100000000000000000000000000000
D:\0002.Exercise\C>
jackz007 发表于 2021-12-8 12:31
编译、运行实况:
這是什麽意思,我想知道按照題目的輸入形式,如何編寫這個程序; yysyyds 发表于 2021-12-8 12:38
這是什麽意思,我想知道按照題目的輸入形式,如何編寫這個程序;
你要的输入形式来了,尽在 5 楼。
页:
[1]