首页 > 编程知识 正文

二进制相减的算法图解,二进制减法器

时间:2023-05-03 18:43:48 阅读:43075 作者:3732

链接

有两个字符串a和b。 这两个字符串有ones个1和zeros个0。 zeros,ones=2)需要构建这两个字符串。 另外,必须保证a和b都没有前导零。 这意味着确保A-B之后的结果正好是ans_ones,有前导零。 (可以构建ones=2、zeros=3、ans_ones=3。 a=1100 ) A B ) B=1 0 0 0 1必须确保A - B后的结果=00011 (其中有三个1 )。 答案是同时输出a和b。输出NO () ones zeros=2e5,即AB字符串的长度)规格: AB的长度为n(n=oneszeros ):a=1xxxxxxx ans=0x XXXXXX 1,a=1111000b=111001[I]有三个0,当最后放置b的最后一个1时,A - B表示三个1 (0,0,0,0,0,1, 如果存在1 )1),则使b=110100 (此时,A-B中有1个),首先使B=11.11 00.00,接着使最后的1向后移动,最终) b=ones个位置如果假设b=11.11 00.00 1',但前提是zeros=ans_ones ' 2,那么在变为(ans_ones zeros )时,您是否认为一定没有解? (为什么这么说,是因为只有b中的0有机会成为ans中的1。 你非常容易这么想。 因为我觉得最后的ans中的1一定是由)位a的1 - B的0得到的)。 也就是说,1 - 0=ans中的1,你非常容易这么想。 但是……首先,回到小学的数学问题,回顾一下ans吧。 (ans的1,一定要1 - 0才能得到吗? )另外,进位时10 - 1也能得到1! '只能在(0 - 0) (1 - 0) (10 - 1 )这三种情况下逐位减少! 即使在10 - 1的情况下也能得到1! 例如,可以看到a=11110b=1011ans=00111 () ans中的1都不是来自b中的0,而是10 - 1。 )即使考虑到此策略,a=100 . 00 11 . 110 b=100 . 00 011 .1'也知道有(ones - 1 )个1。 都是10 - 1的方式,可以转换为ans中的1 )。 从12可以看出)我认为ans_ones=min。 正确的想法应该考虑如下。 1、我们的首要目的是为给定的ones和zeros找到最大的ma_ans_ones。 为什么要这么做呢? 该ma_ans_ones一定会由于分步的-=1而成为ans_ones2,由于A B,使a成为最大值,即11.11 00.00,也成为“假设” 。 即,假设a为11.1100.00,则得到ma_ans_ones ',所以正题的核心真的依赖于这两个“假设”。

'例如,我告诉你,ones=3,zeros=3根据你原来的策略,最多会得到max(Zeros,ones - 1 )=3个1,但其实也可以更多。 到底,怎么得到三个1呢? 其实,如果你直接想想,这非常困难。 我们还是根据“第二假设”,以A=11.11 00.00 (即ones个1 zeros个0 )的形式,并且,此时,b应该如何配置才能达到ma_ans_ones ? (必须知道b是如何配置的。 因为答案会输出给他。 这也很难啊。 (===此时)======我们必须先假设ans_ones为0,-1-2--.-ma_ans_ones====,这当然非常简单。 B==A==11.11 00.00此时,设为ans_ones==02。 如何设为ans_ones=1 - 2 - 3 - . 在这种情况下,与“上的战略1”相同的A=1 1 1 0 0 0B=1 1 1 0

0 0ans_ones = 0B = 1 1 0 1 0 0ans_ones = 1B = 1 1 0 0 1 0ans_ones = 2B = 1 1 0 0 0 1ans_ones = 3此时,我们处理了【让ans_ones = {1, 2, ..., zeros}的情况】当然,这和上面的策略1 是完全相同的。 (但其实,还可以更多)3, 此时的状态是:A = 1 1 1 0 0 0B = 1 1 0 0 0 1ans= 0 0 0 1 1 1(注意,此时ans的[3,4,5]下标,已经都是1了!!)index 0 1 2 3 4 5(就不要再修改ans[3,4,5]了,因为已经是1了)当,ans = x x x 1 1 1 (前面的xxx不关注)的这一时刻时, A等于多少呢?A = 1 1 0 0 0 0B = 1 1 0 0 0 1(即,我们的“小学数学减法运算” 先计算5,然后4,3)ans= x x x 1 1 1(当我们将ans的[3,4,5]的结果求出后 )index 0 1 2 3 4 5(此时,A = 1 1 0 0 0 0 )'现在,该去计算 ans[2]这个结果了'由于A是不能动的(因为A是最大值,这是我们最开始假设的)我们能动的,只有B,此时让B[1]的这个1,右移动1位后,形成:A = 1 1 0 xxx(我们发现,此时A[2]是0,去高位借位后,正好<10 - 1> = 1)B = 1 0 1 xxx(即,我们成功的将ans[2]变成了1!! 原来他是0)ans x x 1 111ind 0 1 2即:B 最开始为: 1 1 1 1 1 0 0 0 0 (zeros个0)0 1 2 3 4 5 6 7 81, 将[4](即最右侧的1),移动到[5, 6, 7, 8],分别会对ans_ones 带来 [1,2,3,4]的收益2, 将[3]的1, '右移1位',即与 swap( B[3], B[4] )后, 会带来 1 的收益'从第1步,跳到,第2步; 是非常不容易的!!'' 很难想到,在第1步后 ,还可以有第2步.... '' 仔细看上面的分析吧(前提是:保证不影响第1步带来的4的收益; 再去判断是否可以再增加收益)'3, 将[2]的1, '右移1位',即与 swap( B[2], B[3] )后, 会带来 1 的收益4, 将[1]的1, '右移1位',即与 swap( B[1], B[2] )后, 会带来 1 的收益 最开头的[0]的1,是不可以动的即,最大收益是: [4 + 1 + 1 + 1 + ..] = [zers + (ones - 2)]即,对于给定的: ones, zeros, ans_ones只要: ans_ones <= (zeros + ones - 2), 就一定是有解的string A = "", B = "";FOR(i, 1, ones, 1){ A += "1", B += "1"; }FOR(i, 1, zeros, 1){ A += "0", B += "0"; }FORR(i, ones - 1, 1, 1){if( i == (ones - 1) ){move = min(ans_ones, zeros);}else{move = 1;}swap(B[i], B[i + move]);ans_ones -= move;if( ans_ones == 0 ){ break; }}if( ans_ones == 0 ){PS("YES"); ED;cout << A; ED;cout << B; ED;}else{PS("NO");}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。