//例如:100011 1011101//程序中先輸入被乘數和乘數的位數,然後動態申請空間,以字符的形式來處理長整數的每壹位。//模擬計算機乘法的實現,將整數乘法轉換為整數加法來實現。#include <stdio.h>//將數組元素左移x位,低位補0
void leftmove(char c[],int len,int x)
{
if(x==0)
return ;
else
{
for(int i=0;i<x;i++)
c[i+len]='0';
}
}//將數組元素右移x位,高位補0
void rightmove(char c[],int& len,int x)
{
if(x==0)
return ;
else
{
for(int i=len-1;i>=0;i--)
{
c[i+x]=c[i];
}
for(int j=0;j<x;j++)
{
c[j]='0';
}
}
len+=x;
}//模擬計算機計算兩個數的乘法,通過將數組左移或右移,然後各位相加,得到乘積
void add(char a[],char s[],int& len)
{
int i;
int c=0; //進位
int temp;
for(i=len-1;i>=0;i--)
{
temp=(a[i]-'0')+(s[i]-'0')+c;
if(temp==1)
{
s[i]='1';
c=0;
}
if(temp==2)
{
s[i]='0';
c=1;
if(i==0)
{
for(int j=len-1;j>=0;j--) //最高位有進位
{
s[j+1]=s[j];
}
s[j+1]='1';
len+=1;
}
} }
}
int main()
{
int length,i;
printf("請輸入被乘數、乘數的位數:\n");
int n1,n2;
scanf("%d%d",&n1,&n2);
char* a=new char[n1]; //被乘數
char* b=new char[n2]; //乘數 char* s=new char[n1+n2]; //積
for(i=0;i<n1+n2;i++) //初始化為0
s[i]='0'; length=n1;
printf("請輸入被乘數、乘數(二進制表示):\n");
scanf("%s%s",a,b);
for(i=n2-1;i>=0;i--)
{
if((b[i]-'0')==1)
{
leftmove(a,n1,n1-1-i); //若為1,將數組a左移i位,低位補0
rightmove(s,length,n2-i-1); //將s數組右移i位,高位補0
add(a,s,length); ///將數組a各位+到s上。
}
}
for(int j=0;j<length;j++)
printf("%c",s[j]);
printf("\n"); return 0;
}