大整数算法

本文主要整理了几个常用的大整数的算法:
大整数加法
大整数乘法
大整数阶乘
大整数幂
其实大体的思路都差不多,都是用数组来存储大整数。以下的代码仅仅实现功能,并没有充分详细的参数判断,在实际运用中,肯定是需要考虑的。

大整数相加

 1 #include 
 2 #include <string.h>
 3 #define N 1000
 4 void get_num(int *array)
 5 {
 6     char str[N] = {'\0'};
 7     int loop    = 0;
 8     int length  = 0;
 9
10     scanf("%s", str);
11     length = strlen(str);
12     for (loop = 0; loop < length; ++loop) {
13         array[loop] = str[length - loop - 1] - '0';
14     }
15     array[loop] = -1;
16 }
17
18 void big_plus(int *num1, int *num2, int *result)
19 {
20     int num1_index   = 0;
21     int num2_index   = 0;
22     int result_index = 0;
23     int tmp_carry    = 0;
24     int tmp_result   = 0;
25     while (num1[num1_index] != -1 && num2[num2_index] != -1) {
26         tmp_result = num1[num1_index++] + num2[num2_index++] + tmp_carry;
27         result[result_index++] = tmp_result % 10;
28         tmp_carry = tmp_result / 10;
29     }
30     while (num1[num1_index] != -1) {
31         tmp_result = num1[num1_index++] + tmp_carry;
32         result[result_index++] = tmp_result % 10;
33         tmp_carry = tmp_result / 10;
34     }
35     while (num2[num2_index] != -1) {
36         tmp_result = num2[num2_index++] + tmp_carry;
37         result[result_index++] = tmp_result % 10;
38         tmp_carry = tmp_result / 10;
39     }
40     if (tmp_carry) {
41         result[result_index++] = tmp_carry;
42     }
43     result_index[result_index] = -1;
44 }
45 void print_result(int *array)
46 {
47     int i = 0;
48     int len = 0;
49     for (i = 0; array[i] != -1; ++i);
50
51     len = i;
52     for (i = len - 1; i >= 0; --i) {
53         printf("%d", array[i]);
54     }
55     if (len == 0) {
56         printf("0");
57     }
58     printf("\n");
59 }
60 int main(int argc, char **argv)
61 {
62     int num1[N] = {0};
63     int num2[N] = {0};
64     int result[N] = {0};
65     //将数用数组来存,并从低位向高位存.
66     get_num(num1);
67     get_num(num2);
68     //执行相加操作
69     big_plus(num1, num2, result);
70     print_result(result);
71     return 0;
72 }

大整数相乘

 1 #include 
 2 #include <string.h>
 3 #define N 1000
 4
 5 void get_num(int *array)
 6 {
 7     char str[N] = {'\0'};
 8     int loop    = 0;
 9     int length  = 0;
10
11     scanf("%s", str);
12     length = strlen(str);
13     for (loop = 0; loop < length; ++loop) {
14         array[loop] = str[length - loop - 1] - '0';
15     }
16     array[length] = -1;
17 }
18 void big_multi(int *num1, int *num2, int *result)
19 {
20     int num1_index = 0;
21     int num2_index = 0;
22     int result_index = 0;
23     int tmp_carry = 0;
24     int tmp_result = 0;
25     for (num1_index = 0; num1[num1_index] != -1; ++num1_index) {
26         for (num2_index = 0; num2[num2_index] != -1; ++num2_index) {
27             tmp_result = num1[num1_index] * num2[num2_index] + result[num1_index + num2_index] + tmp_carry;
28             result[num1_index + num2_index] = tmp_result % 10;
29             tmp_carry = tmp_result / 10;
30         }
31         result_index = num1_index + num2_index - 1;
32         if (tmp_carry) {
33             result[++result_index] = tmp_carry;
34         }
35     }
36     result[++result_index] = -1;
37 }
38 void print_result(int *array)
39 {
40     int i = 0;
41     int len = 0;
42     for (i = 0; array[i] != -1; ++i);
43
44     len = i;
45     for (i = len - 1; i >= 0; --i) {
46         printf("%d", array[i]);
47     }
48     if (len == 0) {
49         printf("0");
50     }
51     printf("\n");
52 }
53 int main(int argc, char **argv)
54 {
55     int num1[N] = {0};
56     int num2[N] = {0};
57     int result[2 * N] = {0};
58     //将数用数组来存,并从低位向高位存.
59     get_num(num1);
60     get_num(num2);
61     //执行相乘操作
62     big_multi(num1, num2, result);
63     print_result(result);
64     return 0;
65 }

