http://noi.openjudge.cn/ch0113/47/
求两个大的正整数相除的商。
输入第1行是被除数,第2行是除数。每个数均不超过100位。输出一行,相应的商的整数部分
/*高精度除以低精,是对被除数的每一位(每一位包括前面的余数,以下都是如此)都除以除数。而高精度
除以高精度则是用减法模拟法,对于被除数的每一位都减去除数,一直减到当前位置的数字(包括前面的余数)
小于除数(由于每一位数字都小于10,所以对于每一位最多进行十次计算)*/
#include<iostream>
#include<cstring>
using namespace std;
int a[2201],b[2201],c[2201],d,i;
void init (int a[])//数据类型为void, 表示只有功能没有返回值;数据类型 函数名 (形式参数表)
{
string s;//定义一个字符串类型的变量s
cin>>s;//读入字符串S
a[0]=s.length();//用a[0]计算字符串S的位数,括号没什么用,就是一种格式
for(i=1;i<=a[0];i++)
a[i]=s[a[0]-i]-'0';//将数串S转换为数组A,并且倒序存储
}
void print(int a[])//类型为整数型,打印输出
{
int i;
if(a[0]==0){cout<<0<<endl;return;}
for(i=a[0];i>0;i--) cout<<a[i];
return;
}
int compare(int a[],int b[])//比较a和b的大小关系,若a>b则为1,a<b为-1,a=b为0
{
int i;
if(a[0]>b[0]) return 1;//a的位数大于b,则a>b
if(a[0]<b[0]) return-1;//a的位数小于b,则a<b
for(i=a[0];i>0;i--)//从高位到低位比较
{if(a[i]>b[i]) return 1;
if(a[i]<b[i]) return -1;
}
return 0;//各个数位都相等则两数相等
}
void jian(int a[],int b[])//计算A=A-B
{
int flag,i;
flag=compare(a,b);//调用函数比较大小
if(flag==0) {a[0]=0;return;}//相等
if(flag==1)//大于
{
for(i=1;i<=a[0];i++)
{if(a[i]<b[i]){ a[i+1]--;a[i]+=10;}//若不够减就向上借一位
a[i]-=b[i];
}
while (a[0]>0&&a[a[0]]==0) a[0]--;//a[0]存储长度,a[a[0]]代表最高一位,如果等于0,删除前导零,修正A的位数
return;
}
}
void numcpy(int p[],int q[],int det)//复制P数组到Q数组从DET开始的地方
{
for(int i=1;i<=p[0];i++) q[i+det-1]=p[i];
q[0]=p[0]+det-1;
}
void chugao(int a[],int b[],int c[])
{
int i,tmp[201];
c[0]=a[0]-b[0]+1;
for(i=c[0];i>0;i--)
{
memset(tmp,0,sizeof(tmp));//数组清零
numcpy(b,tmp,i);
while(compare(a,tmp)>=0) {c[i]++;jian(a,tmp);}//用减法来模拟
}
while(c[0]>0&&c[c[0]]==0) c[0]--;
return;
}
int main()
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
init(a);
init(b);
chugao(a,b,c);
print(c);//商
//print(a);//余数
return 0;
}
记得上学那时候有《数据结构》这门课上有一个数据结构,就是用字符串表示数字,我还一直想找这个,没找到
https://blog.csdn.net/zhanglin2997060472/article/details/49055133
这不是我的博客,是我以前学高精度的时候看过的,希望也能帮助你。