大数相加与相乘算法实现
时间:2019-02-19
本文章向大家介绍大数相加与相乘算法实现,主要包括大数相加与相乘算法实现使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
大数相加 sample
123456789 + 987654321 = ?
大数相乘 思维参考
接下来我们再来聊一聊关于大数相乘算法,其实相乘算法思路基本上和相加没有区别,也是通过代码模拟我们曾经学得的乘法的
大数相乘 sample
835 * 49 = ?
void Reverse(char *str, int n)
{
int i;
for (i = 0; i < n / 2; i++)
{
char tmp;
tmp = str[i];
str[i] = str[n-i-1];
str[n-i-1] = tmp;
}
}
//本算法的时间复杂度O(n),空间复杂度N,只申请一个临时数组
char * sumFunc(char *a, char * b, int lenA, int lenB) {
//算法一进来应该做数据合法性检查
char * result = (char *)malloc(N * sizeof(char));
memset(result, '0', N); //结果数组先置于0方便计算
int i = lenA -1; //数组a的下标
int j = lenB -1; //数组b的下标
int k = 0; //结果数组的下标
int maxLenIndex = lenA > lenB ? lenA : lenB;
while (maxLenIndex > 0) {
int aValue = i>=0 ? a[i] - '0' : 0;
int bValue = j>=0 ? b[j] - '0' : 0;
int temp = aValue + bValue + result[k] - '0';
result[k] = temp % 10 + '0';
result[k+1] = temp / 10 + '0';
k++;
i--;
j--;
maxLenIndex --;
}
int sumLen = result[k] == '0' ? k : k+1; //获得字符串的长度
memset(result+sumLen, '\0', N-sumLen);//设置'\0'标记字符串结尾
Reverse(result, sumLen);
return result;
}
//本算法的时间复杂度O(n*m),空间复杂度N,只申请一个临时数组
char * multiFunc(char *a, char * b, int lenA, int lenB) {
char *result = (char *)malloc(N*sizeof(char));
memset(result, '0', N);
Reverse(a, lenA); //d低位到高位
Reverse(b, lenB); //d低位到高位
for (int i=0; i<lenA; i++) {
int addMark = 0; //又一次操作result[i+j]加完的进位
int mulMark = 0; //a[i]*b[j]乘完的进位
for (int j = 0; j<lenB; j++) {
int r1 = (a[i] - '0') * (b[j] - '0') + mulMark + addMark; //计算a[i]*b[j],再加上低位的进位
mulMark = r1 / 10; //乘完需要向高位的进位
int r2 = r1%10; //当前result[i+j]位的结果数值
int r3 = result[i+j] - '0' + r2; //操作result[i+j],结果可能超过10
result[i+j] = r3 % 10 + '0'; //操作result[i+j],是是否需要进位
addMark = r3/10; //获得需要去高位进位的具体数值
}
result [lenB + i] += addMark + mulMark;
}
int mulLen = '0' == result[lenA + lenB - 1] ? lenA + lenB - 1 : lenA + lenB;
memset(result+mulLen, '\0', N-mulLen);//设置'\0'标记字符串结尾
Reverse(result, mulLen);
return result;
}
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
char a[9] = "123456789";
char b[10] = "1987654321";
char * result = sumFunc(a, b, 9, 10);
//result = 0x0000600001458dd0 "2111111110"
char a1[4] = "9456" ;
char b1[5] = "93456" ;
char * result1 = multiFunc(a1, b1, 4, 5);
//result = 0x0000600001458dd0 "2111111110"
int j = 0;
j++;
// Do any additional setup after loading the view, typically from a nib.
}
@end
- 剑指offer代码解析——面试题22栈的压入、弹出序列
- 剑指offer代码解析——面试题21包含min函数的栈
- 剑指offer代码解析——面试题19二叉树的镜像
- mysql高可用架构设计,处理高并发,大流量!
- 零基础入门深度学习 | 第三章:神经网络和反向传播算法
- 微信企业付款到个人钱包引发的坑之反思~!
- Intellij idea创建javaWeb以及Servlet简单实现
- 设计模式之代理模式之读写分离!!!
- Phantomjs+Nodejs+Mysql数据抓取(1.数据抓取)
- Phantomjs+Nodejs+Mysql数据抓取(2.抓取图片)
- 深入浅出Redis-redis底层数据结构(上)
- Linux下自动化监控内存、存储空间!
- 深入浅出Redis-redis底层数据结构(下)
- Spring-boot:快速搭建微框架服务
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- APP自动化测试系列之Desired Capabilities详解
- Kafka分区分配策略(Partition Assignment Strategy)
- 内网渗透-代理篇(一)
- java学习应用篇|逃不掉的HelloWorld
- java学习原理篇|java程序运行套路
- 架构师成长之路系列(二)
- 前端性能优化 24 条建议(2020)
- 【Flutter 实战】大量复杂数据持久化
- GBDT+LR:Practical Lessons from Predicting Clicks on Ads
- 告别setState()! 优雅的UI与Model绑定 Flutter DataBus使用~
- k8s etcd 的实现原理
- iOS动态View的探索
- 安卓开发的瑞士军刀“Retrofit2框架”
- R语言中的广义线性模型(GLM)和广义相加模型(GAM):多元(平滑)回归分析保险资金投资组合信用风险敞口
- 来玩 TencentOS tiny 物联网终端操作系统