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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章