iNelly 2015-06-16 14:02 采纳率: 0%
浏览 1676

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

这段程序中 语句

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条回答

  • lx624909677 2015-06-16 14:15
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试
  • ¥20 问题请教!vue项目关于Nginx配置nonce安全策略的问题
  • ¥15 教务系统账号被盗号如何追溯设备
  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
  • ¥15 再不同版本的系统上,TCP传输速度不一致
  • ¥15 高德地图2.0 版本点聚合中Marker的位置无法实时更新,如何解决呢?
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题