大整数阶乘

 1 #include 
 2 #include <string.h>
 3 #define N 10000
 4
 5 void print_result(int *array)
 6 {
 7     int i = 0;
 8     int len = 0;
 9     for (i = 0; array[i] != -1; ++i);
10
11     len = i;
12     for (i = len - 1; i >= 0; --i) {
13         printf("%d", array[i]);
14     }
15     if (len == 0) {
16         printf("0");
17     }
18     printf("\n");
19 }
20
21 void big_factor(int n, int *result)
22 {
23     int result_index = 0;
24     int carry = 0;
25     int tmp_result = 0;
26     int i = 0;
27     int j = 0;
28     result[0] = 1;
29     if (n 1) {
30         result[1] = -1;
31         return;
32     }
33     for (i = 1; i i) {
34         for (j = 0; j j) {
35             tmp_result = result[j] * i + carry;
36             result[j] = tmp_result % 10;
37             carry = tmp_result / 10;
38         }
39         while (carry) {
40             result[++result_index] = carry % 10;
41             carry = carry / 10;
42         }
43     }
44     result[++result_index] = -1;
45 }
46
47 int main(int argc, char **argv)
48 {
49     int n = 0;
50     int result[N] = {0};
51     scanf("%d", &n);
52     //将数用数组来存,并从低位向高位存.
53     big_factor(n, result);
54     print_result(result);
55     return 0;
56 }

大整数幂

 1 #include 
 2 #include <string.h>
 3 #define N 10000
 4
 5 void print_result(int *array)
 6 {
 7     int i = 0;
 8     int len = 0;
 9     for (i = 0; array[i] != -1; ++i);
10
11     len = i;
12     for (i = len - 1; i >= 0; --i) {
13         printf("%d", array[i]);
14     }
15     if (len == 0) {
16         printf("0");
17     }
18     printf("\n");
19 }
20
21 int big_pow(int base, int power, int *result)
22 {
23     int result_index = 0;
24     int carry = 0;
25     int tmp_result = 0;
26     int i = 0;
27     int j = 0;
28     result[0] = 1;
29     if (base == 1 || power == 0) {
30         result[1] = -1;
31     }
32     for (i = 0; i < power; ++i) {
33         for (j = 0; j j) {
34             tmp_result = result[j] * base + carry;
35             result[j] = tmp_result % 10;
36             carry = tmp_result / 10;
37         }
38         while (carry) {
39             result[++result_index] = carry % 10;
40             carry = carry / 10;
41         }
42     }
43     result[++result_index] = -1;
44 }
45
46 int main(int argc, char **argv)
47 {
48     int base  = 0;
49     int power = 0;
50     int result[N];
51     //输入底数和指数
52     scanf("%d%d", &base, &power);
53     big_pow(base, power, result);
54     print_result(result);
55     return 0;
56 }

