基础算法6——高精度算法 加减乘除 C语言

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;
}

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值