• 大小: 34KB
    文件类型: .c
    金币: 1
    下载: 0 次
    发布日期: 2021-06-16
  • 语言: C/C++
  • 标签:

资源简介

本来开发计算器,发现要用到大数运算,于是写了本代码。包括大数的加减乘除,开方,包括浮点,符合处理。纯C语言,在VS2010上测试OK,未知BUG若干。

资源截图

代码片段和文件信息

#include 
#include 
#include 

/*
有符号的加减法可以转化为无符号的加减法
小数可以用扩大10^n的整数表示
*/

/****************定义变量*********/

#define THIS_MAXLEN 100  //数组长度 
#define SHOW_MAXLEN 50  //自我调整中使用的最大长度 
#define DIV_PREC   (THIS_MAXLEN-SHOW_MAXLEN)   // 除法精度相关,循环取商最大次数 ,50 对应开方 17 的有效位

#define RESULT_TYPE signed char
#define RESULT_OK 0
#define RESULT_ERR_MEM 1
#define RESULT_ERR_DIVZERO 2
#define RESULT_ERR_MINUS 3
#define RESULT_ERR_OVERLEN 4


typedef struct
{
    signed char len;//数据长度
    signed char *num;
} bignumbase_st;

typedef struct
{
  bignumbase_st baseT;
  signed char symbol;//正负0正,1负
  signed char exponent;//指数,10^e次方 
} bignumESB_st;


/**********************************声明函数**********************/
/*******声明全局函数********/
//有符号大数加法
RESULT_TYPE bigNumADD(bignumESB_st *const pdstconst bignumESB_st *paconst bignumESB_st *pb);
//有符号大数减法
RESULT_TYPE bigNumSUB(bignumESB_st *const pdstconst bignumESB_st *paconst bignumESB_st *pb);
//有符号大数乘法
RESULT_TYPE bigNumMUL(bignumESB_st *const pdstconst bignumESB_st *paconst bignumESB_st *pb);
//有符号大数除法
RESULT_TYPE bigNumDIV(bignumESB_st *const pdstconst bignumESB_st *paconst bignumESB_st *pb);
//根号2
RESULT_TYPE bigNumSQR(bignumESB_st *const pdstconst bignumESB_st *psrcconst signed char effec);

/*********声明内部函数********/

//无符号大数加法
static RESULT_TYPE nsbigADD(bignumESB_st *const pdstconst bignumESB_st *paconst bignumESB_st *pb);
//无符号大数减法
static RESULT_TYPE nsbigSUB(bignumESB_st *const pdstconst bignumESB_st *paconst bignumESB_st *pb);
//无符号大数乘法
static RESULT_TYPE nsbigMUL(bignumESB_st *const pdstconst bignumESB_st *paconst bignumESB_st *pb);
//无符号大数除法 
static RESULT_TYPE nsbigDIV(bignumESB_st *const pdstconst bignumESB_st *paconst bignumESB_st *pb);
//根号2
static RESULT_TYPE nsbigNumSQR(bignumESB_st *const pdstconst bignumESB_st *psrcconst signed char effec);

//比较数组代表的无符号整数的大小,a>b=1a=b=0astatic signed char arrcmp(const bignumbase_st *pa const bignumbase_st *pb );
//移动数组 改变长度 
static void bigNumTenfold(bignumbase_st *const pdstconst bignumbase_st *psrcconst signed char exponent);
//去掉末尾的所有chart,返回去掉的数目 
static signed char removeTailChart(signed char *pasigned char *plenconst char chart);
//去除开头的所有的字符chart返回去掉的数目 
static signed char removeHeadChart(signed char *pasigned char *plenconst char chart);
//调整结构体,不改变表示的值,使exponent尽量靠近0
static void bignumst_adjust(bignumESB_st *const pdstconst unsigned char maxlen) ;
//设置结构体代数的有效位数
static void bignumst_valeffec( bignumESB_st *const pdstconst signed char effec) ;
/**************************************定义函数*******************************/

//有符号大数加法
RESULT_TYPE  bigNumADD(bignumESB_st *const pdstconst bignumESB_st *paconst bignumESB_st *pb)
{
    RESULT_TYPE err;
    if( pa->symbol == pb->symbol)
    {
          err=nsbigADD( pdst pa pb);
        pdst->symbol = pa->symbol ;
    }else
    {
        if ( pa->symbol ==0 ) // 正 

评论

共有 条评论