关键词不能为空

当前您在: 主页 > 英语 >

计算器算法原理

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-02-17 03:07
tags:

-

2021年2月17日发(作者:xmm)



计算器算法原理



除 法也用类似竖式的方法,从高位到低位逐一得出结果。大概过程如下:(注意,


是二进制 运算)



1


、先左移除数,直到除数不 小于被除数,同时记录移动的位数;



2


、开始循环,循环次数为前一步移动的位数加


1


< p>


3


、比较被除数与除数的大小,如果被除数不小 于除数,则该位结果为


1


,否则为


0< /p>




4


、除数右移一位,继续循环。



这种方法同样可以进行小数运算,根据需要的有效数字位数确定循环次数。

< br>



漏了一点,修改一下:


< /p>


3


、比较被除数与除数的大小,如果被除数不小于除数,则该位结 果为


1


,并把被除


数减去除数,否则为


0




加减乘除求余:



#include


#include


#include


#include


#define DEF_32


#ifdef DEF_32


typedef unsigned int uint;


const uint low_mask = 0xffff;


const uint hig_mask = 0xffff0000;


#else


typedef unsigned long long uint;


const uint low_mask = 0xffffffff;


const uint hig_mask = 0xffffffff00000000;


#endif


const uint alignment = 8;


struct _DATA_


...{






size_t capacity;//


容量







size_t len;//


使用的存储单元







uint *p;//


内容



};


typedef struct _DATA_ BigNumber;


typedef BigNumber* BigNumberPtr;


BigNumberPtr NewBigNumber(size_t len );


BigNumberPtr CopyNewBigNumber(BigNumberPtr p);


void CopyBigNumber(BigNumberPtr o,BigNumberPtr n);




BigNumberPtr ResizeBigNumber(BigNumberPtr p, size_t len );


void DestoryBigNumber(BigNumberPtr p);


void printBigNum( BigNumberPtr p );


void printBinBigNum( BigNumberPtr p );


int Borrow( uint* p , size_t len );//


借位



BigNumberPtr Carry(BigNumberPtr p);//


处理进位



BigNumberPtr RightShiftBigNumber(BigNumberPtr p, size_t pos );//


右移



BigNumberPtr LeftShiftBigNumber(BigNumberPtr p, size_t pos );//


左移



BigNumberPtr Multiply(BigNumberPtr ap,BigNumberPtr bp);//


乘法



BigNumberPtr Add(BigNumberPtr l,BigNumberPtr r);//


大数加法



BigNumberPtr AddNumber(BigNumberPtr l,uint n);//


加法


2


BigNumberPtr Sub(BigNumberPtr l,BigNumberPtr r);//


大数减法



BigNumberPtr SubThis(BigNumberPtr l,BigNumberPtr r);//


BigNumberPtr SubNumber(BigNumberPtr l,uint n);//


减法



BigNumberPtr DivideAndRemainder(BigNumberPtr l,BigNumberPtr r,BigNumberPtr


































Remainder);//


除法< /p>


,


最后参数为余数


,

返回值为结果



size_t GetBitNum(uint n);


int main()


