【高精度】高精加,高精减,高精乘低精,高精除低精

前言:

特长生貌似必考,这四种一定要熟练。


高精加:

#include 
#include 
#define CWH using
#define AK namespace
#define IOI std
#define N 1005
CWH AK IOI;
char s[N];
int a[N],b[N],ans[N];
void input ()//读入
{
	cin>>s;
	int len1 = strlen (s);
	for (int i = 0; i < len1; ++i)a[N - len1 + i] = s[i] - '0' ;//倒置
	cin>>s;
	int len2 = strlen (s);
	for (int i = 0; i < len2; ++i)b[N - len2 + i] = s[i] - '0';
}
void add ()//加
{
	int g = 0;
	for (int i = N - 1; i > 0; --i)
	{
		ans[i] = (a[i] + b[i] + g) % 10;
		g = (a[i] + b[i] + g) / 10;
	}
}
void output ()//输出
{
	int i=1;
	while(ans[i] == 0 && i < N - 1) i++;
	for(int j = i;j < N; j++) printf("%d",ans[j]);
}
int main ()
{
	input ();
	add ();
	output ();
}

高精乘

#include
#include
#define CWH using
#define AK namespace
#define IOI std
CWH AK IOI;
char sr1[1010];
int b,a[1010],c[2020];
void input()
{
	memset (a, 0, sizeof (a));//初始化
	scanf ("%s", sr1);
	scanf ("%d", &b);
	for (int i = 1; i <= strlen (sr1); i++)
	  a[1000 - strlen(sr1) + i] = sr1[i - 1] - 48;//转换
}

void gjc()//乘
{
	int g = 0,s = 0;
	for (int i = 1000;i >= 1; i--)
	  {
	  	s = a[i] * b + g;
	  	g =s / 10;
	  	c[i] = s % 10;
	  }
}

void output()
{
	int i=1;
	while (c[i] == 0 && i <= 1000) i++;
	if (i >= 1000) printf("0");
	for (int j = i; j <= 1000; j++)
	  printf("%d", c[j]);
}

int main()
{
	input();
	gjc();
	output();
}

高精减:

#include
#include
#include
using namespace std;
char sr1[260], sr2[260];
int t, a[260], b[260], c[260];
void input ()//读入+预处理
{
	memset (a, 0, sizeof (a));
	memset (b, 0, sizeof (b));
	scanf("%s%s", sr1, sr2);
	for (int i = 1; i <= strlen (sr1); i++)
	a[255 - strlen (sr1) + i] = sr1[i - 1] - '0';
	for (int i = 1; i <= strlen(sr2);i++)
	b[255 - strlen (sr2) + i] = sr2[i - 1] - '0';
}
void pd()//判断要不要加-号
{
	int i = 1;
	while (a[i] == b[i]) i++;
	if (a[i]<b[i])
	  {
	  	for (int j=1;j<=255;j++)
	  	  {
	  	  	t=a[j];
	  	  	a[j]=b[j];
	  	  	b[j]=t;
	  	  }
	 	printf("-");	  
	  }
}
void jf()//高精减
{
	int g=0;
	for (int i=255;i>=1;i--)
	  if (a[i]<(b[i]+g)) 
		{
		c[i]=a[i]+10-b[i]-g;
		g=1;
	    }     
	  else    
		{    
		c[i]=a[i]-b[i]-g;
		g=0;
	    }
}
void output()//输出
{
	int i=1;
	while (c[i]==0&&i<=255) i++;
	if (i>=255) printf("0");
	for (int j=i;j<=255;j++)
	  printf("%d",c[j]);
}
int main()
{
	input();
	pd();
	jf();
	output();
}

高精除:

#include 
#include 
using namespace std;

int c[10010],a[10010],b,len_a,len_c,x;

void input()
{
    string s;
    cin>>s>>b;
    len_a = s.size();//长度
    for(int i = len_a - 1; i >= 0;--i)
        a[len_a - i - 1] = s[i] - '0';//倒置
}

void div()//高精除
{
    x = 0;
    for(int i = len_a - 1;i >= 0;--i)
    {
        c[i] = (x * 10 + a[i]) / b;
        x = (x * 10 + a[i]) % b;
    }
    len_c = len_a;
    while(c[len_c - 1] == 0 && len_c > 1) --len_c;
}

void output()//输出
{
    for(int i = len_c - 1; i >= 0; --i)
     printf("%d",c[i]);
     printf("...%d",x);//余数
}
int main()
{
    input();
    div(); 
    output();
    return 0;
}

你可能感兴趣的:(高精度,杂文)