这几天开始学习算法,当然开始从最基本的学起。写了个简单的c语言实现的高精度加法。
主要的算法思想是:将加数和被加数存入整型数组中,按从高到低位的顺序存储。将结果存入另一整型数组中。相加时,从低位开始,向高位移动。做了两点简单的优化:
1.考虑到节省空间的问题,每一位存储了4bits,因为整型在多数机子上都是占4个字节。我将类型相关的都做了定义,扩展起来比较方便。
2.考虑用户输入输出的方便,输入时,按字符串输入,然后转存在数组中。输出是,要注意结果补足4位,不足的前面补0。
下面是代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define MAX 100
#define BASE 4 /*int can stores 4 bit*/
/*此类型可以更改,但更改时要将BASE改为相应的字节数*/
typedef int ArrayType;
/* 将字符串按4位从后开始分段,存入数组中 */
int charToNum(char * s,ArrayType a[])
{
int len=strlen(s);
int i=0;
char temp[BASE+1]="\0";
do{
if(len>=BASE)
{
strcpy(temp,&s[len-BASE]);
s[len-BASE]='\0';
}
else
{
strcpy(temp,s);
}
len-=BASE;
a[i++]=atoi(temp);
}while(len>0);
return i;
}
/**
Description: Add a[] And b[] by bit
Arguments:Stores result to Array[] sum
Returns:the length of sum[]
*/
int Add(ArrayType a[],ArrayType b[],int len_a,int len_b,ArrayType sum[])
{
int len= (len_a >= len_b ? len_a : len_b ); //计算长度为较长的数组
int i;
int jinwei; //进位标志
if(len_a>len_b)
{
for(i=len_b;i<len_a;i++)
b[len_b]= 0 ;
}
else if(len_a < len_b)
{
for(i=len_a;i<len_b;i++)
a[len_a]= 0 ;
}
i=0 ;
jinwei=0;
while(i<len)
{
sum[i] = ( a[i]+b[i] )%(int)pow(10,BASE) + jinwei ;
jinwei = ( a[i]+b[i] )/(int)pow(10,BASE) ;
i++;
}
if( jinwei != 0 )
sum[i]=jinwei;
else
i--;
return i;
}
int main()
{
char operNum1[4*MAX-1],operNum2[4*MAX-1];
ArrayType a[MAX],b[MAX],sum[MAX+1];
int len_a=0,len_b=0,i;
printf("Please input two string :");
scanf("%s%s",operNum1,operNum2);
printf("\n");
len_a=charToNum(operNum1,a);
len_b=charToNum(operNum2,b);
i=Add(a,b,len_a,len_b,sum);
printf("%d",sum[i--]);
while(i>=0)
printf("%04d",sum[i--]);
printf("\n");
return 0;
}
#include<stdlib.h>
#include<math.h>
#define MAX 100
#define BASE 4 /*int can stores 4 bit*/
/*此类型可以更改,但更改时要将BASE改为相应的字节数*/
typedef int ArrayType;
/* 将字符串按4位从后开始分段,存入数组中 */
int charToNum(char * s,ArrayType a[])
{
int len=strlen(s);
int i=0;
char temp[BASE+1]="\0";
do{
if(len>=BASE)
{
strcpy(temp,&s[len-BASE]);
s[len-BASE]='\0';
}
else
{
strcpy(temp,s);
}
len-=BASE;
a[i++]=atoi(temp);
}while(len>0);
return i;
}
/**
Description: Add a[] And b[] by bit
Arguments:Stores result to Array[] sum
Returns:the length of sum[]
*/
int Add(ArrayType a[],ArrayType b[],int len_a,int len_b,ArrayType sum[])
{
int len= (len_a >= len_b ? len_a : len_b ); //计算长度为较长的数组
int i;
int jinwei; //进位标志
if(len_a>len_b)
{
for(i=len_b;i<len_a;i++)
b[len_b]= 0 ;
}
else if(len_a < len_b)
{
for(i=len_a;i<len_b;i++)
a[len_a]= 0 ;
}
i=0 ;
jinwei=0;
while(i<len)
{
sum[i] = ( a[i]+b[i] )%(int)pow(10,BASE) + jinwei ;
jinwei = ( a[i]+b[i] )/(int)pow(10,BASE) ;
i++;
}
if( jinwei != 0 )
sum[i]=jinwei;
else
i--;
return i;
}
int main()
{
char operNum1[4*MAX-1],operNum2[4*MAX-1];
ArrayType a[MAX],b[MAX],sum[MAX+1];
int len_a=0,len_b=0,i;
printf("Please input two string :");
scanf("%s%s",operNum1,operNum2);
printf("\n");
len_a=charToNum(operNum1,a);
len_b=charToNum(operNum2,b);
i=Add(a,b,len_a,len_b,sum);
printf("%d",sum[i--]);
while(i>=0)
printf("%04d",sum[i--]);
printf("\n");
return 0;
}
几点说明:
1.由于本人是日文系统,不识别汉字,汉字是后来加上的,所以文中既有汉字又有英文,请谅解。
2.代码中含有很多不规范的地方,这个得慢慢的改
3.算法中肯定存在很多可优化的地方,希望大家提出来,共同提高。