码迷,mamicode.com
首页 > 其他好文 > 详细

真·纯手撸高精度模板

时间:2017-08-13 00:08:18      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:char s   for   out   can   str   names   clu   namespace   amp   

耗时(50分钟)不压位

内容只有高精度+-*,因为其他我不会写QAQ~

均ACluogu,codevs

#include<bits/stdc++.h>
using namespace std;
const int N =(int)1e5+10;
struct bignum {
	int m[N],len;
	char str[N];
	int ok;
	bignum() {ok=1;len=1,memset(m,0, sizeof(m));}
	void in() {scanf("%s",str);len=strlen(str);for(int i=0;i<len;i++) m[i]=str[len-i-1]-‘0‘;}
	void out() {if(ok==-1) printf("-");for(int i=len-1;i>=0;i--) printf("%c",m[i]+‘0‘);puts("");}
	bool operator <(const bignum &b) const {
		if(len!=b.len) return len<b.len;
		for(int i=len-1;i>=0;i--) 
			if(m[i]!=b.m[i]) return m[i]<b.m[i];
		return 0;
	}
};

bignum operator +(bignum a,bignum b) {
	bignum c;
	c.len=max(a.len,b.len);
	for(int i=0;i<c.len;i++) {
		c.m[i]+=(a.m[i]+b.m[i]);
		for(;c.m[i]>=10;c.m[i]-=10,c.m[i+1]++);
	}
	c.len+=(c.m[c.len]!=0);
	return c;
}

bignum operator -(bignum a,bignum b) {
	bignum c;
	int len=max(a.len,b.len);
	if(a<b) swap(a,b),c.ok=-1;
	for(int i=0;i<len;i++) {
		c.m[i]+=(a.m[i]-b.m[i]);
		for(;c.m[i]<0;c.m[i]+=10,c.m[i+1]--);
	}
	for(int i=len;i>=0;i--) if(c.m[i]) {c.len=i+1;break;}
	return c;
}

bignum operator *(bignum a,bignum b) {
	bignum c;
	c.len=a.len+b.len-1;
	for(int i=0;i<a.len;i++)
		for(int j=0;j<b.len;j++) {
			c.m[i+j]+=a.m[i]*b.m[j];
			for(;c.m[i+j]>=10;c.m[i+j+1]+=c.m[i+j]/10,c.m[i+j]%=10);
		}
	for(;c.m[c.len-1];c.m[c.len]+=c.m[c.len-1]/10,c.m[c.len-1]%=10,c.len++);
	c.len--;
	return c;
}

bignum a,b,c;
main() {
	a.in(),b.in();
	c=a+b;
	c.out();
	c=a-b;
	c.out();
	c=a*b;
	c.out();
	return 0;
}

 

真·纯手撸高精度模板

标签:char s   for   out   can   str   names   clu   namespace   amp   

原文地址:http://www.cnblogs.com/foreverpiano/p/bignum.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!