yysyyds 发表于 2021-12-8 11:03:46

超大型整數相加怎麽整?

這怎末搞啊?

wp231957 发表于 2021-12-8 11:21:03

用字符串 模拟手工加减法

人造人 发表于 2021-12-8 11:22:42

都科学研究了,还要把底层函数全写一遍吗?当然不用
所以,使用 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

yysyyds 发表于 2021-12-8 12:04:36

wp231957 发表于 2021-12-8 11:21
用字符串 模拟手工加减法

可以演示一下嗎,我也知道用字符串,但是那個輸入形式給我整不會了

jackz007 发表于 2021-12-8 12:31: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>

yysyyds 发表于 2021-12-8 12:38:45

jackz007 发表于 2021-12-8 12:31
编译、运行实况:

這是什麽意思,我想知道按照題目的輸入形式,如何編寫這個程序;

jackz007 发表于 2021-12-8 12:55:03

yysyyds 发表于 2021-12-8 12:38
這是什麽意思,我想知道按照題目的輸入形式,如何編寫這個程序;

      你要的输入形式来了,尽在 5 楼。
页: [1]
查看完整版本: 超大型整數相加怎麽整?