第二章 高精度

 

 

 

1002.多项式A+B

在这里插入图片描述

  • 注意要去掉系数为0的数据
#include<iostream>
#include<map>

using namespace std;

map <int,double,greater<int>> has;   //从大到小哈希

int main(){
    
    for(int i=0;i<2;i++){
        
        int k;
        
        cin>>k;
        
        while(k--){
            
            int n;
            
            double a;
            
            cin>>n>>a;
            
            has[n]+=a;
        }
    }
    
   for(auto t=has.begin();t!=has.end();t++){    //去掉系数为0的数据
       
       if(t->second==0)has.erase(t);
   }
    
    cout<<has.size();
    
    for(auto t: has){
        
        printf(" %d %.1lf",t.first,t.second);
    }
}

 

 

1009.多项式乘积

在这里插入图片描述

  • 注意乘出来的多项式C最高次幂应当是2000,数据范围要开够
```
#include<iostream>
#include<algorithm> using namespace std; const int N=1010,M=2010; double a[N],b[N]; //多项式a,b,结果c; double c[M]; int main(){ int k; cin>>k; while(k--){ int n; double x; cin>>n>>x; a[n]=x; } cin>>k; while(k--){ int n; double x; cin>>n>>x; b[n]=x; } for(int i=0;i<N;i++){ if(a[i]){ for(int j=0;j<N;j++){ if(b[j])c[i+j]+=a[i]*b[j]; } } } int cnt=0; for(int i=M-1;i>=0;i--)if(c[i])cnt++; cout<<cnt; for(int i=M-1;i>=0;i--)if(c[i])printf(" %d %.1lf",i,c[i]); } ```

1023.趣味数字

在这里插入图片描述

  • 高精度乘法,最后判断是否相等,可以用哈希,也可以存到vector里排完序比较,(vector支持类似a==b,返回字典序比较)

//哈希比较
#include<iostream>
#include<cstring>
#include<algorithm>
#include<unordered_map>
#include<vector>

using namespace std;

string to_double (string s){
    
    int len=s.size();
    
    vector<int> num;
    
    vector<int> c;
    
    for(int i=len-1;i>=0;i--)num.push_back(s[i]-'0');
    
    int t=0;
    
    for(int i=0;i<num.size();i++){
        
        int x=num[i]*2+t;
        
        c.push_back(x%10);
        
        t=x/10;
    }
    
    if(t)c.push_back(t);
    
    string res;
    
    for(int i=c.size()-1;i>=0;i--)res+=to_string(c[i]);
    
    return res; 
}

int main(){

    string s1,s2;
    
    cin>>s1;
    
    s2=to_double(s1);
    
    unordered_map<char,int> has;
    
    for(int i=0;i<s1.size();i++)has[s1[i]]++;
    
    for(int i=0;i<s2.size();i++)has[s2[i]]--;
    
    for(int i=0;i<has.size();i++){
        
        if(has[i]!=0){
            
            cout<<"No"<<endl<<s2;
            
            return 0;
        }
    }
    
    cout<<"Yes"<<endl<<s2;
}

//vector比较

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main()
{
    string A;
    vector<int> a;

    cin >> A;
    for (int i = A.size() - 1; i >= 0; i -- ) a.push_back(A[i] - '0');

    vector<int> b;
    int t = 0;
    for (int i = 0; i < a.size(); i ++ )
    {
        int s = a[i] + a[i] + t;
        b.push_back(s % 10);
        t = s / 10;
    }
    if (t) b.push_back(t);
    vector<int> c = b;
    sort(a.begin(), a.end());
    sort(c.begin(), c.end());

    if (a == c) puts("Yes");
    else puts("No");

    for (int i = b.size() - 1; i >= 0; i -- ) cout << b[i];

    return 0;
}

作者:yxc
链接:https://www.acwing.com/activity/content/code/content/269793/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

1024.回文数

在这里插入图片描述

#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>

using namespace std;

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

/*

add经典写法

vector<int> add(vector<int> a,vector<int> b){
    
    vector<int> res;
    
    for(int i=0,t=0;i<a.size()||i<b.size()||t;i++){
        
        int sum=t;
        
        if(i<a.size())sum+=a[i];
        
        if(i<b.size())sum+=b[i];
        
        res.push_back(sum%10);
        
        t=sum/10;
    }
    
    retrun res;
}

*/

