2.1-4习题总结

习题是这个样子的:

Consider the problem of adding two n-bit binary integers, stored in two n-element arrays A and B.The sum of the two integers should be stored in binary  form in an (n+1)-element array C.State the problem formally and write pseudocode for adding the two integers.

我开始是这样理解的,两个数组A.B,每个数组都有n个元素,而每个元素存的是n位二进制数,比如:A[3 ]={111, 101, 100},然后我比较纳闷的是为什么数组C有n+1个元素呢?而不是n个元素呢?

我按照我的这种理解写了一段c++代码:

// stdafx.cpp : 只包括标准包含文件的源文件
// jj.pch 将作为预编译头
// stdafx.obj 将包含预编译类型信息
#include "stdafx.h"
#include<iostream>
// TODO: 在 STDAFX.H 中
// 引用任何所需的附加头文件,而不是在此文件中引用
using namespace std;

//从二进制数中取相应的位的值 
int nbit_number(int original, int n) //参数:原二进制数,要取值的位(从低位开始,依次为1位,二位,三位....),
{
	int i;
	int divid = 1;
	for(i = 1; i <= n-1; i++)
	{
		divid *= 10;
	}

	original = original / divid;
	original = original - original/10*10;
	return original;
}

int binary_adding(int a, int b, int length) //参数:a、b为两个要相加的二进制数,length为二进制位数
{	
	int i;
	int *carry = new int[length+1];//进位,carry[1]为二进制数a、b的第1位数相加的进位,carry[0]不用
	int *result = new int[length+1];//两个二进制数0或1相加后的低位数,result[1]为a、b的第一位相加后和的低位,进位赋给carry[1]
	for(i = 0; i <= length; i++)
	{
		carry[i] = result[i] = 0;
	}

	int sum;
	for(i = 1; i <= length; i++)
	{

		sum = nbit_number(a,i)+nbit_number(b,i)+carry[i-1];
		//测试语句:cout<<sum<<" "<<nbit_number(a, i)<<" "<<nbit_number(b, i)<<" "<<carry[i-1]<<endl;
		switch(sum)
		{
		case 0: carry[i] = 0, result[i] = 0; break;//和为0
		case 1: carry[i] = 0, result[i] = 1; break;//和为1
		case 2: carry[i] = 1, result[i] = 0; break;//和为2
		default:carry[i] = 1; result[i] = 1; break;//和为3
		}

	}
	//测试语句
	/*for(i = 1; i <= length; i++)
	{
		cout<<carry[i]<<" "<<result[i]<<endl;
	}*/   
	
	int power_of_ten = 1;
	for(i = 1; i<= length; i++)
	{
		power_of_ten *= 10;
	}

	int real_result;
	real_result = carry[length] * power_of_ten ;
	for(i = length; i>=1; i--)
	{
		power_of_ten = power_of_ten/10;
		real_result += result[i]*power_of_ten;
	}

	return real_result;
}
																	

void main()
{
	cout<<binary_adding(110,111,3);
	int a;
	cin>>a;

}

在我写上面这段代码时,在设置类似长度为length+1的数组carry和result的时候,我开始直接使用:int  carry[length+1],其实是不对的,因为数组的长度必须是常量(虽然c98以后数组的长度可以变量,但vs2008编译不通过)。所以为了使用变量做数组长度换成了使用指针申请动态内存空间的方法。


后来在http://www.cnblogs.com/ghj1976/archive/2013/03/01/2939129.html上看到了对此题正确的翻译及解答:

问题翻译:有两个各存放在数组A和B中的二进制整数,考虑他们相加的问题。两个整数的和以二进制形式存放在具有(n+1)个元素的数组C中。

伪代码如下

BINARY-ADD(A, B, C)
    flag=0//需要进位的标记
    for j=1 to n
          key=A[j]+B[j]+flag
          C[j]=key mode 2
           flag=key/2


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值