https://www.luogu.org/problemnew/show/P1601
高精度加法
#include
#include
#include
using namespace std;
const int L=505;
string add(string a,string b)//只限两个非负整数相加
{
string ans;
int na[L]={0},nb[L]={0};
int la=a.size(),lb=b.size();
for(int i=0;iint
for(int i=0;iint
int lmax=la>lb?la:lb;
for(int i=0;i=0;i--) ans+=na[i]+'0';//逆序保存到字符串中即为答案
return ans;
}
int main()
{
string a,b;
cin>>a>>b;
cout<
https://www.luogu.org/problemnew/show/P2142
高精度减法
#include
using namespace std;
int compare(string s1,string s2);
int main()
{
string str1,str2;
int a[10250],b[10250];
int i;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
cin>>str1>>str2;
a[0]=str1.length();
for(i=1;i<=a[0];i++) a[i]=str1[a[0]-i]-'0';
b[0]=str2.length();
for(i=1;i<=b[0];i++) b[i]=str2[b[0]-i]-'0';
if((compare(str1,str2))==0) //*a>= *b,做按位减,并处理借位。
{
for(i=1;i<=a[0];i++)
{
a[i]-=b[i];
if (a[i]<0)
{
a[i+1]--;
a[i]+=10;
}
}
a[0]++;
while((a[a[0]]==0)&&(a[0]>1)) a[0]--;
for(i=a[0];i>=1;i--)
cout<1)) b[0]--;
for(i=b[0];i>=1;i--)
cout<s2.length()) return 0;
if(s1.length()s2[i]) return 0;
if(s1[i]
https://www.luogu.org/problemnew/show/P1303
高精度乘法
#include
#include
using namespace std;
int main()
{
string str1,str2;
int a[2050],b[2050],c[5000],len; //2050位以内的两个数相乘
int i,j;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
cin>>str1>>str2;
a[0]=str1.length();
for(i=1;i<=a[0];i++) a[i]=str1[a[0]-i]-'0';
b[0]=str2.length();
for(i=1;i<=b[0];i++) b[i]=str2[b[0]-i]-'0';
memset(c,0,sizeof(c));
for(i=1;i<=a[0];i++) //做按位乘法同时处理进位,注意循环内语句的写法。
for(j=1;j<=b[0];j++)
{
c[i+j-1]+=a[i]*b[j];
c[i+j]+=c[i+j-1]/10;
c[i+j-1]%=10;
}
len=a[0]+b[0]+1; //去掉前导0,然后输出
while((c[len]==0)&&(len>1)) len--;
for(i=len;i>=1;i--) cout<
https://www.luogu.org/problemnew/show/P1255
斐波那契高精度保存
#include
using namespace std;
int n,len=1,f[5003][5003];//第一维表示到某台阶方案数,第二维存高精度的各位
void hhh(int k)//高精度加法,k表示台阶数
{
int i;
for(i=1;i<=len;i++)
f[k][i]=f[k-1][i]+f[k-2][i];
for(i=1;i<=len;i++)
{
if(f[k][i]>=10)
{
f[k][i+1]+=f[k][i]/10;
f[k][i]=f[k][i]%10;
if(f[k][len+1])len++;
}
}
}
int main()
{
int i;
scanf("%d",&n);
f[1][1]=1; f[2][1]=2;
for(i=3;i<=n;i++)
hhh(i);
for(i=len;i>=1;i--)
printf("%d",f[n][i]);
return 0;
}
https://www.luogu.org/problemnew/show/P1604
两个B进制数相加,求结果
#include
using namespace std;
const int L=2005;
string add_Base(string a,string b,int Base)
{
int maxl,na[L]={0},nb[L]={0};
int la=a.length(),lb=b.length();
maxl=la>lb?la:lb;
for(int i=0;i='0'&&a[i]<='9')
na[la-i-1]=a[i]-'0';
else na[la-i-1]=a[i]-'A'+10;
}
for(int i=0;i='0'&&b[i]<='9')
nb[lb-i-1]=b[i]-'0';
else nb[lb-i-1]=b[i]-'A'+10;
}
for(int i=0;i=Base)
{
na[i+1]+=na[i]/Base;
na[i]%=Base;
}
}
if(na[maxl]) maxl++;
while(na[maxl--]==0&&maxl>0);
maxl++;
string ans;
for(int i=maxl;i>=0;i--)
{
if(na[i]>=0&&na[i]<=9) ans+=('0'+na[i]);
else ans+=('A'+na[i]-10);
}
return ans;
}
int main()
{
string a,b;
int Base;
cin>>Base>>a>>b;
cout<