bool judge(vector<int> a){
    
    for(int i=0,j=a.size()-1;i<j;i++,j--)       //从两边向中间遍历,遇到不一样则退出
    
       if(a[i]!=a[j])return false;
       
    return true;   
}


int main(){
    
    string s;
    
    int k;
    
    cin>>s>>k;
    
    vector<int> a;
    
    for(int i=s.size()-1;i>=0;i--)a.push_back(s[i]-'0');
    
    int cnt=0;
    
    while(k--){
        
        if(judge(a))break;                   //满足条件则退出循环
        
        vector<int> b;
        
        for(int i=a.size()-1;i>=0;i--)b.push_back(a[i]);
        
        a=add(a,b);
        
        cnt++;
    }
    
    for(int i=a.size()-1;i>=0;i--)cout<<a[i];
    
    cout<<endl<<cnt;
    
    return 0;
}

1058.霍格沃茨的A+B

在这里插入图片描述

  • 嘴上说范围是10^7,实际上是10 ^8次方???
  • y总写的真的简单,我像个弱智5555555
#include<iostream>
#include<cstring>
#include<unordered_map>
#include<vector>

using namespace std;

const int N=1e8;

vector<int> s_change(string s){
    
    vector<int> res;
    
    int k1=s.find('.');
    
    int k2=s.find('.',k1+1);
    
    res.push_back(stoi(s.substr(k2+1)));
    
    res.push_back(stoi(s.substr(k1+1,k2-k1-1)));
    
    res.push_back(stoi(s.substr(0,k1)));
    
    return res;
}

vector<int> add(vector<int> a,vector<int> b){
    
     vector<int> res;
     
     int t=0,i=0;
     
     int x=a[i]+b[i];
     
     res.push_back(x%29);
     
     t=x/29,i++;
     
     x=a[i]+b[i]+t;
     
     res.push_back(x%17);
     
     t=x/17,i++;
     
     x=a[i]+b[i]+t;
     
     res.push_back(x%N);
     
     return res;
     
}

int main(){
    
    string s1,s2;
    
    cin>>s1>>s2;
    
    vector<int> a,b,c;
    
    a=s_change(s1);
    
    b=s_change(s2);
    
    c=add(a,b);
    
    string res;
    
    for(int i=c.size()-1;i>=0;i--)res+=to_string(c[i])+".";
    
    res.erase(res.size()-1);
    
    cout<<res;
}

#include<iostream>

using namespace std;

int main(){
    
    int a,b,c,d,e,f;   //定义两个霍格沃茨数的三个部分
    
    scanf("%d.%d.%d %d.%d.%d",&a,&b,&c,&d,&e,&f);
    
    c+=f,b+=e,a+=d;
    
    b+=c/29,c=c%29;
    
    a+=b/17,b=b%17;
    
    printf("%d.%d.%d",a,b,c);
    
    return 0;
}

1136.延迟的回文数

在这里插入图片描述

  • 嘴上说给个初始非回文数结果还是有特判??

#include<iostream>
#include<cstring>
#include<vector>

using namespace std;

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

bool check(vector<int> c){
    
    for(int i=0,j=c.size()-1;i<j ;i++,j--)
        if(c[i]!=c[j])return false;
    
    return true;
}

void print(vector<int> a){
    
    for(int i=a.size()-1;i>=0;i--)cout<<a[i];
}

int main(){
    
   string s;
    
   cin>>s;
    
   vector<int> a,b;
   
   for(int i=s.size()-1;i>=0;i--)a.push_back(s[i]-'0');
   
   if(check(a)){
       
       print(a);
       
       cout<<" is a palindromic number.";
       
       return 0;
   }
   
   int k=10;
   
   while(k--){
       
       for(int i=a.size()-1;i>=0;i--)b.push_back(a[i]);
       
       vector<int> c=add(a,b);
       
       print(a),cout<<" + ",print(b),cout<<" = ",print(c),cout<<endl;
       
       if(check(c)){
           
           print(c);
           
           cout<<" is a palindromic number.";
           
           return 0;
       }
       
       a=c;
       
       b.clear();
   }
   
   cout<<"Not found in 10 iterations.";
}
posted @ 2020-06-27 23:20  zzcxxoo  阅读(199)  评论(0)    收藏  举报