2 高精度专题

这里多项式需要要考虑进位。

1、多项式加法✔

直接遍历数组N,等于0不输出
c[i] = a[i] + b[i];
1002 A+B for Polynomials

#include <iostream>
using namespace std;
const int N = 1010;
double a[N], b[N], c[N];

int read_data(double x[N]) {
    int k, n;
    double coef;
    cin >> k;
    for (int i = 0; i < k; i++) {
        cin >> n >> coef;
        x[n] = coef;
    }
    return k;
}

int add() {
    int k = 0;
    for (int i = 0; i < N; i++) {
        c[i] = a[i] + b[i];
        if (c[i]) k++;
    }
    return k;    
}

int main() {
    int k, k1, k2;
    k1 = read_data(a);
    k2 = read_data(b);

    k = add();
    cout << k;
    for (int i = N - 1; ~i; i--)
        if (c[i]) printf(" %d %.1lf", i, c[i]);

    return 0;
}

2、多项式乘法✔

c[i+j] += a[i] * b[j]
1009 Product of Polynomials

#include<iostream>
using namespace std;

const int N = 1000+10;
double a[N],b[N],c[2*N];

int main(){
    int m;
    cin>>m;
    while(m--){
        int n;
        double k;
        cin>>n>>k;
        a[n]=k;
    }
    cin>>m;
    while(m--){
        int n;
        double k;
        cin>>n>>k;
        b[n]=k;
    }

    for(int i=0;i<N;i++ ){
        for(int j=0;j<N;j++){
            c[i+j] += a[i]*b[j];
        }
    }
    
    m=0;
    for(int i=0;i<2*N;i++){
        if(c[i]) m++;  
    }
    cout<<m;

    for(int i=2*N-1;i>=0;i--){
        if(c[i]) printf(" %d %.1f",i,c[i]);
    }
    cout<<endl;
    
    
}
3、数字加倍✔

1023 Have Fun with Numbers

#include<iostream>
#include<cstring>
using namespace std;

const int N=30;
int a[N];
int b[N];
int map[10];
int ans[10];

bool check(){
    for(int i=0;i<10;i++){
        if(map[i]!=ans[i]) return false;
    }
    return true;

    
}
int main(){
    string s;
    cin>>s;
    int n=s.size();
    for(int i=0;i<n;i++){
        a[n-i-1] = s[i]-'0';
        map[a[n-i-1]] +=1;
    }

    int t=0;
    for(int i=0;i<n;i++){
        b[i]=(2*a[i]+t )%10;
        t= (2*a[i]+t )/10;
        ans[b[i]]+=1;
    }

    if(check() &&t==0) cout<<"Yes"<<endl;
    else cout<<"No"<<endl;

    if(t==1) cout<< 1;
    for(int i=n-1;i>=0;i--){
        cout<<b[i];
    }
    cout<<endl;

    
    

    
}
4、回文数1✔

高精度加法
1024 Palindromic Number

#include<iostream>
#include<vector>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;

vector<int> add(vector<int> &a,vector<int> &b){
    vector<int> c;
    int t=0;
    for(int i=0;i<a.size();i++){
        c.push_back( (a[i] + b[i] + t )%10) ;
        t = (a[i] + b[i] + t )/10;
    }
    if(t==1) c.push_back(1);
    return c;
}

int main(){
    string s;
    int k;
    cin>>s>>k;
    vector<int> v;
    for(int i=s.size()-1;i>=0;i--) v.push_back(s[i]-'0');
    for (int i=0;i<=k;i++){
        vector<int> a=v;
        reverse(a.begin(),a.end());
        if(a==v || i==k) {
            for(int i=v.size()-1;i>=0;i--) cout<<v[i];
            cout<<endl;
            cout<<i<<endl;
            break;
        }
        else {
            v = add(a,v);
        }
    }
}
5、哈利波特加法✔

也是高精度加法;
有个坑的点是第一位的进位问题不是1e7,改成1e8过了。
1058 A+B in Hogwarts

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 10;
int a[3],b[3];
int c[3];

int main(){
    scanf("%d.%d.%d %d.%d.%d",&a[2],&a[1],&a[0],&b[2],&b[1],&b[0]);
    int t=0;
    int p[3] = {29,17,100000000+1};
    for(int i=0;i<3;i++){
        int temp = (a[i] + b[i] +t );
        c[i] = temp % p[i];
        t = temp / p[i] ;
    }
    printf("%d.%d.%d\n",c[2],c[1],c[0]);
   if(t>0) 
        cout<<c[9999999999999]; 
}
6、回文数2✔

与回文数1相同,只是中间过程需要输出。
1136 A Delayed Palindrome

#include<iostream>
#include<vector>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;

vector<int> add(vector<int> &a,vector<int> &b){
    vector<int> c;
    int t=0;
    for(int i=0;i<a.size();i++){
        c.push_back( (a[i] + b[i] + t )%10) ;
        t = (a[i] + b[i] + t )/10;
    }
    if(t==1) c.push_back(1);
    for(int i=b.size()-1;i>=0;i--) cout<<b[i];
    cout<<" + ";
    for(int i=a.size()-1;i>=0;i--) cout<<a[i];
    cout<<" = ";
    for(int i=c.size()-1;i>=0;i--) cout<<c[i];
    cout<<endl;
    return c;
}

int main(){
    string s;
    cin>>s;
    vector<int> v;
    for(int i=s.size()-1;i>=0;i--) v.push_back(s[i]-'0');
    for (int i=0;i<10;i++){
        vector<int> a=v;
        reverse(a.begin(),a.end());
        if(a==v) {
            for(int i=v.size()-1;i>=0;i--) cout<<v[i];
            cout<<" is a palindromic number."<<endl;
            return 0;
        }
        else {
            v = add(a,v);
        }
    }
    cout<<"Not found in 10 iterations."<<endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值