问题描述
- 求问高精度算法内语句的意思?
- 这段程序中 语句
if(b1[0]==45) { an--; fa=-1;ai=0;} /*判断数组的符号 */
if(b2[0]==45) { bn--; fb=-1;bi=0;} 是什么意思求大神讲解谢谢
#include
#include
#include
#include
int anbnfa=1fb=1; /* 把anbnk设为全局变量an纪录第一个高精度数组的位数bn纪录第二个高精度数组的位数k纪录输出结果的位数*/
char b1[250] b2[250]; /*纪录需要计算的两个高精度数据 /
int subtraction(int a[]int b[]int q);
void input(int a1[]int a2[]) /函数input为输入函数用来纪录两个待计算的高精度数据以数组首地址为参数.以实现返回两个高精度数据*/
{
int iai=1bi=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 ic[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(ab1);
return;
}
int subtraction(int a[]int b[]int q) /*高精度减法运算*/
{
int if=0c[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(ab1);
}
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(ab);
printf(""n%s+%s=""b1b2);addition(ab0);
printf(""n%s-%s=""b1b2);subtraction(ab0);
printf(""n%s*%s=""b1b2);multiplication(ab);
getchar();
}
解决方案
说白了,这里高精度计算用字符串表示数字,而用人手算的方法模拟计算的思路。
45就是ascii代码的'0'
解决方案二:
先自己看看,哪儿看不懂了提出来问,直接发代码很少有人能完全看完后给你解释
解决方案三:
45是ASCII的'-'。
b1和b2是两个字符串,用来模拟两个大数字(高精度数字),如果首位是'-'的话说明这个数字是负数.
fafb是计算时的符号表示所以标成-1;
anbn是字符串长度因为已经盘断了首位是'-'.所以长度相应的就-1了
aibi是数字的首位置个人感觉在判断负号后应该置为1而非0
解决方案四:
if(b2[0]==45) { bn--; fb=-1;bi=0;} 是什么意思求大神讲解谢谢 //和第一排一样不过是另一个数
解决方案五:
高精度计算,就是模拟笔算的过程