【复习】基础水小技巧

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;

}

转载于:https://www.cnblogs.com/srpihot/p/6910510.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值