复兴提高班第二十五课 高精度加减
2025-11-23 15:14:16
发布于:上海
T1高精度加法
#include<bits/stdc++.h>
using namespace std;
int main(){
string a;
string b;
int c[10089]={0};
int d[10089]={0};
int e[10089]={0};
cin>>a>>b;
int l1 = a.size() , l2 = b.size();
for(int i=0;i<l1;i++){
c[i]=a[l1-i-1]-'0';
}
for(int i=0;i<l2;i++){
d[i]=b[l2-i-1]-'0';
}
int l=max(l1,l2),jw=0;
for(int i=0;i<l;i++){
e[i]=c[i]+d[i]+jw;
if(e[i]>9){
e[i]-=10;
jw=1;
}else{
jw=0;
}
}
if(jw) cout<<1;
for(int i=0;i<l;i++){
cout<<e[l-i-1];
}
return 0;
}
T2高精度减法
#include<bits/stdc++.h>
using namespace std;
int main(){
string s1,s2;
cin >> s1 >> s2;
if(s2.size() > s1.size() || s1.size() == s2.size() && s1 < s2) {
swap(s1,s2);
cout << "-";
}
int l1 = s1.size(),l2 = s2.size();
int a1[10001] = {0},a2[10001] = {0},c[10001] = {0};
for(int i = 0; i < l1 ; i++){
a1[i] = s1[l1-i-1] - '0';
}
for(int i = 0; i < l2 ; i++){
a2[i] = s2[l2-i-1] - '0';
}
for(int i = 0;i < l1 ;i++){
c[i] = a1[i] - a2[i];
if(c[i] < 0){
c[i] += 10;
a1[i + 1] -= 1;
}
}
while(c[l1] == 0 && l1 > 0) { //去零
l1-- ;
}
while(l1 >= 0){ //倒序输出
cout << c[l1--];
}
return 0;
}
T3数楼梯
#include<bits/stdc++.h>
using namespace std;
int n , f[5010][5010] , len;
void jiafa(int k)//高精加法
{
for(int i = 1; i <= len; i++){
f[k][i] = f[k-1][i] + f[k-2][i];
}//两数相加
for(int i = 1; i <= len; i++){//进位
if(f[k][i] >= 10){
f[k][i+1] += f[k][i] / 10;
f[k][i] %= 10;
if(f[k][len+1] > 0){
len++;
}
}
}
}
int main(){
cin >> n;
len = 1;
f[1][1] = 1;//预处理
f[2][1] = 2;//预处理
for(int i = 3; i <= n; i++){
jiafa(i);
}//开始计算
for(int i = len; i >= 1; i--){
cout << f[n][i];
}//输出
return 0;
}
T4B进制星球
#include<bits/stdc++.h>
using namespace std;
int a[2010] , b[2010] , c[2018];
int y , x = 0 , l1 , l2 , z;
string n , m;
int main(){
cin >> z;
cin >> n >> m;
l1 = n.size() , l2 = m.size();
for (int i = 0; i<l1; i++){
if (z > 10 && n[i] >= 'A'){
a[l1-i] = n[i] - 'A' + 10;
}else{
a[l1-i] = n[i] - '0';
}
}
for (int i = 0; i < l2; i++){
if (z > 10 && m[i] >= 'A'){
b[l2-i] = m[i] - 'A' + 10;
}else{
b[l2-i] = m[i] - '0';
}
}
while (x<=l1 || x<=l2){//高精加
x++;
c[x] = y + a[x] + b[x]; //y是进位
y= c[x] / z;
c[x] %= z;//在z禁止下逢z进1
}
while (c[x] == 0 && x > 1){
x--; //去除前导零
}
for (int i = x; i >= 1; i--){
if (c[i] < 10){
cout << c[i];
}
else{
cout << (char)(c[i] + 'A' - 10);
}
}
return 0;
}
T5回文数
#include<bits/stdc++.h>
using namespace std;
string s;
int a[401],top;
bool judge() //判断一个数是否回文
{
int t = top / 2;
for (int i=0 ; i <= t ; i++)
if (a[i] != a[top-i])
return true;
return false;
}
int main()
{
int n,step=0;
cin >> n >> s;
top=s.size() - 1;
for (int i = 0 ; i <= top ; i++){//将字符转化为数字
if (s[i] >= '0' && s[i] <= '9'){
a[top-i] = s[i] - '0';
}else{
a[top-i] = s[i] - 55;
}
}
while (judge()){
if (step > 30){
cout << "Impossible!" ;
return 0;
} //如果超过三十步就直接结束程序
for (int i = 0 ; i <= top ; i++){
if (top - i >= i){
a[i] += a[top-i];
}else{
a[i] = a[top-i];
}
}
for (int i = 0 ; i <= top ; i++){
if (a[i] >= n){
a[i+1]++;
a[i] -= n;
}
} //进位
if (a[top+1]){
top++;
} //如果首位进位,长度要增加
step++;
}
printf("STEP=%d\n" , step);
return 0;
}
这里空空如也












有帮助,赞一个