你敲三小时代码,能得到优雅的高精度板子
你等三年,却换不来低精度的爱情
下面是高精度计算板子,除了高精除不太优雅,都很优雅
#include<iostream>//高精度步骤 1.输入(字符串) 2.字符串转整型数组 3.模拟计算 4.输出(前导0注意)
#include<cstdio>//常见问题 1.转换时忘-'0' 奇怪数字 2.计算时用= 而不是+= 无进位 3.删前导0把最后一个删了 一个测试点过不了
#include<string.h>
#include<stack>
#include<queue>
#include<cmath>
using namespace std;
int shu1[10001],shu2[10001],ans[100001],tmp[10001];
string s1,s2;
void zizhuan(string s,int a[])2(1).字符串转整型数组
{
for(int i=0;i<=s.length()-1;i++)
{
a[s.length()-i]=s[i]-'0';//容易忘记-'0' 表现为输出奇怪数字!!!!!!
}
return;
}
void shuzhuan(long long a,int b[])//2(2).数字转整型数组
{
int ji=0;
while(a>0)
{
ji++;
b[ji]=a%10;
a/=10;
}
return;
}
int compare(int a[],int b[],int len)
{
for(int i=len;i>=1;i--)
{
if(a[i]>b[i])return 1;
if(a[i]<b[i])return -1;
}
return 0;
}
void jia(int a[],int b[],int c[],int len)//加法模拟运算
{
for(int i=1;i<=len+1;i++)//直接len+1 进位没烦恼!
{
c[i]+=a[i]+b[i];//这里是+= 若用=进位会被刷新 表现为无进位!!!!!
c[i+1]+=c[i]/10;
c[i]%=10;//与乘法进位通用
}
return;
}
void jian(int a[],int b[],int c[],int len)//减法模拟运算 a>b 若可能a<b需循环比较判断 成立则先输出-
{
if(compare(a,b,len)==-1)
{
cout<<'-';
for(int i=1;i<=len;i++)swap(a[i],b[i]);
}
for(int i=1;i<=len+1;i++)
{
c[i]+=a[i]-b[i];
if(c[i]<0)
{
c[i]+=10;
c[i+1]-=1;
}
}
return;
}
void cheng(int a[],int b[],int c[],int len1,int len2)//乘法模拟运算
{
for(int i=1;i<=len1+1;i++)
{
for(int j=1;j<=len2+1;j++)
{
c[i+j-1]+=a[i]*b[j];//答案最低位 为 1数位+2数位-1
c[i+j]+=c[i+j-1]/10;
c[i+j-1]%=10;//进位不用循环一步到位
}
}
return;
}
void yi(int a[],int b[],int k,int len)//要移的数组 移后储存 移的位数 不移前长度
{
for(int i=len;i>=1;i--)
{
b[i+k]=a[i];
}
return;
}
void chu(int a[],int b[],int c[],int len1,int len2)//除法模拟运算 余数为剩下的被除数
{
int d[1001];
memset(d,0,sizeof(d));
for(int i=len1-len2;i>=0;i--)
{
memset(tmp,0,sizeof(tmp));
yi(b,tmp,i,len2);
while(compare(a,tmp,len1)!=-1)//a大于(等于!!)当前除数 不能写成 ==1!!!!
{
jian(a,tmp,d,len1);
for(int j=1;j<=len1;j++)a[j]=d[j];
memset(d,0,sizeof(d));//实际追求效率 可专门写自减
c[i+1]++;//是i+1
}
}
return;
}
int main()
{
cin>>s1>>s2;//1.输入(字符串)
zizhuan(s1,shu1);
zizhuan(s2,shu2);//2(1)字符串转数组
//long long a,b;
//cin>>a>>b;
//shuzhuan(a,shu1);//2(2)变量转数组(为了接下来更大运算)
//for(int i=s1.length();i>=1;i--)cout<<shu1[i];//验证上面两种转换方式 第一位为个位
//jia(shu1,shu2,ans,max(s1.length(),s2.length()));
//jian(shu1,shu2,ans,max(s1.length(),s2.length()));
//cheng(shu1,shu2,ans,s1.length(),s2.length());
chu(shu1,shu2,ans,s1.length(),s2.length());
//3模拟计算 默认shu1是被减(加乘除)数
int lans=s1.length()+s2.length()+1;//四种运算中的最长长度 乘法
while(ans[lans]==0&&lans>1)lans--;//删前导0 且不能删去最后一个0!!!!!!!!
for(int i=lans;i>=1;i--)cout<<ans[i];//4输出
/*cout<<endl;
int len=s1.length();
while(shu1[len]==0&&len>1)len--;
for(int i=len;i>=1;i--)cout<<shu1[i];*/
//除法余数特供输出
}