本来利用一般的思想的是一个数组位存一位数, 需要初始化数组a[1024],但是可以利用更节省空间的方法。
C语言unsigned int 的范围是0-2^32-1,一个数组位就可以存32bit(1个int = 4Bytes = 4*8bit = 32 bit),
1024比特用初始化数组a[1024/32]=a[32]可以储存完。在本程序中,我用a[0]代表实际数组的长度,
因此1024比特位的大数需要用数组a[33]存储。

bitmap思想
a[0]------------------------------------数组长度
a[1]------------------------------------0到^32-1
a[2]------------------------------------2^32 -1到2^64-1

举一个例子 :其中0X代表16进制
a[33]={1, 0}代表数字为0的数
a[33]={1, 1}代表数字为1的数
a[33]={2,0xffffffff,1}所代表的数字大小是2^32的数
若要实现 a[33]={1, 0xffffffff}, b[33]={1, 0x1} 的加法 ,
二进制中32比特的加法如下图所示:

需要向前进1,我们可以将a[2]赋值为1,故数组a,b相加可以得到数组c是c[34]={2,0x0,0x1}

数组初始化大小为0的程序是

/****************************************************************************************************
大数相加
调用方式Add(x,y,z)
返回值,z=x+y
*****************************************************************************************************/
void Add_Big(unsigned int x[], unsigned int y[], unsigned int *z)
{int i;unsigned int t[34];unsigned int carry = 0;unsigned long long sum = 0;Init(t);Mov_Big(x, t);if (t[0] < y[0]){t[0] = y[0];}for (i = 1; i <= t[0]; i++){sum = y[i];sum = sum + t[i] + carry;t[i] = (unsigned long)sum;carry = (unsigned int)(sum >> 32);}if (carry != 0){t[t[0] + 1] = carry;t[0] = t[0] + 1;}Mov_Big(t, z);}

c语言实现1024bit大数加法的完整程序如下,使用devc++进行编译

#include<stdio.h>
#define MAX 32/***************************************************************************************************
初始化大数对象,且数组第一位是数组的实际长度
****************************************************************************************************/
void Init(unsigned int *x)
{int i;for (i = 1; i < MAX; i++)x[i] = 0;x[0] = 1;}
/***************************************************************************************************
大数比较
调用方式Cmp(x, y)
返回值,若x<y返回 - 1;若x>y返回1; 若x = y返回0
*****************************************************************************************************/
int Cmp(unsigned int x[], unsigned int y[])
{int i;if (x[0] > y[0])return 1;if (x[0] < y[0])return -1;for (i = MAX - 1; i >= 1; i--){if (x[i] < y[i])return -1;if (x[i] > y[i])return 1;}return 0;
}/****************************************************************************************************
大数赋值
调用方式Mov(x,y)
返回值:y被赋值为x;
*****************************************************************************************************/
void Mov_Big(unsigned int x[], unsigned int *y)
{int i;for (i = 0; i <= x[0]; i++){y[i] = x[i];}if (x[0] < MAX)for (i = x[0] + 1; i < MAX; i++){y[i] = 0;}
}void Mov_Long(unsigned long long x, unsigned int *y)
{int i;if (x > 0xffffffff){y[0] = 2;y[1] = (unsigned int)x;y[2] = (unsigned int)(x >> 32);}else{y[0] = 1;y[1] = (unsigned int)x;}for (i = y[0] + 1; i < MAX; i++)y[i] = 0;
}
/****************************************************************************************************
大数相加
调用方式Add(x,y,z)
返回值,z=x+y
*****************************************************************************************************/
void Add_Big(unsigned int x[], unsigned int y[], unsigned int *z)
{int i;unsigned int t[34];unsigned int carry = 0;unsigned long long sum = 0;Init(t);Mov_Big(x, t);if (t[0] < y[0]){t[0] = y[0];}for (i = 1; i <= t[0]; i++){sum = y[i];sum = sum + t[i] + carry;t[i] = (unsigned long)sum;carry = (unsigned int)(sum >> 32);}if (carry != 0){t[t[0] + 1] = carry;t[0] = t[0] + 1;}Mov_Big(t, z);}void Add_Long(unsigned int x[], unsigned long long y, unsigned int *z)
{unsigned int t[34];unsigned long long sum = 0;Init(t);Mov_Big(x, t);sum = t[1];sum = sum + y;t[1] = (unsigned int)sum;if (sum > 0xffffffff){int i = 2;while (t[i] == 0xffffffff){t[i] = 0;i++;}t[i]++;if (t[0] == i)t[0]++;}Mov_Big(t, z);
}int main()
{unsigned int a[33]={8, 0x7C66DDDD, 0xE8C4E481, 0x09DC3280, 0xE1E40869, 0x487D01D6, 0xF5ED0704, 0x62BF718F, 0x93DE051D };unsigned int b[33]={8, 0x0A3EA616, 0x0C464CD7, 0xFA602435, 0x1C1C00CB, 0x5C395BBC, 0x63106512, 0x4F21E607, 0x21FE8DDA};unsigned int c[34];Add_Big(a,b,c);int i;printf("a=   ");printf("\n ");for(i=a[0];i>=1;i--)printf("%llx",a[i]);printf("\n ");printf("\n ");printf("b=   ");printf("\n ");for(i=b[0];i>=1;i--)printf("%llx",b[i]);printf("\n ");printf("\n ");printf("a+b=  ");printf("\n ");for(i=c[0];i>=1;i--)printf("%llx",c[i]);return 0;}

