/*himuti: a=a*b */
void himuti(hinum *a,hinum *b)
{int i,v,j,max1; char *p;
hinum ans,*ansp,b1,*b1p;
ansp=&ans;b1p=&b1;/*得到地址*/
hifirst(ansp);/*ans=0*/
higive1(b1p,b);/*b1=b*/
p=b1.num;
if(v=hichk(a))hichg(a);
if(hichk(b1p)){v=!v;hichg(b1p);}/*检查符号位并记录结果的符号位,如果为负换为它的相反数*/
max1=hicount(b);/*max1=b的值为1的最高位*/
for(i=0;i<=max1;i++) /*二进制乘法,类似于笔算竖式*/
{if((p[i>>3]>>(i&7))&1)hiadd(ansp,a);/*取出高精度数b的第i位,判断是否为1,为1则ans=ans+a*/
hileft1(a); /*a左移一位*/
}
if(v)hichg(ansp);/*结果为负*/
higive1(a,ansp);
}
/*hidiv: mod=a%b(a mod b),a=a/b*/
int hidiv(hinum *a,hinum *b,hinum *mod)
{int i,v,max1,max2,flag; char *p;
hinum ans,*ansp,b1,*b1p;
ansp=a;b1p=&b1; /*得到地址*/
higive1(b1p,b);
higive1(mod,a);
hifirst(ansp);
if(v=hichk(mod))hichg(mod);
if(hichk(b)){v=!v;hichg(b1p);}/*检查符号位并记录结果的符号位,如果为负换为它的相反数*/
max1=hicount(mod);
max2=hicount(b1p);/*取出位数*/
if(max1<max2){return 0;}/*除数的位数比被除数大*/
max1=max1-max2;
hileft(b1p,max1);/*数据对齐*/
flag=0;
for(i=0;i<max1;i++)/*加减交替法*/
{if(flag)hiadd(mod,b1p);/*flag=1:mod=mod-b1*/
else hicut(mod,b1p); /*flah=0:mod=mod+b1*/
flag=hichk(mod); /*mod>=0:flag=0;else:flag=1*/
hileft1(ansp); /*ans=ans<<1*/
if(!flag)hiadd1(ansp); /*flag=0:ans=ans+1*/
hiright1(b1p); /*b1=b1>>1*/
}
if(flag)hiadd(mod,b1p);
else hicut(mod,b1p);
flag=hichk(mod);
hileft1(ansp);
if(!flag)hiadd1(ansp);/*和循环体比少了hiright1*/
while(hichk(mod))/*求余数*/
hiadd(mod,b1p);
if(v)hichg(ansp);/*结果为负*/
return 0;}
/*oprate:运算函数,c为运算符号;对于'+','-','*':v=0结果存在a中,否则新见建一个结果空间,对于'/',a=a/b,返回余数*/
hinum *hioprate(hinum *a,hinum *b,char c,int v)
{hinum *p;
if(c=='/')/*除法*/
{p=hinew(1);
hidiv(a,b,p);
return p;}
if(v){p=hinew(0);higive1(p,a);}/*需要新建结果空间*/
else p=a;if(c=='+')hiadd(p,b);
if(c=='-')hicut(p,b);
if(c=='*')himuti(p,b);
return p;}
/****测试函数****/
/*hishow: 显示a的二进制*/
void hishow(hinum *a)
{int x,i,j;char *p;
p=a->num;for(i=MAXSIZE;i;i--){for(j=8;j;j--)
{x=(p[i-1]>>(j-1))&1;
printf("%d",x);
}
printf(",");
}
printf("\n");}
/*****************************************************/
[此贴子已经被作者于2005-4-9 17:01:36编辑过]
我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