社区
C语言
帖子详情
怎样用两个32位数,来实现64位的乘除运算?
常
2008-04-29 09:46:46
题目:只能用int 或 usigned int 型数据, 不能用浮点数,
请计算实现整数运算 a*b/c, (a,b,c都是非常大的32位整数)
思路:用32位来模拟64位的加减乘除,可能是一个能够保证计算精度的好方法。
请老师指点,如何实现?
...全文
687
9
打赏
收藏
怎样用两个32位数,来实现64位的乘除运算?
题目:只能用int 或 usigned int 型数据, 不能用浮点数, 请计算实现整数运算 a*b/c, (a,b,c都是非常大的32位整数) 思路:用32位来模拟64位的加减乘除,可能是一个能够保证计算精度的好方法。 请老师指点,如何实现?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
UltraBejing
2008-04-30
打赏
举报
回复
好像没那么简单,呵呵.
常
2008-04-29
打赏
举报
回复
if((x | t) > = z) { x -= z; y++; }
常
2008-04-29
打赏
举报
回复
重传一下
// 进行长除法(被除数为64位)
for (int i = 1; i <= 32; i++)
{
t = (int)x > > 31; // All 1 's if x(31) = 1.
x = (x < < 1) | (y > > 31); // Shift x || y left
y < <= 1; // one bit.
if((x|t) > = z) { x -= z; y++; }
}
return x; // y为商, x为余数
常
2008-04-29
打赏
举报
回复
我看到了一段代码挺好的,能实现 a*b/c的功能,
乘法做的是对的,但是除法做的好像不对,
那位老师帮着修正一下
// 计算(u*v)%m
unsigned mul_mod(unsigned u, unsigned v, unsigned z)
{
// 如果u*v没有溢出, 则直接计算
if((u*v)/u == v) return (u*v)%z;
// 进行长乘法(结果为64位)
unsigned u0, v0, w0;
unsigned u1, v1, w1, w2, t;
u0 = u & 0xFFFF; u1 = u > > 16;
v0 = v & 0xFFFF; v1 = v > > 16;
w0 = u0*v0;
t = u1*v0 + (w0 > > 16);
w1 = t & 0xFFFF;
w2 = t > > 16;
w1 = u0*v1 + w1;
// x为高32位, y为低32位
unsigned x = u1*v1 + w2 + (w1 > > 16);
unsigned y = u*v;
// 进行长除法(被除数为64位)
for (int i = 1; i <= 32; i++)
{
t = (int)x > > 31; // All 1 's if x(31) = 1.
x = (x < < 1) | (y > > 31); // Shift x || y left
y < <= 1; // one bit.
if((x|t) > = z) { x -= z; y++; }
}
return x; // y为商, x为余数
}
珍惜生命远离CPP
2008-04-29
打赏
举报
回复
大数运算,支持任意长度的 + - * / %
http://blog.csdn.net/akirya/archive/2008/02/04/2083998.aspx
用户 昵称
2008-04-29
打赏
举报
回复
直接在网上找大数运算之类的类 吧。
Xuon
2008-04-29
打赏
举报
回复
考虑用数组 看行不
晨星
2008-04-29
打赏
举报
回复
想办法手工处理一个进位和借位就是了。
珍惜生命远离CPP
2008-04-29
打赏
举报
回复
能内嵌汇编不能?
基于c51单片机简单的计算器程序,简易计算器设计两位
数
加减运算
基于c51单片机简单的计算器程序,简易计算器设计两位
数
加减运算 可
实现
三位
数
的加减乘除混合运算!将运算结果显示在
数
码管上!
JS小
数
加减乘
除运算
后位
数
增加的解决方案
JS小
数
加减乘
除运算
后小
数
点后产生多位
数
和计算精度损失的解决方案
大整
数
加减乘除指
数
运算课程设计
数
据结构(源代码+实验报告,期末成绩优秀)
密码学分为两类密码:对称密码和非对称密码。对称密码主要用于
数
据的加/解密,而非对称密码则主要用于认证、
数
字签名等场合。非对称密码在加密和解密时,是把加密的
数
据当作一个大的正整
数
来处理,这样就涉及到大整
数
的加、减、乘、除和指
数
运算等,同时,还需要对大整
数
进行输出。请采用相应的
数
据结构
实现
大整
数
的加、减、乘、除和指
数
运算,以及大整
数
的输入和输出。 【基本要求】 1.要求采用链表来
实现
大整
数
的存储和运算,不允许使用标准模板类的链表类(list)和函
数
。 同时要求可以从键盘输入大整
数
,也可以文件输入大整
数
,大整
数
可以输出至显示器,也可以输出至文件。大整
数
的存储、运算和显示,可以同时支持二进制和十进制,但至少要支持十进制。大整
数
输出显示时,必须能清楚地表达出整
数
的位
数
。测试时,各种情况都需要测试,并附上测试截图;要求测试例子要比较详尽,各种极限情况也要考虑到,测试的输出信息要详细易懂,表明各个功能的执行正确。 2.要求大整
数
的长度可以不受限制,即大整
数
的十进制位
数
不受限制,可以为十几位的整
数
,也可以为500多位的整
数
,甚至更长;大整
数
的运算和显示时,只需要考虑正的大整
数
。如果可能的话,请以秒为单位显示每次大整
数
运算的时间。 3.要求采用类的设计思路,不允许出现类以外的函
数
定义,但允许友元函
数
。主函
数
中只能出现类的成员函
数
的调用,不允许出现对其它函
数
的调用。 4.要求采用多文件方式:.h文件存储类的声明,.cpp文件存储类的
实现
,主函
数
main存储在另外一个单独的cpp文件中。如果采用类模板,则类的声明和
实现
都放在.h文件中。 5.不强制要求采用类模板,也不要求采用可视化窗口;要求源程序中有相应注释。 6.要求采用Visual C++ 6.0及以上版本进行调试。
设计模式之解释器模式Java版本
实现
设计模式之解释器模式的Java版本
实现
和UML类图设计
RSA算法的纯Python
实现
(源码)
RSA算法的纯Python
实现
,压缩包内共4个文件,分别是 1、大整
数
的运算库(当然不是算加减乘除的,这个python本身就有)。这个库是计算乘模运算,幂模运算(蒙哥马利算法),最大公约
数
算法及扩展最大公约
数
算法(扩展欧几里得算法)等。 2、质
数
库。Miller_Rabin素
数
判断法,大整
数
快速因式分解算法(pollard_rho算法),生成指定位
数
的大质
数
或大整
数
算法等。 3、RSA算法库。使用上面
两个
库,
实现
RSA算法。
实现
了生成指定
数
位的密钥对,加密,解密,签名和验证,这5个核心功能。 4、RSAtest.py一个使用RSA算法库的例子。例子从生成密钥对开始,对
数
据进行加解密,签名和验证签名,最后用修改后的消息再次验证签名。 这个RSA算法最低支持
32位
密钥长度,最长没限制。但是事实上,在我的电脑上测试,1024位大概1.3秒左右,1536大约5~6秒,2048位密钥生成就需要约27秒。 这次发布的是源码,里面有详细的中文注释,十分适合希望学习RSA算法原理的人。RSA算法原理基于
两个
大质
数
的乘积很难因式分解,几种算法的优劣主要体现在质
数
判断、快速乘模运算、快速幂模运算等。如需实际应用建议使用大能们的
实现
:https://pypi.python.org/pypi/rsa/
C语言
69,373
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章