高精度加法
二维数组
int n, len, f[5050][5050];
void High_precision_add(int k)
{
for(int i = 1;i <= len ;i++)
f[k][i] = f[k - 1][i] + f[k - 2][i];
for(int i = 1;i <= len; i++)
{
if(f[k][i] >= 10)
{
f[k][i + 1] += f[k][i] / 10;
f[k][i] %= 10;
if(f[k][len + 1] > 0)
len++;
}
}
}
void solve()
{
cin >> n;
len = 1;
f[1][1] = 1;
f[2][1] = 2;
for(int i = 3;i <= n; i++)
{
High_precision_add(i);
}
for(int i = len;i >= 1; i--)
cout << f[n][i];
}
字符串
string High_precision_add(string a, string b)
{
string ans = "";
int p[5005], q[5005];
mem(p, 0);
mem(q, 0);
int len_a = a.length(), len_b = b.length();
for(int i = 0;i < len_a; i++)
p[len_a - 1 - i] = a[i] - '0';
for(int i = 0;i < len_b; i++)
q[len_b - 1 - i] = b[i] - '0';
int len_max = len_a > len_b ? len_a : len_b;
for(int i = 0;i < len_max; i++)
{
p[i] += q[i];
p[i + 1] += p[i] / 10;
p[i] %= 10;
}
if(p[len_max])
len_max++;
for(int i = len_max - 1;i >= 0; i--)
ans += (p[i] + '0');
return ans;
}
高精度减法
字符串,大的非负整数减小的非负整数
string High_precision_sub(string a, string b)
{
string ans = "";
int p[5005], q[5005];
mem(p, 0);
mem(q, 0);
int len_a = a.length(), len_b = b.length();
for(int i = 0;i < len_a; i++)
p[len_a - 1 - i] = a[i] - '0';
for(int i = 0;i < len_b; i++)
q[len_b - 1 - i] = b[i] - '0';
int len_max = len_a > len_b ? len_a : len_b;
for(int i = 0;i < len_max; i++)
{
p[i] -= q[i];
if(p[i] < 0)
{
p[i] += 10;
p[i + 1]--;
}
}
while(!p[len_max - 1] && len_max)
len_max--;
for(int i = len_max - 1;i >= 0; i--)
ans += (p[i] + '0');
if(ans == "")
return "0";
return ans;
}
高精度乘法
字符串
string High_precision_mul(string a, string b)
{
string ans;
int p[5005], q[5005], s[5005];
mem(p, 0);
mem(q, 0);
mem(s, 0);
int len_a = a.length(), len_b = b.length();
for(int i = len_a - 1;i >= 0; i--)
p[len_a - i] = a[i] - '0';
for(int i = len_b - 1;i >= 0; i--)
q[len_b - i] = b[i] - '0';
for(int i = 1;i <= len_a; i++)
for(int j = 1;j <= len_b; j++)
s[i + j - 1] += p[i] * q[j];
for(int i = 1;i <= len_a + len_b; i++)
{
s[i + 1] += s[i] / 10;
s[i] %= 10;
}
if(s[len_a + len_b])
ans += s[len_a + len_b] + '0';
for(int i = len_a + len_b - 1;i >= 1; i--)
{
ans += s[i] + '0';
}
return ans;
}
高精度除法
字符串
int sub(int *p, int *q, int len_a, int len_b)
{
if(len_a < len_b)
return -1;
if(len_a == len_b)
{
for(int i = len_a - 1;i >= 0; i--)
{
if(p[i] > q[i])
break;
else if(p[i] < q[i])
return -1;
}
}
for(int i = 0;i < len_a; i++)
{
p[i] -= q[i];
if(p[i] < 0)
{
p[i] += 10;
p[i + 1]--;
}
}
for(int i = len_a - 1;i >= 0; i--)
{
if(p[i])
return i + 1;
}
return 0;
}
string High_precision_div(string a, string b, int flag)
{
string ans, cnt;
int p[5005], q[5005], s[5005];
mem(p, 0);
mem(q, 0);
mem(s, 0);
int len_a = a.length(), len_b = b.length();
int len = len_a;
for(int i = len_a - 1;i >= 0; i--)
p[len_a - i - 1] = a[i] - '0';
for(int i = len_b - 1;i >= 0; i--)
q[len_b - i - 1] = b[i] - '0';
if(len_a < len_b || (len_a == len_b && a < b))
return a; // cout << "0" << endl;
int t = len_a - len_b;
for(int i = len_a - 1;i >= 0; i--)
{
if(i >= t)
q[i] = q[i - t];
else
q[i] = 0;
}
len_b = len_a;
for(int j = 0;j <= t; j++)
{
int temp;
while((temp = sub(p, q + j, len_a, len_b - j)) >= 0)
{
len_a = temp;
s[t - j]++;
}
}
for(int i = 0;i < len_a; i++)
{
s[i + 1] += s[i] / 10;
s[i] %= 10;
}
int k = len;
while(!s[k])
k--;
while(k >= 0)
ans += s[k--] + '0'; // 商
k = len;
while(!p[k])
k--;
while(k >= 0)
cnt += p[k--] + '0'; // 余数
if(cnt.empty())
cnt = "0";
if(flag == 1)
return ans;
return cnt;
}