最近学习效率有点低,时间也没有把握,因为最近学的高数有点难,有时候在小组会学习高数,本身学习算法的时间就少,最近更少.很多进度都没跟上,下周我决定不学习第四阶段,好好复习之前的基础知识,多练练之前的题,因为下周还有篮球比赛,几乎每天晚上都没时间.这周我真正学到的只有高精度加法,至于高精度其他算法以及全排列学的不太明白,本篇博客只写关于高精度加法,其他的在以后博客中慢慢补.
高精度算法的思想我觉得非常巧妙,低精度加法的话就是让电脑自动进行运算,高精度的话电脑无法进行运算,因此将高精度数转化为一个数组,然后将两个数组的每一位进行相加,就相当于两个数相加时,个位加个位,十位加十位,进位的话下一位加一,代码如下:
#include<bits/stdc++.h>
using namespace std;
//高精度大数
struct hugeint{
int num[505]={0};
int len = 0;
};
//将字符串转化成数字
hugeint strtoint(string s){
hugeint ans;
for(int i=s.size()-1;i>=0;i++){
ans.num[++ans.len]=s[i]-'0';
}
return ans;
}
//打印高精度大数
void printint(hugeint n){
for(int i=n.len;i>=1;i--){
cout<<n.num[i];
}
cout<<endl;
}
//高精度+高精度
void add(hugeint a,hugeint b){
hugeint ans;
ans.len=max(a.len,b.len);
//从低位往高位进行运算
for(int i=1;i<=ans.len;i++){
ans.num[i]+=a.num[i]+b.num[i];//对应位进行加法运算
ans.num[i+1]=ans.num[i]/10;//更新进位
ans.num[i]%=10;//将运算结果的个位保留在ans中
}
//处理进位溢出
if(ans.num[ans.len+1]>0){
ans.len++;
}
}
int main(){
string a,b;
cin>>a>>b;
hugeint n1=strtoint(a);
hugeint n2=strtoint(b);
printint(add(n1,n2));
return 0;
}
其他知识以后的两周我会慢慢补回来,加油!