大数运算之加法(C & ActionScript实现)
C语言版在后面的帖子里可以进行和不大与100位的整数加法运算
(从数字逻辑课上的全加器得到启发)
函数:fullAdd(a,b,c)全加函数,返回一 Object {s:0 ,c:0}
hiAdd(a:String,b:String)为运算接口
实现小数算法也不是很难,只要加几个判断即可
减法,乘法,除法,都可以用数字逻辑上的原理来实现
/* 高精度算法
(从数字逻辑课上的全加器得到启发)
函数:fullAdd(a,b,c)全加函数,返回一 Object {s:0 ,c:0}
hiAdd(a:String,b:String)为运算接口
实现小数算法也不是很难,只要加几个判断即可
减法,乘法,除法,都可以用数字逻辑上的原理来实现*/
//var fullAddRet:Object = {s:0, c:0};
//trace(typeof(fullAddRet));
_global.sum=new Array(100);
var tmp:Object = {s:0, c:0};
function fullAdd(a:Number, b:Number, c:Number)
{
trace("a:"+a+" b:"+b+"c"+c);
a=Number(a);
b=Number(b);
s = a + b+c;
c = (s - s % 10)/10;
s %= 10;
tmp.s = s;
tmp.c = c;
trace("IN FULLADD S="+s);
trace("IN FULLADD C="+c);
}
function hiAdd(a, b)
{
trace("a:"+a+" b:"+b);
if (isNaN(Number(a)) or isNaN(Number(b)))
{
trace("a or b is not a Number!");
return 0;
}
trace(Number(a));
aLen = length(a);
bLen = length(b);
if (aLen != bLen)
{
if(aLen<bLen){
atmp=aLen;aLen=bLen;bLen=atmp;
atmp=a;a=b;b=atmp;
}
for(i=0;i<aLen-bLen;i++){b="0"+b;}
}
trace("b:"+b);
_global.b=b;
cRet=0;sRet=0;
trace("bLen:"+bLen);
trace("aLen:"+aLen)
for(i=0;i<aLen;i++){
pos=-(i+1);
ap=a.substr(pos,1);bp=b.substr(pos,1)
fullAdd(ap,bp,cRet);
//trace(tmp.s+" "+tmp.c)
_global.sum=tmp.s;
trace("sum[]="+sum)
cRet=tmp.c;
//trace("TMP.C="+tmp.c);
}
/*for(;i<aLen;i++){
pos=-(i+1);
ap=a.substr(pos,1);
fullAdd(ap,0,cRet);
_global.sum=cRet+tmp.s;
trace("just a sum[]="+sum);
cRet=tmp.c;
}*/
//trace("cRet:"+cRet)
if(cRet!=0){
_global.sum=cRet;
aLen++;
trace(aLen);
}
return aLen;
}
_global.a="5502332434454353453454325324544345344353455345453543534534534532034";
_global.b="5505243545354353452436264554453453453453345453345345353245345345046";
lens=hiAdd(a,b);
var p:String=new String("");
for(i=0;i<lens;i++){
trace(_global.sum);
p=p+String(_global.sum);
}
trace(" "+a);
trace(" + "+b);
trace("---------------------------------------------------------------------------------");
trace(" = "+p)
/*****************************************************
* *
* 加法终于完成了! *
* *
******************************************************/
[ 本帖最后由 iptton 于 2007-4-21 23:18 编辑 ] 楼主给点较详细的注释比较好吧,不懂ActionScript,但应该和JS相似.如果有注释,阅读难度会低些
[ 本帖最后由 powerwind 于 2006-6-10 12:26 编辑 ] Actionscript和Javascript同属ECMAScript, 都是基于prototype的脚本. 其实大部分"类"还是差不多的. 没用过ActionScript,
LZ可以把那程序翻译成C程序或C++程序或Java程序贴出来吗?
期待中...
C语言版
使用方法:输入两个数,用空格格开没有对输入进行检测
#include <stdio.h>
typedef struct cs
{
char c;
char s;
}Tcs;
main()
{
char a,b,s;
void fAdd(char ,char,Tcs*);
void hiAdd(char *,char *);
printf("Type two Number ");
scanf("%s %s",a,b);
hiAdd(a,b);
getch();
return 0;
}
void hiAdd(char *a,char *b)
{
char i=0,tmpa,tmpb;int aLen,bLen,maxLen,sum;
Tcs tmpT={'0','0'};memset(sum,'0',102*sizeof(char));
aLen=strlen(a);bLen=strlen(b);
maxLen=(aLen>bLen)?aLen:bLen;
do
{
tmpa=a[--aLen];
tmpb=b[--bLen];
if(aLen<0)tmpa='0';
if(bLen<0)tmpb='0';
fAdd(tmpa,tmpb,&tmpT);
sum=tmpT.s;
}while(maxLen--);
if(tmpT.c)sum=tmpT.c;
printf("The result is:"); for(;i>0;i--)printf("%c",sum);
}
void fAdd(char a,char b,Tcs * t)
{
int s;
a-=48;b-=48;(t->c)-=48;/*将字符的 0 ~9 转换为数字的 0 ~ 9 貌似有个专门的函数有这功能 - -# atoi() */
s=a+b+(t->c);
t->s=s%10+48;
t->c=s/10+48;
}
[ 本帖最后由 iptton 于 2006-11-13 22:34 编辑 ]
页:
[1]