高精度codevs 3115-3118
来源:互联网 发布:手机 usb 共享网络 编辑:程序博客网 时间:2024/06/14 16:46
模板,想改压位来,可以压位后除法慢。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
long long tmp[1100];
const int base=10;
const int wlen=1;
struct bigNumber{//大整数
int len;
long long num[1010];
bigNumber(){len=1;memset(num,0,sizeof(num)); }
void print(){
printf("%lld",num[len]);
for(int i=len-1;i>=1;i--)
printf("%lld",num[i]);
printf("\n");
}
bool operator >(const bigNumber T)const{//重载>
if(len!=T.len)return len>T.len;
for(int i=len;i>=1;i--)
if(num[i]!=T.num[i])return num[i]>T.num[i];
return false;
}
bool operator ==(const bigNumber T)const{//重载==
if(len!=T.len)return false;
for(int i=len;i>=1;i--)
if(num[i]!=T.num[i])return false;
return true;
}
bigNumber operator +(const bigNumber B)const{//载+
bigNumber C;
C.len=max(len,B.len);
for(int i=1;i<=C.len;i++){
C.num[i]+=num[i]+B.num[i];
C.num[i+1]+=C.num[i]/base;
C.num[i]%=base;
}
while(C.num[C.len+1]){
C.len++;
C.num[C.len+1]+=C.num[C.len]/base;
C.num[C.len]%=base;
}
return C;
}
bigNumber operator *(long long B){//重载*高精度*单精度
bigNumber C;
C.len=len;
for(int i=1;i<=len;i++){
C.num[i]+=num[i]*B;
C.num[i+1]+=C.num[i]/base;
C.num[i]%=base;
}
while(C.num[C.len+1]){
C.len++;
C.num[C.len+1]+=C.num[C.len]/base;
C.num[C.len]%=base;
}
return C;
}
}a;
bigNumber operator -( bigNumber A, bigNumber B){//载-
bigNumber C;
if(!(A>B)){
C=A;A=B;B=C;
printf("-");
}
memset(C.num,0,sizeof(C.num));
C.len=A.len;
for(int i=1;i<=C.len;i++){
C.num[i]=A.num[i]-B.num[i];
if(C.num[i]<0){
C.num[i]+=base;
A.num[i+1]--;
}
}
while(C.num[C.len]==0)C.len--;
return C;
}
bigNumber operator *(const bigNumber A,const bigNumber B){//重载*
bigNumber C;
memset(C.num,0,sizeof(C.num));
C.len=A.len+B.len-1;
for(int i=1;i<=A.len;i++)
for(int j=1;j<=B.len;j++){
C.num[i+j-1]+=A.num[i]*B.num[j];
C.num[i+j]+=C.num[i+j-1]/base;
C.num[i+j-1]%=base;
}
while(C.num[C.len+1]){
C.len++;
C.num[C.len+1]+=C.num[C.len]/base;
C.num[C.len]%=base;
}
return C;
}
bigNumber operator /(const bigNumber A,const long long B){//高精度/单精度
long long T=0ll;
bigNumber C;
memset(C.num,0ll,sizeof(C.num));
C.len=A.len;
for(int i=A.len;i>=1;i--){
T=(T*base+A.num[i]);
C.num[i]=T/B;
T=T%B;
}
while(C.len>1&&C.num[C.len]==0)C.len--;
return C;
}
inline bigNumber operator /( bigNumber A,const bigNumber B){//高精度/高精度
bigNumber C,D;
C.len=A.len;
D.len=1;
for(int i=A.len;i>0;i--){
D=D*10;
D.num[1] =A.num[i];
while(!(B>D)){
D=D-B;
C.num[i]++;
}
}
while(C.len>1&&C.num[C.len]==0)C.len--;
return C;
}
inline void scan(bigNumber& T){
memset(T.num,0,sizeof(T.num));
char s[1010];
scanf("%s",s);
int tmp,ls;
ls=strlen(s);
T.len=ls;
for(int i=1;i<=T.len;i++){
T.num[i]=s[ls-i]-'0';
}
}
int main()
{ freopen("out.txt","w",stdout);
int alen,al,ar,ahead;
bigNumber a,b,c;
scan(a);
scan(b);
//(a+b).print();
//(a-b).print();
//(a*b).print();
(a/b).print();
return 0;
}
压位参数:
const int base=10000;
const int wlen=4;
压位后的读入:
inline void scan(bigNumber& T){
memset(T.num,0,sizeof(T.num));
char s[1010];
scanf("%s",s) ;
int tmp,ls;
ls=strlen(s)-1;
T.len=ls/wlen+1;
for(int i=1;i<=T.len;i++){
int ed=ls-(i-1)*wlen;
int st=max(0,ed-wlen+1);
tmp=0;
for(int j=st;j<=ed;j++)
tmp=tmp*10+s[j]-'0';
T.num[i]=tmp;
}
}
压位后的输出
void print(){
printf("%lld",num[len]);
for(int i=len-1;i>=1;i--)
printf("%04lld",num[i]);
printf("\n");
}
- 高精度codevs 3115-3118
- codevs 高精度减法 3115
- 高精度-codevs-3115高精度练习之减法
- codevs 3115 高精度练习之减法
- Codevs 3115 高精度练习之减法
- codeVS 3115 高精度练习之减法
- CODEVS 3115高精度练习之减法
- codevs 3118 高精度练习之除法
- codevs天梯 高精度加法
- codevs天梯高精度减法
- codevs天梯高精度乘法
- codevs 高精度乘法 3117
- codevs 高精度加法 3116
- [CodeVS 1166] 高精度加法
- 【codevs 3115 3116 3117】高精度练习之加/减/乘法
- 高精度-codevs-3116高精度练习之加法
- 高精度-codevs-3117高精度练习之乘法
- 【codevs】p3115 高精度练习之减法
- 第5周项目2-游戏中的角色类(1)
- 2016.4.06Test:problem1:异或树:动态树的点分治
- TCP与UDP在概念上的区别
- iOS开发---当tableview滚到视图底部展开列表后看不到数据
- 查看Android应用包名package和入口activity名称
- 高精度codevs 3115-3118
- java web分层结构
- iOS开发之详解正则表达式
- VC++生成序列号和注册机总结
- 公理系统与有限几何(1)
- UGUI-Canvas
- Android自动化测试之 Uiautomator-UiDevice-API
- 第六周书面项目(2):程序的理解
- nodejs之promise书写规范