无语
勤奋,踏实,在生活中学习,在学习中快乐……

    这几天开始学习算法,当然开始从最基本的学起。写了个简单的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;
}


    几点说明:
    1.由于本人是日文系统,不识别汉字,汉字是后来加上的,所以文中既有汉字又有英文,请谅解。
    2.代码中含有很多不规范的地方,这个得慢慢的改
    3.算法中肯定存在很多可优化的地方,希望大家提出来,共同提高。
posted on 2008-04-03 11:02  程、诚、成  阅读(3240)  评论(2编辑  收藏  举报