• 【复习】基础水小技巧


    1.进制转换:

     1 #include<iostream>
     2 #include<string>
     3 using namespace std;
     4 int n,k;
     5 string s;
     6 int main()
     7 {
     8     cin>>n>>k;
     9     while(n>0)
    10     {
    11         if( n%k >= 10 ) s=(char)( n%k + 55)+s;  //余数大于10的要用ABCD等来表示
    12         else s=(char)( n%k +48)+s;
    13         n/=k;
    14     }
    15     cout<<s<<endl;
    16 }

    样例输入:

    第一个数是要转换的数 第二种是转换的进制。

    case1:23 2

    case2:159 16

    样例输出:

    case1:10111

    case2:9F

    2.进制反转换

     1 #include<iostream>
     2 #include<string>
     3 using namespace std;
     4 string s;
     5 int ans,num=1,k;
     6 int main()
     7 {
     8     cin>>k;
     9     cin>>s;
    10     for(int i=s.size()-1;i>=0;i--)
    11     {
    12         if(s[i]>='A' && s[i]<='Z')
    13         ans+=num*((int)(s[i])-55);
    14         else
    15         ans+=num*((int)(s[i])-48);
    16         num*=k;
    17     }
    18     cout<<ans<<endl;
    19 }

    样例输入:

    第一个数是要转换的进制 第二种是转换出来的十进制数。

    case1:2 10111

    case2:16 9F

    样例输出:

    case1:23

    case2:159

    3.二进制小数转换

     1 #include<iostream>
     2 #include<cmath>
     3 #include<string>
     4 using namespace std;
     5 int ans,m;
     6 double n;
     7 int n2;
     8 string s;
     9 int main()
    10 {
    11     cin>>n>>m;
    12     n2=(int)(n);
    13     while(n2>0)
    14     {
    15         s+=(char)(n2%2 +48);
    16         n2/=2;
    17     }
    18     s+='.'; 
    19     n-=floor(n);
    20     for(int i=0;i<m;i++)
    21     {
    22         ans=floor(n*2);
    23         n=n*2-floor(n*2);
    24         s+=ans+48;
    25     }
    26     cout<<s<<endl;
    27     return 0;
    28 }

    样例输入:

    第一个数为输入的转换的数 第二要转换小数的位数

    5.149 6

    输出:

    101.001001

    4.大整数模板

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<string>
     4 #include<cstring>
     5 #define maxn 1010
     6 using namespace std;
     7 int a[maxn],b[maxn];
     8 string sa,sb;
     9 void inter(int x[maxn],string s)
    10 {
    11     for(int i=0;i<s.size();i++) x[s.size()-1-i]=s[i]-48;
    12 }
    13 void add(int a[],int b[],int lena,int lenb)
    14 {
    15     int c[maxn];
    16     int l=0;
    17     memset(c,0,sizeof(c));
    18     int x=0;
    19     while(l<=lena || l<=lenb)
    20     {
    21         c[l]=a[l]+b[l]+x;
    22         x=c[l]/10;
    23         c[l]%=10;
    24         l++;
    25     }
    26     while(c[l]==0 && l>1) l--;
    27     for(int j=l;j>=0;j--) cout<<c[j];
    28     cout<<endl;
    29 }
    30 int subjudge(int lena,int lenb)
    31 {
    32     if(lena>=lenb) return 0;
    33     if(lena<lenb) return 1;
    34 }
    35 void sub(int a[],int b[],int lena,int lenb)
    36 {
    37     int pd=subjudge(lena,lenb);
    38     if(pd==1) 
    39     {
    40         cout<<"-";
    41         sub(b,a,lenb,lena);
    42         return;
    43     }
    44     int c[maxn];
    45     int l=0;
    46     memset(c,0,sizeof(c));
    47     while(l<=lena || l<lenb)
    48     {
    49         if(b[l]>a[l])
    50         {
    51             a[l]+=10;
    52             c[l]=a[l]-b[l];
    53             a[l+1]--;
    54         }
    55         else
    56          c[l]=a[l]-b[l];
    57         l++; 
    58     }
    59       while(c[l]==0 && l>0) l--;
    60           for(int j=l;j>=0;j--)  cout<<c[j]; 
    61           cout<<endl;
    62 }
    63 void mul(int a[],int b[],int lena,int lenb)
    64 {
    65     int c[10010];//应该是c[maxn*maxn]但是这样是1e8数组超过最大上限。 
    66     int l=0;
    67     memset(c,0,sizeof(c));
    68     int x;
    69     for(int i=0;i<=lena;i++)
    70     {
    71         x=0;
    72         for(int j=0;j<=lenb;j++)
    73      {
    74         c[i+j-1]+=a[i]*b[j]+x;
    75         x=c[i+j-1]/10;
    76         c[i+j-1]%=10;
    77      }
    78         c[i+lenb]=x;
    79     }
    80     l=lenb+lena;
    81     while(c[l]==0 && l>1) l--;
    82     for(int j=l;j>=0;j--) cout<<c[j];
    83     cout<<a[lena]*b[lenb];
    84     cout<<endl;
    85 }
    86 int main()
    87 {
    88     cin>>sa>>sb;
    89     inter(a,sa);
    90     inter(b,sb);
    91     add(a,b,sa.size(),sb.size());    
    92     sub(a,b,sa.size(),sb.size());
    93     mul(a,b,sa.size(),sb.size());
    94     return 0;
    95 }

    加减乘  除没写……

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #define maxn 5000
     6 using namespace std;
     7 struct SPH{
     8     int len,s[maxn];
     9     SPH(){
    10         memset(s,0,sizeof(s));
    11         len=1;
    12     }
    13     SPH operator = (const char* num)
    14     {
    15         len=strlen(num);
    16         for(int i=0;i<len;++i) s[i]=num[len-i-1]-48;
    17         return *this;
    18     }
    19     SPH operator=(const int num){
    20         char a[maxn];
    21         sprintf(a,"%d",num);
    22         *this=a;
    23         return *this;
    24     }
    25     SPH (const int num){ *this=num;
    26     }
    27     SPH (const char * num){ *this=num;
    28     }
    29     SPH operator+(const SPH & a)
    30     {
    31         SPH c;
    32         c.len=max(len,a.len)+1;
    33         int x=0;
    34         for(int i=0;i<c.len;++i)
    35         {
    36             c.s[i]=s[i]+a.s[i]+x;
    37             x=c.s[i]/10;
    38             c.s[i]=c.s[i]%10;
    39         }
    40         if(c.s[c.len-1]==0) --c.len;
    41         return c;
    42     }
    43     SPH operator+=(const SPH & a){
    44         *this=*this+a;
    45         return *this;
    46     }
    47     SPH operator*(const SPH & x){
    48         SPH c;
    49         c.len=len+x.len;
    50         for(int i=0;i<len;++i){
    51             for(int j=0;j<x.len;++j){
    52                 c.s[i+j]+=s[i]*x.s[j];
    53                 c.s[i+j+1]+=c.s[i+j]/10;
    54                 c.s[i+j]%=10;
    55             }
    56             
    57         }
    58         if(c.len-1) --c.len;
    59         return c;    }
    60     SPH operator *=(const SPH & a){
    61         *this=*this * a;
    62         return *this;
    63     }
    64     bool operator < (const SPH & x) const{
    65     if(len !=x.len) return len<x.len;
    66     for(int i=len-1;i>=0;i--){
    67         if(s[i]!=x.s[i]) return s[i]<x.s[i];
    68     }
    69     return false;}
    70     bool operator >(const SPH & x) const {return x<*this;}
    71     bool operator <=(const SPH & x) const {return !(x<*this);}
    72     bool operator >=(const SPH & x) const {return !(x>*this);}
    73     bool operator ==(const SPH & x) const {return !(x<*this||x>*this);}
    74     bool operator !=(const SPH & x) const {return x<*this||x>*this;}
    75     };
    76     ostream& operator << (ostream &out,const SPH& x){
    77         for(int i=x.len-1;i>=0;i--)
    78         cout<<x.s[i];
    79         return out;
    80     }
    81     istream& operator >> (istream &in,SPH& x)
    82     {
    83         char num[maxn];
    84         in>>num;
    85         x=num;
    86         return in;
    87     }
    88 
    89 int main()
    90 {
    91     SPH n,m,sum;
    92     cin>>n>>m;
    93     sum=n+m;
    94     cout<<sum<<" ";
    95     sum=n*m;
    96     cout<<sum;
    97     return 0;
    98 }

    只有加和乘

    5.阶乘高精

     1 #include<iostream>
     2 #define maxn 10010
     3 using namespace std;
     4 int a[maxn];
     5 int n;
     6 int main()
     7 {
     8     cin>>n;
     9     a[1]=1;
    10     for(int k=2;k<=n;k++)
    11     {
    12         for(int i=1;i<maxn;i++) a[i]*=k;
    13         for(int i=1;i<maxn;i++)
    14         {
    15             a[i+1]+=a[i]/10;
    16             a[i]%=10;
    17         }
    18     }
    19     int l=maxn-1;
    20     while(a[l]==0) l--;
    21     for(int j=l;j>=1;j--) cout<<a[j];
    22     cout<<endl;
    23     return 0;
    24 }

    纪念曾经AC的第一道比赛题,MGR出题。

    6.线性筛素数

     1 #include<iostream>
     2 #include<cmath>
     3 #define maxn 10000000
     4 using namespace std;
     5 int a[maxn];
     6 int n,m;
     7 int xx;
     8 void oulashai()
     9 {
    10     a[1]=1;
    11     for(int i=2;i<=(int)(sqrt(n));i++) if(!a[i]) for(int j=i*i;j<=n;j=j+i) a[j]=1;
    12 }
    13 int main()
    14 {
    15     cin>>n>>m;
    16     oulashai();
    17     for(int i=1;i<=m;i++)
    18     {
    19         cin>>xx;
    20         if(a[xx]==0) cout<<"Yes"<<endl;
    21         else if(a[xx]==1) cout<<"No"<<endl;
    22     }
    23     return 0;
    24 }

     7.优先队列实现大根堆小根堆

     1 #include<iostream>
     2 #include<queue>
     3 #include<cstdio>
     4 #define maxn 201
     5 using namespace std;
     6 struct sph{
     7        int c;                //重载! 
     8        sph(){}
     9        sph(int c):c(c){}
    10        bool operator < (const sph& a)const {return c>a.c;} 
    11 };
    12 int main()
    13 {
    14     int a[maxn];
    15     int n=0;
    16     cin>>n;
    17     int xx;
    18     sph x1;
    19     priority_queue<int>q1;
    20     priority_queue<sph>q2;
    21     for(int i=0;i<n;i++)
    22     {
    23         cin>>xx;
    24         q1.push(xx);
    25         q2.push((sph)(xx));
    26      } 
    27     for(int i=0;i<n;i++)  //大根堆 
    28     {
    29         cout<<q1.top()<<" ";
    30         q1.pop();
    31     }
    32     cout<<endl;
    33     for(int i=0;i<n;i++)     //小根堆 
    34     {
    35         x1=q2.top();
    36         cout<<x1.c<<" ";
    37         q2.pop();
    38     }
    39     return 0;
    40 }

    8.快速幂模板

     1 #include<iostream>
     2 using namespace std;
     3 long long a,b,m;
     4 long long power(long long a, long long b, long long c){
     5     long long ans=1,t=a;
     6     while (b){if(b%2==1) ans=ans*t %c;
     7     b>>=1;t=t*t %c;}
     8     return ans;}
     9 int main()
    10 {
    11     cin>>a>>b>>m;
    12     cout<<a<<'^'<<b<<" mod "<<m<<'='<<power(a,b,m);
    13     return 0;
    14 }

    9.压位高精4位(只实现+)

    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<cstring>
    #define maxn 1010
    using namespace std;
    int a[maxn],b[maxn];
    string sa,sb;
    int inter(int x[maxn],string s)
    {
    int l=s.size();
    int i=0,t=0;
    for(l-=1;l>2;l-=4)
    {
    if(l-3>=0)
    x[i++]=(s[l-3]-48)*1000+(s[l-2]-48)*100+(s[l-1]-48)*10+(s[l]-48);
    }
    if(l==0)
    x[i++]=s[0]-48;
    else if(l==1)
    x[i++]=(s[0]-48)*10+(s[1]-48);
    else if(l==2)
    x[i++]=(s[0]-48)*100+(s[1]-48)*10+(s[2]-48);
    while(i>0&&x[i-1]==0)
    i--;
    return i;
    }
    void add(int a[],int b[],int lena,int lenb)
    {
    int c[maxn];
    int l=0;
    memset(c,0,sizeof(c));
    int x=0;
    while(l<=lena || l<=lenb)
    {
    c[l]=a[l]+b[l]+x;
    x=c[l]/10000;
    c[l]%=10000;
    l++;
    }
    while(c[l]==0 && l>1) l--;
    for(int j=l;j>=0;j--) cout<<c[j];
    cout<<endl;
    }
    int subjudge(int lena,int lenb)
    {
    if(lena>=lenb) return 0;
    if(lena<lenb) return 1;
    }
    void sub(int a[],int b[],int lena,int lenb)
    {
    int pd=subjudge(lena,lenb);
    if(pd==1)
    {
    cout<<"-";
    sub(b,a,lenb,lena);
    return;
    }
    int c[maxn];
    int l=0;
    memset(c,0,sizeof(c));
    while(l<=lena || l<lenb)
    {
    if(b[l]>a[l])
    {
    a[l]+=10;
    c[l]=a[l]-b[l];
    a[l+1]--;
    }
    else
    c[l]=a[l]-b[l];
    l++;
    }
    while(c[l]==0 && l>0) l--;
    for(int j=l;j>=0;j--) cout<<c[j];
    cout<<endl;
    }
    void mul(int a[],int b[],int lena,int lenb)
    {
    int c[10010];//应该是c[maxn*maxn]但是这样是1e8数组超过最大上限。
    int l=0;
    memset(c,0,sizeof(c));
    int x;
    for(int i=0;i<=lena;i++)
    {
    x=0;
    for(int j=0;j<=lenb;j++)
    {
    c[i+j-1]+=a[i]*b[j]+x;
    x=c[i+j-1]/10;
    c[i+j-1]%=10;
    }
    c[i+lenb]=x;
    }
    l=lenb+lena;
    while(c[l]==0 && l>1) l--;
    for(int j=l;j>=0;j--) cout<<c[j];
    cout<<a[lena]*b[lenb];
    cout<<endl;
    }
    int main()
    {
    cin>>sa;
    cin>>sb;
    inter(a,sa);
    inter(b,sb);
    for(int i=0;i<inter(a,sa);i++) cout<<a[i];
    cout<<endl;
    add(a,b,sa.size()-1,sb.size()-1);
    // sub(a,b,sa.size()/4,sb.size()/4);
    // mul(a,b,sa.size()/4,sb.size()/4);
    return 0;

    }

  • 相关阅读:
    实现主从关系Form中汇总行金额/数量
    Custom.pll : 客制化菜单
    XML publisher 填充空白行数
    PLSQL提交带有模板的报表的方法
    使用Form个性化修改标准Form的LOV2
    在开发Form表单中的三种查询方法
    S3C2440 I2C实现
    NBOOT 基于VS2005的编程与编译(一)
    WINCE 6.0 调大image config.bib
    少用的defined,注意不是define
  • 原文地址:https://www.cnblogs.com/srpihot/p/6910510.html
Copyright © 2020-2023  润新知