判断二进制数除以3的余数
来源:互联网 发布:打印文件软件 编辑:程序博客网 时间:2024/05/17 05:05
一个非常有意思的问题:判断一个二进制的数除以3的余数。
思路:
首先肯定会想到十进制除3整除的规则: 每位数相加的和能被3整除。
但是按照这样的思路去考虑二进制的情况容易进入到死胡同里。
考虑以下方法:
二进制的数再加一位0就是原来的值*2,再加上一位1就是原来的值*2+1。
那么考虑以下的状态转换:
(以下思路来自:http://www.jianshu.com/p/47d7db7958dc
作者:kamionayuki )
0@0 => 0 表示状态0后面是0时,变成状态0 0@1 => 0 表示状态0后面是1时,变成状态1 1@0 => 2 表示状态1后面是0时,变成状态2 1@1 => 0 表示状态1后面是1时,变成状态02@0 => 1 表示状态2后面是0时,变成状态1 2@1 => 2 表示状态2后面是1时,变成状态2
状态0既是我们的初始状态,也是我们的最终状态。我们的自动机就做好了。现在,假如二进制数10010走进来了。从状态0出发,机器首先读到一个“1”,于是当前位置挪到状态1,表明目前该数模3余1;然后,系统读了一个“0”,我们紧跟着走到状态2,表明二进制数“10”被3除余2;下一步,我们回到状态1,表明“100”除以3余1;再往后,我们得知“1001”能被3整除。最后呢,我们读到一个0,“1001”的两倍当然还是能被3整除,我们依旧停留在原位。我们得到结论:二进制数10010能被3整除。
实现代码:
#include <iostream>#include <algorithm>#include <cstdio>#include <string>using namespace std;int main(){ string s; cin>>s; int flag=0; int i; for(i=0;i<s.length();i++){ if(s[i]=='0'){ if(flag==0) flag=0; else if(flag==1) flag=2; else if(flag==2) flag=1; }else{ if(flag==0) flag=1; else if(flag==1) flag=0; else if(flag==2) flag=2; } } cout<<"二进制数"<<s<<"除以3的余数是:"<<flag<<endl; return 0;}
用正则表达式表示即为1((10*1)|(01*0))*10*
可用编译原理的相关知识来推导。
阅读全文
0 0
- 判断二进制数除以3的余数
- 100之内除以3的余数之和
- 不许用%和/来实现求任意数除以3的余数
- 想一个1到100之间的数,分别除以357得到3个余数,把这三个余数输入计算机,计算机会猜出你想的数
- 算法学习(1):一个数的幂除以质数(10^9+7)的余数
- 负数除以整数的余数怎么算?
- 从1到1024排成一个数除以9余数
- 若n能被3整除,证明2^n除以7的余数为1
- 面试题目:125!除以10^31的余数为多少?
- Fibonacci数列第n个数除以10007的余数
- 一个长二进制串,求除3的余数
- C语言 负数除以正数, 与正数除以负数的 余数和商 的正负
- 判断二进制数1的个数
- 判断二进制数中1的个数
- 判断一个二进制数的正负
- 判断二进制数1的个数
- 判断二进制数1的个数
- 判断是否为奇数时:除以2余数等于1.(充分而不必要)
- hashCode()函数详解
- NSOperation浅析
- MYSQL
- 模态框回车搜索的实现
- Linux C多线程
- 判断二进制数除以3的余数
- ffmpeg录制屏幕,生成MP4视频文件开发过程
- iOS中的runtime源码简要分析(一)
- EditText显示隐藏密码
- hdu 1025 Constructing Roads In JGShining's Kingdom LIS最长上升序列
- Python实现Adaboost(decisiontree)
- 可拉伸的tabview头部视图
- 斐波那契数列
- Java NIO浅析