大数运算c语言运算结果

C语言实现1024bit大数加法(1)相关推荐

  1. c语言 大数开方,大数加法之C语言函数法(只有正数版)

    由于某些原因,我于今天2017-4-19将我的博文搬到博客园了,以后我就在这里扎根了. 之前想过在博客写文章方便日后复习,但一直未能实现,所以,现在这篇是我个人人生中第一篇博客,所以写博客完全没经验, ...

  2. 大数加法分析及C语言实现(加数可为负数)

    大数加法(加数可为负数) ·分析: 大数加法有如下几种情况: 1.两数同号 (1)同正:如,s1=11,s2=22:s1=0,s2=0 (2)同负:如,s1=-11,s2=-22 2.两数异号 (1) ...

  3. 51NOD-1005 大数加法【大数】

    1005 大数加法  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出2个大整数A,B,计算A+B的结果. Input 第1行:大数A 第2行:大数B (A,B的长度 ...

  4. 大数加法【HDU 1002】

    大数加法模板 一般的加法只要int类型的两数直接相加即可,大一点的数可以设为long long类型,而超过长整型的数则属于大数问题了,大数加法其实也比较简单,利用数组实现就可以啦: 主要思想如下: ( ...

  5. python【蓝桥杯vip练习题库】ADV-136大数加法(高精度加法)

    试题 算法提高 大数加法 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 输入两个正整数a,b,输出a+b的值. 输入格式 两行,第一行a,第二行b.a和b的长度均小于1000位. ...

  6. Java实现大数乘法_java实现大数加法、乘法(BigDecimal)

    之前写过用vector.string实现大数加法,现在用java的BigDecimal类,代码简单很多.但是在online-judge上,java的代码运行时间和内存大得多. java大数加法:求a+ ...

  7. python加法怎么写_51NOD 大数加法以及python写法

    大数加法一般为小学生式的"竖式计算"要特别注意的是借位与进位的问题(先给看c++写法,我怕先看了python写法,会看不下去c++写法)这题还有要注意的是 1.同符号的话,直接加就 ...

  8. Java大数加法乘法减法、36进制加法

    文章目录 大数加法 大数减法 c++版本 Java版本 大数乘法 36进制加法 c++版 Java版 大数加法 1.是整数: 2.两个数无限大,long都装不下: 3.不能用BigInteger: 4 ...

  9. 牛客题霸 [ 大数加法]C++题解/答案

    牛客题霸 [ 大数加法]C++题解/答案 题解: 本质就是模拟加法运算 想要让s与t长度统一,不足的部分用0来补充 然后从最后一位开始,两个数相加,同时如果超过10,就把多的部分加到下一位 其实就是我 ...

最新文章

  1. java addfirst()_Java addFirst(),addLast() 在链表(LinkedList)的开头和结尾添加元素
  2. Windows 2003 Server服务器上IIS发布网站具体步骤
  3. 学习笔记(一)(x264编码流程)
  4. 子串、子数组与子序列类型问题的动态规划求解(Leetcode题解-Python语言)
  5. linux内核2.6.35编译过程
  6. [React Native Android 安利系列]样式与布局的书写
  7. mysql 格式化 小数点后两位_MYSQL数据库mysql格式化小数保留小数点后两位(小数点格式化)...
  8. 2021年茶艺师(中级)考试技巧及茶艺师(中级)作业考试题库
  9. 首台微型计算机,全球首台骁龙820微型电脑:DragonBoard 820c
  10. Android 相机开发
  11. carla Engine crash handling finished; re-raising signal 11 for the default handler. Good bye.
  12. VScode CMake 编写 Boost Asio Chat程序----记录6
  13. 痞子衡嵌入式:实抓Flash信号波形来看i.MXRT的FlexSPI外设下AHB读访问情形(有预取)...
  14. kaggle练习-共享单车数据
  15. 谷歌浏览器有些图片不显示
  16. kanzi学习之路(序)
  17. 【AI TIME PhD】东北大学NLP实验室专场预告
  18. [Paper Reading] Towards Conversational Recommendation over Multi-Type Dialogs
  19. 网络共享怎样改自己的计算机名字,局域网共享设置|如何设置局域网共享
  20. 这几款免费的解说配音软件,非常适合制作解说视频

热门文章

  1. vue-vue2和vue3的diff算法
  2. FTP服务器搭建与配置
  3. JdbcTemplate 无效的列类型 UncategorizedSQLException
  4. NBA成心和中国球迷作对吗??
  5. springboot启动报错:create a memory leak. Stack trace of thread:(DubboResponseTimeoutScanTimer)
  6. 全球速卖通优化技巧是什么?
  7. 在获取网页时半角全角字符混合的问题
  8. Python pip 源设置成国内源,阿里云源,清华大学源,最方便的方式,都在这里了
  9. linux查看网络连接
  10. matlab 音乐信号处理,MATLAB 的音频信号处理技术 | 学步园