工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 3350|回复: 5

大数运算之加法(C & ActionScript实现)

[复制链接]
发表于 2006-6-8 18:53 | 显示全部楼层 |阅读模式
C语言版在后面的帖子里

可以进行和不大与100位的整数加法运算

(从数字逻辑课上的全加器得到启发)
函数:fullAdd(a,b,c)全加函数,返回一 Object {s:0 ,c:0}
            hiAdd(a:String,b:String)为运算接口
           实现小数算法也不是很难,只要加几个判断即可
            
          减法,乘法,除法,都可以用数字逻辑上的原理来实现


[code]/* 高精度算法
(从数字逻辑课上的全加器得到启发)
函数: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[lens-1-i]);
p=p+String(_global.sum[lens-1-i]);
}
trace(" "+a);
trace(" + "+b);
trace("---------------------------------------------------------------------------------");
trace(" = "+p)


/*****************************************************
* *
* 加法终于完成了! *
* *
******************************************************/ [/code]

[[i] 本帖最后由 iptton 于 2007-4-21 23:18 编辑 [/i]]
发表于 2006-6-10 12:23 | 显示全部楼层
楼主给点较详细的注释比较吧,不懂ActionScript,但应该和JS相似.如果有注释,阅读难度会低些

[ 本帖最后由 powerwind 于 2006-6-10 12:26 编辑 ]
回复

使用道具 举报

发表于 2006-6-10 19:32 | 显示全部楼层
Actionscript和Javascript同属ECMAScript, 都是基于prototype的脚本.
回复

使用道具 举报

发表于 2006-6-10 19:34 | 显示全部楼层
其实大部分"类"还是差不多的.
回复

使用道具 举报

发表于 2006-6-11 01:43 | 显示全部楼层
没用过ActionScript,
LZ可以把那程序翻译成C程序或C++程序或Java程序贴出来吗?
期待中...
回复

使用道具 举报

 楼主| 发表于 2006-6-12 22:30 | 显示全部楼层

C语言版

使用方法:输入两个数,用空格格开

没有对输入进行检测


  1. #include <stdio.h>
  2. typedef struct cs
  3. {
  4.   char c;
  5.   char s;
  6. }Tcs;
  7. main()
  8. {
  9.   char a[100],b[100],s[101];
  10.   void fAdd(char ,char,Tcs*);
  11.   void hiAdd(char *,char *);
  12.   printf("Type two Number ");
  13.   scanf("%s %s",a,b);
  14.   hiAdd(a,b);
  15.   getch();
  16.   return 0;
  17. }
  18. void hiAdd(char *a,char *b)
  19. {
  20.   char i=0,tmpa,tmpb;int aLen,bLen,maxLen,sum[102];

  21.   Tcs tmpT={'0','0'};memset(sum,'0',102*sizeof(char));
  22.   aLen=strlen(a);bLen=strlen(b);
  23.   maxLen=(aLen>bLen)?aLen:bLen;
  24.   do
  25.   {
  26.     tmpa=a[--aLen];
  27.     tmpb=b[--bLen];
  28.     if(aLen<0)tmpa='0';
  29.     if(bLen<0)tmpb='0';
  30.     fAdd(tmpa,tmpb,&tmpT);
  31.     sum[i++]=tmpT.s;
  32.   }while(maxLen--);
  33.   if(tmpT.c)sum[i]=tmpT.c;
  34.   printf("The result is:"); for(;i>0;i--)printf("%c",sum[i-1]);

  35. }
  36. void fAdd(char a,char b,Tcs * t)
  37. {
  38.   int s;
  39.   a-=48;b-=48;(t->c)-=48;/*  将字符的 0 ~9 转换为数字的 0 ~ 9 貌似有个专门的函数有这功能 - -# atoi()   */
  40.   s=a+b+(t->c);
  41.   t->s=s%10+48;
  42.   t->c=s/10+48;
  43. }
复制代码

[ 本帖最后由 iptton 于 2006-11-13 22:34 编辑 ]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2025-5-15 00:41

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表