// test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <string.h>
//不同进制的长整数的加与乘只需要一个正确的加法表与正确的乘法表
//这里,加法表与乘法表都定义十位和个位,超过10进制的需要定义新的表,因为乘法表会有元素>两位数
typedef struct table
{
char unit;
char ten;
}table;
table** multiply[9];//0~8分别是二进制到十进制
table** add[9];//9种进制,每种进制加法表都10*10
void init(void);
char* Add(int code,char* a,char* b);
char* Multi(int code,char* a,char* b);
void show(char* output);
void init()//构建乘法表和加法表
{
for(int i=2;i<=10;i++)//从二进制到十进制
{
multiply[i-2] = new table*[i];
add[i-2] = new table*[i]; //new所有行
for(int j=0;j<i;j++)
{
multiply[i-2][j] = new table[i];//new一列
add[i-2][j] = new table[i];
for(int k=0;k<i;k++)
{
multiply[i-2][j][k].unit = (j*k)%i;
multiply[i-2][j][k].ten = (j*k)/i;
add[i-2][j][k].unit = (j+k)%i;
add[i-2][j][k].ten = (j+k)/i;
}
}
}
}
char* Add(int code,char* a,char* b)
{
char* output;
int alen = strlen(a);
int blen = strlen(b);
if(alen > blen)
return Add(code,b,a);
output = new char[blen+2];
output[blen+1] = '\0';
int k = blen;
char c = 0;
int j=blen-1;
for(int i=alen-1;i>=0;i--,j--)
{
int tempa = a[i]-'0';
int tempb = b[j]-'0';
output[k] = add[code-2][tempa][tempb].unit + c;
c = add[code-2][tempa][tempb].ten + output[k]/code;
output[k] = output[k]%code+'0';
k--;
}
for(;j>=0;j--)
{
int tempb = b[j]-'0';
output[k] = add[code-2][0][tempb].unit + c;
c = add[code-2][0][tempb].ten + output[k]/code;
output[k] = output[k]%code+'0';
k--;
}
if(c == 0)
{
output = output+1;
}
else
{
output[k] = c+'0';
}
return output;
}
/*char* Multi(int code,char* a,char* b) //事例1,通过加来实现乘法运算
{
int alen = strlen(a);
int blen = strlen(b);
if(alen < blen)
return Multi(code,b,a);
char* calculate="0";
int times=0;
int temp = 1;
for(int i=blen-1;i>=0 ;i--)
{
times += (b[i]-'0')*temp;
temp *= code;
}
for(int i=0;i<times;i++)
{
calculate = Add(code,calculate,a);
}
return calculate;
}*/
char* Multi(int code,char* a,char* b) //模拟真正的乘法过程
{
int alen = strlen(a);
int blen = strlen(b);
if(alen < blen)
return Multi(code,b,a);
char* output="0";
//output = new char[alen+blen+2];
int time = 0;//每次乘法之后都要加的偏移量。
for(int i=blen-1;i >= 0;i--)
{
char* temp = new char[alen+2+time];
for(int j = 0;j<time;j++)
{
temp[alen+1+j] = '0';
}
temp[alen+1+time] = '\0';
int k = alen;//标记临时的结果位置
int tempb = b[i]-'0';//记录此时b所处位置的值
char c = 0;
for(int j=alen-1; j >= 0;j--)
{
int tempa = a[j]-'0';
temp[k] = multiply[code-2][tempa][tempb].unit + c;
c = multiply[code-2][tempa][tempb].ten + temp[k]/code;
temp[k] = temp[k]%code + '0';
k--;
}
if(c == 0)
temp = temp+1;
else
temp[0] = c+'0';
output = Add(code,output,temp);
time++;
}
return output;
}
int _tmain(int argc, _TCHAR* argv[])
{
init();
char *a = "11";
char *b = "11";
char *output;
output=Multi(2,a,b);
//output = Add(2,a,b);
printf("%s*%s=%s\n",a,b,output);
getchar();
return 0;
}