2 inelly iNelly 于 2015.06.16 22:02 提问

求问高精度算法内语句的意思?

这段程序中 语句

if(b1[0]==45) { an--; fa=-1;ai=0;} /*判断数组的符号 */

if(b2[0]==45) { bn--; fb=-1;bi=0;} 是什么意思求大神讲解谢谢

#include

#include

#include

#include

int an,bn,fa=1,fb=1; /* 把an,bn,k设为全局变量,an纪录第一个高精度数组的位数,bn纪录第二个高精度数组的位数,k纪录输出结果的位数*/

char b1[250], b2[250]; /*纪录需要计算的两个高精度数据 /

int subtraction(int a[],int b[],int q);

void input(int a1[],int a2[]) /
函数input为输入函数,用来纪录两个待计算的高精度数据,以数组首地址为参数.以实现返回两个高精度数据*/

{

int i,ai=1,bi=1;  
scanf ( "%s%s", b1, b2 );                      /*输入两个高精度数据 */  
an = strlen( b1 );                             /*an纪录b1的位数 */  
bn = strlen( b2 );                            /*bn纪录b2的位数 */  
if(b1[0]==45) { an--; fa=-1;ai=0;}           /*判断数组的符号 */  
if(b2[0]==45) { bn--; fb=-1;bi=0;}  
for (i=0; i<an; i++,ai++) {a1[i]=b1[an-ai]-'0'; printf("%d",a1[i]);}     /*把字符形数据b1转为整数形数据,同样用数组纪录 */  
for (i=0; i<bn; i++,bi++) a2[i]=b2[bn-bi]-'0';    /* 同上  */  
return;  

}

void addition(int a[],int b[],int q) /*高精度加法运算*/

{

int i,c[251]={0},k;

if(fa*fb>0||q)

{

if(an>bn) k=an;

else k=bn; /*用k纪录结果的最小位数*/

for(i=0;i {
c[i]=a[i]+b[i]+c[i];
c[i+1]=(int)c[i]/10;
c[i]=(int)c[i]%10;
} /*高精度加法运算过程*/
if(c[k]) k++; /*判断最后结果的位数*/
if(fa for(i=k-1;i>=0;i--) printf("%d",c[i]); /*输出结果*/

return;

}

else subtraction(a,b,1);

return;

}

int subtraction(int a[],int b[],int q) /*高精度减法运算*/

{

int i,f=0,c[251]={0},k;

if(fa*fb>0||q)

{

if(an>bn) k=an;

else /*用k纪录结果的最大位数*/

{ k=bn;

for(i=k;a[i]<=b[i]&&i>=0;i--)

if(a[i]<b[i]) f=1; /*f纪录结果符号*/

}

    if(!f)                                /*高精度减法运算过程*/  
     for(i=0;i<k;i++)  
     {  
         if(a[i]<b[i])  
         {     a[i+1]--;  
               a[i]+=10;  
        }  
        c[i]=a[i]-b[i];  
      }  
    else                                         /*当a<b时的处理*/  
      for(i=0;i<k;i++)  
        {  
           if(b[i]<a[i])  
           {   b[i+1]--;  
              b[i]+=10;  
           }  
           c[i]=b[i]-a[i];  
         }  
    while(!c[k-1]&&k>1) k--;                  /*判断最后结果的位数*/  
    if(q&&(fa>0&&f||fa<0&&!f)||fa>0&&(fb>0&&!f||f&&!q)) printf("-");                      /*如果f为真是输出负号*/  
    for(i=k-1;i>=0;i--) printf("%d",c[i]);  
    return 0;  
}  
else addition(a,b,1);  

}

void multiplication( int a[], int b[]) /*高精度乘法运算*/

{

int i, j, c[501] = {0},k;

k = an + bn - 1; /*用k纪录结果的最大位数*/

for(i = 0; i < an; i++) /*高精度乘法运算过程*/

for(j = 0;j < bn; j++)

{

c[i+j] = a[i] * b[j] + c[i+j];

c[i+j+1] = c[i+j] / 10 + c[i+j+1];

c[i+j] = c[i+j] % 10;

}

while(!c[k]) k--; /*判断最后结果的位数*/

if(fa*fb for(i = k; i >= 0; i--) printf("%d",c[i]); /*输出结果*/

}

main()

{

int a[250]={0},b[250]={0};

input(a,b);

printf("\n%s+%s=",b1,b2);addition(a,b,0);

printf("\n%s-%s=",b1,b2);subtraction(a,b,0);

printf("\n%s*%s=",b1,b2);multiplication(a,b);

getchar();

}

5个回答

devmiao
devmiao   Ds   Rxr 2015.06.16 22:45

说白了,这里高精度计算用字符串表示数字,而用人手算的方法模拟计算的思路。
45就是ascii代码的'0'

lx624909677
lx624909677   Ds   Rxr 2015.06.16 22:15

先自己看看,哪儿看不懂了提出来问,直接发代码很少有人能完全看完后给你解释

gamefinity
gamefinity   Rxr 2015.06.17 06:47

45是ASCII的'-'。
b1和b2是两个字符串,用来模拟两个大数字(高精度数字),如果首位是'-'的话,说明这个数字是负数.
fa,fb是计算时的符号表示,所以标成-1;
an,bn是字符串长度,因为已经盘断了首位是'-'.所以长度相应的就-1了
ai,bi是数字的首位置,个人感觉在判断负号后应该置为1,而非0

q3733353520
q3733353520   2015.06.17 18:36

if(b2[0]==45) { bn--; fb=-1;bi=0;} 是什么意思求大神讲解谢谢 //和第一排一样不过是另一个数

dominating413421391
dominating413421391   2015.06.16 23:19

高精度计算,就是模拟笔算的过程

Csdn user default icon
上传中...
上传图片
插入图片