我写了RQNOJ上的a*b,必须用压位高精,但又没写过。
所以写写试了一下,但有问题。
请大牛看看,或给我一些代码看看。
谢谢。
下面是我的代码:
#include"stdio.h"
#include"string.h"
char aa[10000],bb[10000];
long long fa=0,fb=0,ra=0,rb=0,ff=0;
long long a[10000],b[10000],c[10000],lc;
long long n,i,j;
void change()
{
long long q,w,s,s1;
q=n-1; // 控制位数
w=0; // 每9位进位
s=0; // 记下a[]每位的值
s1=1; // 处理数值进制问题
while(q>=fa) // 对aa进行处理,q为位数
{
s+=(aa[q]-'0')*s1; // 加上每位数
s1*=10; // 处理进制
if(w==3 || q==0) // 进位的要求
{
a[ra++]=s; // 进位
s=0; // 将s清空
s1=1; // 将位数进制也清为1
}
w++; // 记下位数,每9位则进
q--; // 位置改变
}
// 同上述a[]
q=n-1;
w=0;
s=0;
s1=1;
while(q>=fb)
{
s+=(bb[q]-'0')*s1;
s1*=10;
if(w==3 || q==0)
{
b[rb++]=s;
s=0;
s1=1;
}
w++;
q--;
}
}
void Input()
{
scanf("%d",&n);
scanf("%s%s",aa,bb);
if(aa[0]=='-' && bb[0]!='-') // a为负数,b为正数
ff=fa=1;
if(aa[0]!='-' && bb[0]=='-') // a为正数,b为负数
ff=fb=1;
if(aa[0]=='-' && bb[0]=='-') // a,b都为负数
fa=fb=1;
change(); // 字符串转换为数
}
int main()
{
Input();
for(i=fa;i<ra;i++) // 让a[]的每位乘,模拟手算
{
for(j=fb;j<rb;j++) // 同上述a[]
{
c[i+j]+=a[i]*b[j];
c[i+j+1]+=c[i+j]/10000; // 进位
c[i+j]=c[i+j]%10000; // 存下
}
int t=i+j+1; // 把没有完全进位的部分处理
while(a[t]>0)
{
a[t++]+=a[t]%10000; // 处理
a[t]/=10000; // 将进完的剔除
}
}
lc=rb+ra-1;
if(c[rb+ra]!=0) // 是否在最后进位了
lc=rb+ra;
if(ff) // 如果结果为负数
printf("-"); // 则先输出负号
for(i=lc-1;i>=0;i--) // 输出结果
printf("%d",c[i]);
getchar();
getchar();
return 0;
}