Original: https://www.cnblogs.com/0x12345678/p/5372254.html
Author: Hackergin
Title: 大整数算法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/644025/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 项目一共30个模块,你叫我maven版本一个个手动改?

    大家好呀,我是铂赛东,一个乱入公众号博主的开源作者。今天分享一个maven小技巧,希望帮助到大家。 之前有个群友私聊问我,如何快速统一去更改项目中所有的maven版本号,他说之前都…

    技术杂谈 2023年7月11日
    066
  • 【软考】信息系统安全等级保护

    1.概念 《计算机信息系统安全保护等级划分准则》(GB 17859-1999)将计算机信息系统划分为5个等级: 等级 适用范围 用户自主保护级 普通内联网用户 系统审计保护级 通过…

    技术杂谈 2023年5月31日
    095
  • 1) & hash

    在上一篇 Java 中HashMap详解(含HashTable, ConcurrentHashMap) 中提到在map.put(key, value)的过程中,计算完key的has…

    技术杂谈 2023年6月21日
    093
  • Spring mvc源码分析系列–前言

    距离上次写文章已经过去接近两个月了,Spring mvc系列其实一直都想写,但是却不知道如何下笔,原因有如下几点: 现在项目开发前后端分离的趋势不可阻挡。Spring mvc这一套…

    技术杂谈 2023年7月25日
    071
  • APACHE正向代理配置

    Apache快速安装和反向代理配置:https://www.cnblogs.com/brad93/p/16718104.html Apache正向代理配置参考教程:https://…

    技术杂谈 2023年7月10日
    085
  • shopify主题模板startup修改

    shopify startup主题是一个很好的直接面向消费者DTC品牌的shopify模板,具有增强的推荐部分可定制性强,适合‎ ‎服装和配饰, 健康与美容, 家居与园艺‎,Dro…

    技术杂谈 2023年5月31日
    0102
  • 王阳明心学精髓60句,带您寻找内心深处的光明(顶级人生智慧)

    1、天地载道,道存则万物生,道失则万物灭。 2、天道之数,至则反,盛则衰。炎炎之火,灭期近矣。 3、自知者智,自胜者勇,自暴者弃,自强者成。 4、夫用人之道,疑则生怨,信则共举。 …

    技术杂谈 2023年6月1日
    086
  • Pycharm k火秘诀插件

    Pycharm2020最新永久激活码插件(支持Windows),100%永久激活 用到pycharm工具发现没用多久时间又过期了,在网上有看到很多朋友都遇到同样的情况,于是找到了一…

    技术杂谈 2023年6月21日
    0139
  • 单张海报点击实例

    可以修改图片和链接,点击链接跳转,适合单张图片模块,店铺收藏、公告等。 <ui> <view> <container> <editProp…

    技术杂谈 2023年6月1日
    098
  • 开发,从未如此清晰

    关于开发,我们已经有了太多的方法论和工具,这之间其实很难说哪个方法论是正确的,哪个工具是最好用的;其实开发是”任性的”,它没有定律,如人饮水冷暖自知,其过程…

    技术杂谈 2023年5月31日
    0106
  • glPushMatrix

    glPushMatrix didn’t fail to push onto the stack; it’s job is to push a copy of…

    技术杂谈 2023年6月1日
    093
  • 上周热点回顾(7.18-7.24)

    热点随笔: · 聊一聊 C# 后台GC 到底是怎么回事? (一线码农)· 从工程师到技术leader思维升级 (温一壶清酒)· 超酷炫的转场动画?CSS 轻松拿下!(ChokCoc…

    技术杂谈 2023年5月31日
    087
  • Elasticsearch(5):添加文档

    1 ES数据读写流程 ¶ ES中,每个索引都将被划分为若干分片,每个分片可以有多个副本。这些副本共同组成复制组,复制组中的分片在添加或删除文档时必须保持同步,否则,从一个副本中读取…

    技术杂谈 2023年7月24日
    078
  • Android安卓进阶技术分享之AGP工作原理

    1.基础准备 在分析源码之前,我想你应该对 Android 打包流程已经有基础的了解,至少了解了下图的打包过程: 否则你有可能不了解下文中的专业术语。 2.AGP源码的打开方式 看…

    技术杂谈 2023年7月10日
    073
  • Ubuntu 20.04利用SystemMonitor显示CPU、GPU温度等信息

    Ubuntu下总是使用终端命令查看CPU、GPU温度有点麻烦,利用自带的SystemMonitor来显示这些信息较为简单。 1、添加仓库进行安装 sudo add-apt-repo…

    技术杂谈 2023年7月11日
    095
  • 1、使用thymeleaf给foreach遍历的元素加一个id2、在th:href中使用${}

    备注:在jsp之中,类似的是varStatus 需求: 有时候,我们需要操作foreach遍历后的元素,比如说,使用js给遍历的某个元素绑定点击事件;那么如何通过标签的id找到那个…

    技术杂谈 2023年7月24日
    061
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球