...{






int i=0;






const int test_len = 127;






BigNumberPtr l = NewBigNumber( test_len+1 );






BigNumberPtr r = NewBigNumber( test_len );






BigNumberPtr pRemainder =



NewBigNumber( test_len );






BigNumberPtr pRet = NULL;






srand( (unsigned int)time(NULL) );






for(i=0;i










l->p[i] = (rand()*rand())&low_mask;










r->p[i] = (rand()*rand())&low_mask;






}






l->p[i] = (rand()*rand())&low_mask;






printBigNum( l );






printBigNum( r );






pRet = DivideAndRemainder( l



, r , pRemainder);






if( pRet )...{










printf(













printf(


余数












DestoryBigNumber(pRet);










pRet = NULL;






}






DestoryBigNumber(pRemainder);






pRet = Multiply( l , r );






printf(









DestoryBigNumber(pRet);








pRet = NULL;






pRet = Sub( l , r );






if( pRet )...{










printf(













DestoryBigNumber(pRet);










pRet = NULL;






}






pRet = Add( l , r );






printf(









DestoryBigNumber(pRet);






pRet = NULL;






DestoryBigNumber(l);






DestoryBigNumber(r);






return 0;


}


BigNumberPtr NewBigNumber(size_t len )


...{






BigNumberPtr pRet = (BigNumberPtr)malloc( sizeof(BigNumber) );






pRet->len = len;






pRet->capacity = (len/alignment+1)*alignment;






pRet->p = (uint*)malloc( (size_t)(pRet->capacity*sizeof(uint)) );






memset( pRet->p , 0 , (size_t)(sizeof(uint)*(pRet->capacity) ) );






return pRet;


}


BigNumberPtr CopyNewBigNumber(BigNumberPtr p)


...{






BigNumberPtr pRet = (BigNumberPtr)malloc( sizeof(BigNumber) );






pRet->len = p->len;






pRet->capacity = p->capacity






pRet->p = (uint*)malloc( (size_t)(p->capacity*sizeof(uint)) );






memcpy( pRet->p , p->p , (size_t)(sizeof(uint)*pRet->capacity) );






return pRet;


}


BigNumberPtr ResizeBigNumber(BigNumberPtr p,size_t len )


...{






if( len > p->len )...{










if( p->capacity >=len )...{














memset( &(p->p[p->len]) , 0 ,(size_t)(sizeof(uint)*(p->capacity - p->len)) );














p->len = len










}else...{














BigNumberPtr pRet = NewBigNumber( len );














memcpy( pRet->p , p->p ,(size_t)(p->len*(sizeof(uint))) );














DestoryBigNumber( p );














return pRet;












}






}else if(len == p->len )










;






else










p->len = len






return p;


}


void CopyBigNumber(BigNumberPtr o,BigNumberPtr n)


...{






if( n->capacity >= o->len )...{










memcpy( n->p , o->p , (size_t)(o->len*sizeof(uint))



);










n->len = o->len;






}else...{










free( n->p );










n->p = (uint*)malloc( (size_t)(o->capacity*sizeof(uint))










n->capacity = o->capacity;










n->len = o->len;










memcpy( n->p , o->p , (size_t)(o->len*sizeof(uint))



);






}


}


void DestoryBigNumber(BigNumberPtr p)


...{






if( p )...{










if(p->p)














free( p->p );










free( p );






}


}


BigNumberPtr RemoveHigZero(BigNumberPtr p)


...{






while(0 == p->p[p->len-1])










p->len--;






if( 0 == p->len)










p->len=1;






return p;


}


BigNumberPtr Multiply(BigNumberPtr l,BigNumberPtr r)


...{






BigNumberPtr pRet = NewBigNumber( l->len + r->len );






BigNumberPtr pTemp = NewBigNumber( 1 + r->len );






uint i=0,j=0;






for( i=0 ilen i++)...{










for( j=0 jlen j++)














pTemp->p[j] = l->p[i]*r->p[j];



);












Carry( pTemp );










for( j=0 j< r->len+1 j++ )














pRet->p[i+j] += pTemp->p[j];










memset( pTemp->p , 0 , (size_t)(pTemp->len*sizeof(uint)) );










Carry( pRet );






}






DestoryBigNumber(pTemp);






return RemoveHigZero( pRet );


}


BigNumberPtr RightShiftBigNumber(BigNumberPtr p, size_t pos )


...{






size_t n = pos/(sizeof(uint)*4);






uint temp = 0






size_t j=0;






pos %= (sizeof(uint)*4);






if( n >0 )...{










p->len -= n










memcpy( p->p , p->p+n



, (size_t)(sizeof(uint)*(p->len)) );






}






if( 0 == pos )










return RemoveHigZero( p );






if( 1 == p->len )...{










p->p[0]>>=pos;






}else...{










for( j=0 j< p->len -1 j++)...{














temp = p->p[j+1] & low_mask














p->p[j] |= temp<<( sizeof(uint)*4 );














p->p[j]>>=pos;














p->p[j] &= low_mask;










}










p->p[j]>>=pos;






}






return RemoveHigZero( p );


}


BigNumberPtr LeftShiftBigNumber(BigNumberPtr p, size_t pos )


...{






const size_t n = pos/(sizeof(uint)*4);






const size_t org_len = p->len;






int temp = 0;






p = ResizeBigNumber( p , p->len + n + 1 );






pos %= (sizeof(uint)*4);






if( n > 0 )...{










for(temp=(int)org_len-1; temp>=0 temp-- )














p->p[temp+n] = p->p[temp];












memset( p->p , 0 , sizeof(uint)*n)






}






if( pos > 0 )...{










for(temp = 0



; temp < (int)p->len temp++ )














p->p[temp]<<=pos;










Carry( p );






}






return RemoveHigZero( p );


}


BigNumberPtr Add(BigNumberPtr l,BigNumberPtr r)


...{






BigNumberPtr pRet = NULL;






uint i=0;






size_t len=0;






if( l->len > r->len )










len = l->len;






else










len = r->len;






pRet = NewBigNumber( len + 1 );






for(i=0; i< len i ++)










pRet->p[i] = l->p[i] + r->p[i];






Carry( pRet );






return RemoveHigZero( pRet );


}


BigNumberPtr AddNumber(BigNumberPtr l,uint n)


...{






l->p[0] += n;






return Carry( l );


}


BigNumberPtr Sub(BigNumberPtr l,BigNumberPtr r)


...{






BigNumberPtr pRet = CopyNewBigNumber( l );






size_t i = 0;






for( i =0 i < pRet->len i++)...{










if( pRet->p[i] >= r->p[i] )














pRet->p[i] = pRet->p[i] - r->p[i];










else














if( Borrow( &(pRet->p[i]) , pRet->len-i ) )


















pRet->p[i] = pRet->p[i] - r->p[i];














else...{


















DestoryBigNumber( pRet );


















return 0;














}






}


-


-


-


-


-


-


-


-



本文更新与2021-02-17 03:07,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/660812.html

计算器算法原理的相关文章

  • 余华爱情经典语录,余华爱情句子

    余华的经典语录——余华《第七天》40、我不怕死,一点都不怕,只怕再也不能看见你——余华《第七天》4可是我再也没遇到一个像福贵这样令我难忘的人了,对自己的经历如此清楚,

    语文
  • 心情低落的图片压抑,心情低落的图片发朋友圈

    心情压抑的图片(心太累没人理解的说说带图片)1、有时候很想找个人倾诉一下,却又不知从何说起,最终是什么也不说,只想快点睡过去,告诉自己,明天就好了。有时候,突然会觉得

    语文
  • 经典古训100句图片大全,古训名言警句

    古代经典励志名言100句译:好的药物味苦但对治病有利;忠言劝诫的话听起来不顺耳却对人的行为有利。3良言一句三冬暖,恶语伤人六月寒。喷泉的高度不会超过它的源头;一个人的事

    语文
  • 关于青春奋斗的名人名言鲁迅,关于青年奋斗的名言鲁迅

    鲁迅名言名句大全励志1、世上本没有路,走的人多了自然便成了路。下面是我整理的鲁迅先生的名言名句大全,希望对你有所帮助!当生存时,还是将遭践踏,将遭删刈,直至于死亡而

    语文
  • 三国群英单机版手游礼包码,三国群英手机单机版攻略

    三国群英传7五神兽洞有什么用那是多一个武将技能。青龙飞升召唤出东方的守护兽,神兽之一的青龙。玄武怒流召唤出北方的守护兽,神兽之一的玄武。白虎傲啸召唤出西方的守护兽,

    语文
  • 不收费的情感挽回专家电话,情感挽回免费咨询

    免费的情感挽回机构(揭秘情感挽回机构骗局)1、牛牛(化名)向上海市公安局金山分局报案,称自己为了挽回与女友的感情,被一家名为“实花教育咨询”的情感咨询机构诈骗4万余元。

    语文