实用工具
小学数学练习
字帖生成
在线画板
函数绘制
拼音字母表
在线词典
黄历查询
中国历史
Excel函数
模拟请求
json格式化
最新更新
全站导航
登陆/注册
原创投稿
知识解答
合同文书
教育问答
最新资讯
学术期刊
资料下载
高考报名时间
2022年11月1日
还剩
天
距离
2023年6月7日
高考还有
天
网站首页
小学
初中
高中
语言
会计
驾考
学历
司法
IT
医护
建筑
作文
栏目分类:
前沿技术
软件开发
系统运维
产品运营
生活办公
面试经验
考试题库
子分类:
人工智能
大数据
云计算
区块链
物联网
深度学习
机器学习
NLP
计算机视觉
语音识别
其他
大数据系统
数据可视化
数据挖掘与分析
其他
Docker/k8s
虚拟化
云平台
其他
基本原理
数字货币
智能合约
EOS应用
其他
通讯技术
嵌入式开发
单片机
物联网应用
HarmonyOS
其他
后端开发
Web开发
移动开发
游戏开发
Python
Java
架构设计
C/C++/C#
PHP
.Net
Go语言
R语言
asp
Html/CSS
易语言
JavaScript
汇编语言
Vue.js
React.JS
Ruby开发
快速导航
当前搜索
当前分类
前沿技术
软件开发
系统运维
产品运营
生活办公
面试经验
考试题库
子分类
人工智能
大数据
云计算
区块链
物联网
深度学习
机器学习
NLP
计算机视觉
语音识别
其他
大数据系统
数据可视化
数据挖掘与分析
其他
Docker/k8s
虚拟化
云平台
其他
基本原理
数字货币
智能合约
EOS应用
其他
通讯技术
嵌入式开发
单片机
物联网应用
HarmonyOS
其他
后端开发
Web开发
移动开发
游戏开发
Python
Java
架构设计
C/C++/C#
PHP
.Net
Go语言
R语言
实用工具
学习工具
小学数学练习
字帖生成
在线画板
函数绘制
拼音字母表
在线词典
黄历查询
亲戚关系计算
安全期计算
中国历史
Excel函数
模拟请求
json格式化
浏览器指纹
热门搜索
路由器设置
木托盘
宝塔面板
儿童python教程
心情低落
朋友圈
vim
双一流学科
专升本
我的学校
日记学校
西点培训学校
汽修学校
情书
化妆学校
塔沟武校
异形模板
西南大学排名
最精辟人生短句
6步教你追回被骗的钱
南昌大学排名
清朝十二帝
北京印刷学院排名
北方工业大学排名
北京航空航天大学排名
首都经济贸易大学排名
中国传媒大学排名
首都师范大学排名
中国地质大学(北京)排名
北京信息科技大学排名
名师互学网
>
IT
>
软件开发
>
后端开发
>
C/C++/C#
大数(高精度数)模板(分享)
C/C++/C#
更新时间:
2026-04-01 06:54:37
发布时间:
1854天前
IT归档
最新发布
模块sitemap
名妆网
法律咨询
聚返吧
英语巴士网
伯小乐
网商动力
朗读
复制代码
代码如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const int MAXL = 500;
struct BigNum
{
int num[MAXL];
int len;
};
//高精度比较 a > b return 1, a == b return 0; a < b return -1;
int Comp(BigNum &a, BigNum &b)
{
int i;
if(a.len != b.len) return (a.len > b.len) ? 1 : -1;
for(i = a.len-1; i >= 0; i--)
if(a.num[i] != b.num[i]) return (a.num[i] > b.num[i]) ? 1 : -1;
return 0;
}
//高精度加法
BigNum Add(BigNum &a, BigNum &b)
{
BigNum c;
int i, len;
len = (a.len > b.len) ? a.len : b.len;
memset(c.num, 0, sizeof(c.num));
for(i = 0; i < len; i++)
{
c.num[i] += (a.num[i]+b.num[i]);
if(c.num[i] >= 10)
{
c.num[i+1]++;
c.num[i] -= 10;
}
}
if(c.num[len])
len++;
c.len = len;
return c;
}
//高精度减法,保证a >= b
BigNum Sub(BigNum &a, BigNum &b)
{
BigNum c;
int i, len;
len = (a.len > b.len) ? a.len : b.len;
memset(c.num, 0, sizeof(c.num));
for(i = 0; i < len; i++)
{
c.num[i] += (a.num[i]-b.num[i]);
if(c.num[i] < 0)
{
c.num[i] += 10;
c.num[i+1]--;
}
}
while(c.num[len] == 0 && len > 1)
len--;
c.len = len;
return c;
}
//高精度乘以低精度,当b很大时可能会发生溢出int范围,具体情况具体分析
//如果b很大可以考虑把b看成高精度
BigNum Mul1(BigNum &a, int &b)
{
BigNum c;
int i, len;
len = a.len;
memset(c.num, 0, sizeof(c.num));
//乘以0,直接返回0
if(b == 0)
{
c.len = 1;
return c;
}
for(i = 0; i < len; i++)
{
c.num[i] += (a.num[i]*b);
if(c.num[i] >= 10)
{
c.num[i+1] = c.num[i]/10;
c.num[i] %= 10;
}
}
while(c.num[len] > 0)
{
c.num[len+1] = c.num[len]/10;
c.num[len++] %= 10;
}
c.len = len;
return c;
}
//高精度乘以高精度,注意要及时进位,否则肯能会引起溢出,但这样会增加算法的复杂度,
//如果确定不会发生溢出, 可以将里面的while改成if
BigNum Mul2(BigNum &a, BigNum &b)
{
int i, j, len = 0;
BigNum c;
memset(c.num, 0, sizeof(c.num));
for(i = 0; i < a.len; i++)
{
for(j = 0; j < b.len; j++)
{
c.num[i+j] += (a.num[i]*b.num[j]);
if(c.num[i+j] >= 10)
{
c.num[i+j+1] += c.num[i+j]/10;
c.num[i+j] %= 10;
}
}
}
len = a.len+b.len-1;
while(c.num[len-1] == 0 && len > 1)
len--;
if(c.num[len])
len++;
c.len = len;
return c;
}
//高精度除以低精度,除的结果为c, 余数为f
void Div1(BigNum &a, int &b, BigNum &c, int &f)
{
int i, len = a.len;
memset(c.num, 0, sizeof(c.num));
f = 0;
for(i = a.len-1; i >= 0; i--)
{
f = f*10+a.num[i];
c.num[i] = f/b;
f %= b;
}
while(len > 1 && c.num[len-1] == 0)
len--;
c.len = len;
}
//高精度*10
void Mul10(BigNum &a)
{
int i, len = a.len;
for(i = len; i >= 1; i--)
a.num[i] = a.num[i-1];
a.num[i] = 0;
len++;
//if a == 0
while(len > 1 && a.num[len-1] == 0)
len--;
}
//高精度除以高精度,除的结果为c,余数为f
void Div2(BigNum &a, BigNum &b, BigNum &c, BigNum &f)
{
int i, len = a.len;
memset(c.num, 0, sizeof(c.num));
memset(f.num, 0, sizeof(f.num));
f.len = 1;
for(i = len-1;i >= 0;i--)
{
Mul10(f);
//余数每次乘10
f.num[0] = a.num[i];
//然后余数加上下一位
///利用减法替换除法
while(Comp(f, b) >= 0)
{
f = Sub(f, b);
c.num[i]++;
}
}
while(len > 1 && c.num[len-1] == 0)
len--;
c.len = len;
}
void print(BigNum &a) //输出大数
{
int i;
for(i = a.len-1; i >= 0; i--)
printf("%d", a.num[i]);
puts("");
}
//将字符串转为大数存在BigNum结构体里面
BigNum Tonum(char *s)
{
int i, j;
BigNum a;
a.len = strlen(s);
for(i = 0, j = a.len-1; s[i] != ' '; i++, j--)
a.num[i] = s[j]-'0';
return a;
}
void Init(BigNum &a, char *s, int &tag) //将字符串转化为大数
{
int i = 0, j = strlen(s);
if(s[0] == '-')
{
j--;
i++;
tag *= -1;
}
a.len = j;
for(; s[i] != ' '; i++, j--)
a.num[j-1] = s[i]-'0';
}
int main(void)
{
BigNum a, b;
char s1[100], s2[100];
while(scanf("%s %s", s1, s2) != EOF)
{
int tag = 1;
Init(a, s1, tag); //将字符串转化为大数
Init(b, s2, tag);
a = Mul2(a, b);
if(a.len == 1 && a.num[0] == 0)
{
puts("0");
}
else
{
if(tag < 0) putchar('-');
print(a);
}
}
return 0;
}
转载请注明:
文章转载自
www.mshxw.com
本文地址:
https://www.mshxw.com/it/66616.html
上一篇 实例详解Node.js 函数
下一篇 HDOJ 1443 约瑟夫环的最新应用分析详解
C/C++/C#相关栏目本月热门文章
1
【Linux驱动开发】设备树详解(二)设备树语法详解
2
别跟客户扯细节
3
Springboot+RabbitMQ+ACK机制(生产方确认(全局、局部)、消费方确认)、知识盲区
4
【Java】对象处理流(ObjectOutputStream和ObjectInputStream)
5
【分页】常见两种SpringBoot项目中分页技巧
6
一文带你搞懂OAuth2.0
7
我要写整个中文互联网界最牛逼的JVM系列教程 | 「JVM与Java体系架构」章节:虚拟机与Java虚拟机介绍
8
【Spring Cloud】新闻头条微服务项目:FreeMarker模板引擎实现文章静态页面生成
9
JavaSE - 封装、static成员和内部类
10
树莓派mjpg-streamer实现监控及拍照功能调试
11
用c++写一个蓝屏代码
12
从JDK8源码中看ArrayList和LinkedList的区别
13
idea 1、报错java: 找不到符号 符号: 变量 log 2、转换成Maven项目
14
在openwrt使用C语言增加ubus接口(包含C uci操作)
15
Spring 解决循环依赖
16
SpringMVC——基于MVC架构的Spring框架
17
Andy‘s First Dictionary C++ STL set应用
18
动态内存管理
19
我的创作纪念日
20
Docker自定义镜像-Dockerfile
热门相关搜索
路由器设置
木托盘
宝塔面板
儿童python教程
心情低落
朋友圈
vim
双一流学科
专升本
我的学校
日记学校
西点培训学校
汽修学校
情书
化妆学校
塔沟武校
异形模板
西南大学排名
最精辟人生短句
6步教你追回被骗的钱
南昌大学排名
清朝十二帝
北京印刷学院排名
北方工业大学排名
北京航空航天大学排名
首都经济贸易大学排名
中国传媒大学排名
首都师范大学排名
中国地质大学(北京)排名
北京信息科技大学排名
中央民族大学排名
北京舞蹈学院排名
北京电影学院排名
中国戏曲学院排名
河北政法职业学院排名
河北经贸大学排名
天津中德应用技术大学排名
天津医学高等专科学校排名
天津美术学院排名
天津音乐学院排名
天津工业大学排名
北京工业大学耿丹学院排名
北京警察学院排名
天津科技大学排名
北京邮电大学(宏福校区)排名
北京网络职业学院排名
北京大学医学部排名
河北科技大学排名
河北地质大学排名
河北体育学院排名
关于我们
文章归档
网站地图
联系我们
版权所有 (c)2021-2022 MSHXW.COM
ICP备案号:
晋ICP备2021003244-6号