#include <string.h>
#define MAX_LEN 200
char a[MAX_LEN + 10]
char b[MAX_LEN + 10]
int va[MAX_LEN + 10] //被除数, an1[0]对应于个位
int vb[MAX_LEN + 10] //除数, an2[0]对应于个位
int vc[MAX_LEN + 10] //存放商,aResult[0]对应于个位
//长度为 nLen1 的大整数p1 减去长度为nLen2 的大整数p2
//结果放在p1 里,返回值代表结果的长度
//如不够减返回-1,正好减完返回 0
//下面判断p1 是否比p2 大,如果不是,返回-1
int Substract( int * p1, int * p2, int nLen1, int nLen2)
{
int i
if( nLen1 < nLen2 )
return -1
if( nLen1 == nLen2 )
{
for( i = nLen1-1 i >= 0 i -- )
{
if( p1[i] > p2[i] ) break //p1>p2
else if( p1[i] < p2[i] ) return -1 //p1<p2
}
}
for( i = 0 i < nLen1 i ++ )
{ //要求调用本函数确保当i>=nLen2 时,p2[i] = 0
p1[i] -= p2[i]
if( p1[i] < 0 )
{
p1[i]+=10
p1[i+1] --
}
}
for( i = nLen1 -1 i >= 0 i-- )
if( p1[i] )//找到最高位第一个不为0
return i + 1
return 0//全部为0,说明两者相等
}
int main()
{
freopen("test.txt","r",stdin)
int test
scanf("%d",&test)
while(test--){
scanf("%s", a)
scanf("%s", b)
int i, j
int lena = strlen(a)
memset( va, 0, sizeof(va))
memset( vb, 0, sizeof(vb))
memset(vc, 0, sizeof(vc))
for( j = 0, i = lena - 1i >= 0 i --)
va[j++] = a[i] - '0'
int lenb = strlen(b)
for( j = 0, i = lenb - 1i >= 0 i --)
vb[j++] = b[i] - '0'
if( lena < lenb )
{
printf("0\n")
continue
}
int nTimes = lena - lenb
if(nTimes > 0)
{
for( i = lena -1 i >= nTimes i -- )
vb[i] = vb[i-nTimes]//朝高位移动
for( i >= 0 i--)//低位补0
vb[i] = 0
lenb = lena
}
for( j = 0 j <= nTimes j ++ )
{
int nTmp
//一直减到不够减为止
//先减去若干个 an2×(10 的 nTimes 次方),
//不够减了,再减去若干个 an2×(10 的 nTimes-1 次方),......
while( (nTmp = Substract(va, vb+j, lena, lenb-j)) >= 0)
{
lena = nTmp
vc[nTimes-j]++ //每成功减一次,则将商的相应位加1
}
}
//下面输出结果,先跳过高位0
for( i = MAX_LEN (i >= 0) && (vc[i] == 0) i -- )
if( i >= 0)
for( i>=0 i--)
printf("%d", vc[i])
else
printf("0")
printf("\n")
}
return 0
}
#include<stdio.h>
int main()
{ double a,b,c
while(scanf("%lf%lf",&a,&b)==2)
{ c=a/b
printf("%g/%g=%g\n",a,b,c)
}
return 0
}
在超高精度算法中,最难的就是除法了。(乘法,加法,减法,都要会)模拟人工算法吧(大数都采用字符数组!)
做除法运算,首先至少要会乘法。
123456789*5
运算如下:
9*5=5进4,5*8=0
加个位进位4
进4,以此类推
大数之间的比较,也要会,这个简单就不说了,如果这个也不会,那我没办法说下去了!
除法如下:
把数字当放入字符数组....
假设:17346777412563/2365489
2365489(7位)
1734677(7位)
使用字符数组比较,如果是小于,那么采用17346777(8位)
一.然后2365489*9=的结果跟17346777,如果大于就2365489*8....依次类推直到小于。求得结果的第一位了。
然后17346777-2365489*x=余数跟(17346777后一位)4组合,看是否大于2365489,大于就
进入一步骤方式运算。小于的话,结果的第二位就是0。
大致思路讲了,只要中间思路分析清楚,基本上不会有多大问题。总之,模拟人工。
这样的话,不管多大的数字之间的除法都OK的!
思路不懂可以来问我,如果,要我写代码,就别找我了