#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
int a[101], b[101], c[101], la, lb, lc;
void init(int a[]) //这里的a[]相当于一个变量,实际上输出的可以输数组b或者数组c,不能省略
{
string s;
cin >> s;
a[0] = s.length();
for (int i = 1; i <= a[0]; i++)
{
a[i] = s[a[0] - i] - '0';
}
}
void print(int a[])
{
if (a[0] == 0)
{
printf("0\n");
}
for (int i = a[0]; i >= 1; i--)
{
printf("%d", a[i]);
}
printf("\n");
return;
}
int compare (int a[], int b[])
{
if (a[0] > b[0]) return 1;
if (a[0] < b[0]) return -1;
for (int 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[])
{
int flag = compare(a, b);
if (flag == 0)
{
a[0] = 0;
return;
}
if (flag == 1)
{
for (int 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]--;
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 tmp[101];
c[0] = a[0] - b[0] + 1; //一定吗?
for (int 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()
{
init(a);
init(b);
chugao(a, b, c);
print(c); //商
print(a); //余数
return 0;
}
代码大部分是信息学奥赛一本通上的,输入输出啥的我自己稍微改了一下,感觉比他写得好看。
忘函数里传数组真的很强,并且他把数组长度存在了a[0]里,我原先觉得这样很不规范(蒟蒻的碎碎念),后来发现这样就能一起传进函数里了, 超强= =
【高精度就这样了。。。。。基本思想。。。还是知道的吧。。考场上如果有大空。。。应该能磨叽出来(:з」∠)不想看了,应该大丈夫!】