前些天有个贴子是说200位数的加法和乘法
找不到在哪了 在这里写一下我的程序的思想
望指点
关于加法
d1[200]转化为a[200]其中a[0]是个位a[1]是十位...
d2[200]同样转化为b[200]
int a[200] ,b[200],c[200],d[201];
d[0]=(a[0]+b[0])%10; /*所求的数组的个位*/
c[0]=(a[0]+b[0]-d[0])/10 /*统计进位的第一次*/
for(i=1;i<201;i++)
{
d[i]=(a[i]+b[i]+c[i-1])%10 /*所求的数组*/
c[i]=(a[i]+b[i]+c[i-1]-d[i])/10 /*统计进位*/
}
关于200位数乘200位数
同样把d1[200]变为a[200]
d2[200]变为b[200]
d[0]=(a[0]*b[0])%10;
c[0]=(a[0]*b[0]-d[0])/10;
for(i=1;i<401;i++)
{
for(j=0;j<i+1;j++)
{
E[i]+=a[j]*b[i];
}
d[i]=(E[i]+c[i-1])%10; /*所求各个数位的数字*/
c[i]=(E[i]+c[i-1]-d[i])/10; /*对进位的标记数*/
}
关于200位减200位数
这里先考虑ABSOLUTE VALUE
如果d1[0]>d2[0]考虑d1-d2
ELSE 考虑d2-d1
同样先把d1[200]变为a[200]
d2[200]变为b[200]
令c[i]=a[i]-b[i];
for(i=0;i<201;i++)
{
if(c[i]<0)
d[i]=1;
else d[i]=0;
c[i]=(c[i]+d[i-1]+10)%10;
}
c[i]就是所求的解
关于200位数和200位数的除法
我的考虑是
找到被除数中第一个不是0的数的位数
变化它 这个可以做到
举个例子
99999/33
99999-33000 if>33000 再减33000 if>33000再减33000用记数器i 统计c[0]的最高位数
if<33000了 差用d[0]记录下来 重复上面操作得到第二个高位数
最后打出c[i]