A 高精度加法
#include<stdio.h>
#include<string.h>
const int N = 1e5 + 9;
int a[N], b[N], c[N];
char A[N], B[N];
void addition(int a[],int b[],int len_a,int len_b)
{
int i,t=0,j;
for (i = 0; i < len_a || i < len_b; i++)//c[0]存个位
{
if (i < len_a)t += a[i];
if (i < len_b)t += b[i];
c[i] = t % 10;
t /= 10;
}
if (t > 0)
{
c[i] = t;
}
else
{
i--;
}
for (j = i; j>=0; j--)
{
printf("%d", c[j]);
}
}
int main()
{
gets_s(A);
gets_s(B);
int i,k=0, len_a = strlen(A), len_b = strlen(B);
//先换为整数型,注:a[0]是个位,A[0]是最高位,∴A[k]需从最高位倒着存入a[i]
for (i = 0,k=len_a-1; k>=0; k--,i++)a[i] = A[k] - '0';
for (i = 0,k=len_b-1; k>=0; k--,i++)b[i] = B[k] - '0';
addition(a, b, len_a, len_b);
return 0;
}
B 高精度减法
#include<stdio.h>
#include<string.h>
const int N = 1e5 + 9;
char A[N], B[N];
int a[N], b[N], c[N];
int compare(char A[], char B[])//A[]大,返回1
{
if (strlen(A) > strlen(B))
{
return 1;
}
else if (strlen(A) < strlen(B))
{
return 0;
}
else
{
if (strcmp(A, B) >= 0)
{
return 1;
}
else
{
return 0;
}
}
}
void subtraction(int a[],int b[],int len_a,int len_b)//默认a[]>b[]
{
int i, j,t=0;
for (i = 0; i < len_a; i++)
{
t += a[i];
if (i < len_b)t -= b[i];
if (t < 0)
{
t += 10;
c[i] = t % 10;
t = -1;
}
else
{
c[i] = t % 10;
t = 0;
}
}
while (c[--i] == 0&&i>0){}
for (j = i; j >= 0; j--)
{
printf("%d", c[j]);
}
}
int main()
{
gets_s(A);
gets_s(B);
int i,k, len_a = strlen(A), len_b = strlen(B);
for (i = len_a - 1, k = 0; i >= 0; k++, i--)a[k] = A[i] - '0';
for (i = len_b - 1, k = 0; i >= 0; k++, i--)b[k] = B[i] - '0';
if(compare(A,B)==1)
{
subtraction(a, b, len_a, len_b);
}
else if(compare(A,B)==0)
{
printf("-");
subtraction(b, a, len_b, len_a);
}
return 0;
}
C 高精度乘法
//数值范围:1<a的位数<1e5,0<b的值<1e5,即大数*小数。
#include<stdio.h>
#include<string.h>
const int N = 1e5 + 9;
char A[N];
int a[N], b, c[2*N];
void multiplication(int a[], int b, int len_a)
{
int i, t = 0,k=0;
if (b == 0)
{
printf("0");
return;
}
for (i =0; i<len_a||t; i++)
{
if(i<len_a)t += (a[i] * b);
c[k++] = t % 10;
t /= 10;
}
for (i = k-1; i>=0; i--)
{
printf("%d", c[i]);
}
}
int main()
{
gets_s(A);
scanf("%d", &b);
int i, len_a = strlen(A),k ;
for (i = len_a - 1, k = 0; i >= 0; k++, i--)a[k] = A[i]-'0';
multiplication(a, b, len_a);
return 0;
}
D 高精度除法
//数值范围:1<a的位数<1e5,1<b<1e5。
//输出要求:第一行输出商,第二行输出余数。
#include<stdio.h>
#include<string.h>
const int N = 1e5 + 9;
int a[N], b, c[N];
char A[N];
void division(int a[],int b, int len_a)
{
int i, t=0, j=-1,k;
for (i = 0; i < len_a; i++)
{
t =t*10+a[i] ;
c[i] = t / b;
t%=b;
}
//前面是多余的0则需除去,如001=>1;但要保留商为0时的值,∴j<len_a。
while(j<len_a-1&&c[++j]==0){}
for (k = j; k < i; k++)
{
printf("%d", c[k]);
}
printf("\n");
printf("%d", t);
}
int main()
{
gets_s(A);
scanf("%d", &b);
int i, len_a = strlen(A);
for (i = 0; i<len_a; i++)a[i] = A[i] - '0';
division(a, b, len_a);
return 0;
}