
小艾和她女朋友(俄罗斯农民乘法)
发布日期:2021-05-08 23:14:53
浏览次数:13
分类:博客文章
本文共 870 字,大约阅读时间需要 2 分钟。
问题描述:
小艾是产自中国的一个移位寄存器,他最近很苦恼,他和他的同事吵架了,他们无法合作导致无法完成乘法操作,因为他自己只会通过移位完成乘2的乘法和除以2的除法,所以他无法完成复杂乘法。小艾的女朋友又比较笨,死活学不会乘法,小艾的女朋友不愿看他继续消沉下去,决定和小艾来一次说走就走的旅行,他们选择去俄罗斯看冰雪大世界,旅途中,小艾依然心不在焉,一位俄罗斯农民伯伯看出小艾有心事,便自动和小艾聊起了天,得知小艾是因为这点小事苦恼,农民伯伯说他有办法帮助小艾重回巅峰,小艾顿时来了精神,赶忙向农民伯伯请教。农民伯伯点起一支烟,眯着眼睛开始讲解……谁说完成乘法一定要复杂的操作,你和你女朋友就可以完成了,小艾存一个数n,你女朋友存一个数m,如果小艾存的是偶数,则小艾右移一位(除2),你女朋友左移一位(乘2),如果小艾存的是奇数,则小艾先减一再右移一位,将你女朋友保存的值传给累加器兄弟,然后你女朋友左移一位(乘2)。一直重复上述过程,直到小艾等于0。此时累加器中的值就是乘法的结果。
算法描述:
例子:
算法分析:
在整个计算的过程中都是乘以2和除以2的操作,这种操作在计算机中可以直接使用位移计算,效率非常高。因此,这个算法对计算机的整数计算是很有实际意义的!
用途:
(1)用在大数相乘取模的情况,可以防止大数相乘溢出。
(2)当我们使用int类型做快速乘运算时就相当于模2^32(假设 int类型是 4位)。
代码实现:
// 俄罗斯农民乘法(C++实现)int russian_peasant_multiplication(int n, int m) { int ans = 0;// 保存乘法结果 while (n > 0) { if (n & 1) {// 判断奇偶 ans += m; } n >>= 1;// n除以2 m <<= 1;// m乘以2 } return ans;// 返回乘法结果}
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2025年04月17日 23时36分23秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
C++ 子类对象直接赋值给父类对象可行,反过来不行
2019-03-06
linux下同一个动态库名为何辣么多的.so文件
2019-03-06
SQL联表的方式(逗号, Left Join, Right Join)
2019-03-06
牛客网输入输出举例
2019-03-06
字符串初始化时的注意点
2019-03-06
软考相关试题
2019-03-06
顺序表的操作
2019-03-06
常量表达式
2019-03-06
POD类型
2019-03-06
const与常量,傻傻分不清楚~
2019-03-06
Head First设计模式——迭代器模式
2019-03-06
MongoDB版本及存储引擎区别
2019-03-06
shell echo单行和多行文字定向写入到文件中
2019-03-06
AtCoder Beginner Contest 100 题解
2019-03-06
【数据结构】可持久化线段树初步
2019-03-06
Java高性能编程之CAS与ABA及解决方法
2019-03-06
从BIO到Netty的演变
2019-03-06
《算法导论》第二章笔记
2019-03-06
HTML节点操作
2019-03-06
HTML5新特性
2019-03-06