习题是这个样子的:
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