数学篇
- 十进制数转n进制数
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
void convert(int n)
{
vector <int> v;
while(n!=0)
{
v.push_back(n%2);
n/=2;
}
for(int i=v.size()-1; i>=0 ;i--)
{
printf("%d",v[i]);
}
printf("\n");
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
convert(n);
}
return 0;
}
10进制以上,比如16进制
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
char IntToChar(int t)
{
if(t<10)
return t+'0';
else
return t-10+'A';
}
void convert(int n,int x)
{
vector <char> v;
if(n==0)
v.push_back('0');
while(n!=0)
{
v.push_back(IntToChar(n%x));
n/=x;
}
for(int i=v.size()-1; i>=0 ;i--)
{
printf("%c",v[i]);
}
printf("\n");
}
int main()
{
int n,x;
while(scanf("%d%d",&n,&x)!=EOF)
{
convert(n,x);
}
return 0;
}
- n进制转换为10进制
#include<iostream>
#include<cstdio>
#include<vector>
#include<string>
using namespace std;
int CharToInt(char t)
{
if(t<='9'&&t>='0')
return t-'0';
else
return t-'A'+10;
}
void convert(string str,int x)
{
int number=0;
for(int i=0;i<str.size();++i)
{
number*=x;
number+=CharToInt(str[i]);
}
printf("%d\n",number);
}
int main()
{
string str;
while(cin>>str)
{
convert(str,16);
}
return 0;
}
- m进制转n进制
#include<iostream>
#include<cstdio>
#include<vector>
#include<string>
using namespace std;
int CharToInt(char t)
{
if(t<='9'&&t>='0')
return t-'0';
else
return t-'A'+10;
}
char IntToChar(int t)
{
if(t<10)
return t+'0';
else
return t-10+'A';
}
int convertToTen(string str,int x)
{
int number=0;
for(int i=0;i<str.size();++i)
{
number*=x;
number+=CharToInt(str[i]);
}
return number;
}
void convertToN(int n,int x)
{
vector <char> v;
if(n==0)
v.push_back('0');
while(n!=0)
{
v.push_back(IntToChar(n%x));
n/=x;
}
for(int i=v.size()-1; i>=0 ;i--)
{
printf("%c",v[i]);
}
printf("\n");
}
int main()
{
int m,n;
while(scanf("%d%d",&m,&n)!=EOF)// m,n代表进制
{
string str;
cin>>str;
int temp = convertToTen(str,m);
convertToN(temp,n);
}
return 0;
}
- 最大公约数(辗转相除法)
- 最小公倍数(a*b/c)
- 素数是成对出现的可以将时间复杂度的线性O(n)—>O(sqrt(n))
- 第k大素数(素数筛选法若检测2为质数,则4 6 8 10不为质数)
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
const int MAXN = 1e4;
vector<int> prime;
bool isPrime[MAXN];
void fun()
{
for(int i=0;i<MAXN;i++) // fill(isPrime,isPrime+MAXN,true)
{
isPrime[i]=true;
}
isPrime[0]=false;
isPrime[1]=false;
for(int i=2;i<MAXN;i++)
{
if(!isPrime[i])
continue;
prime.push_back(i);
for(int j=i*i;j<MAXN;j+=i) //如2 4 6 8 10 就已经不是素数
{
isPrime[j]=false;
}
}
}
int main()
{
fun();
int k; //第k大数
while(scanf("%d",&k)!=EOF)
{
printf("%d\n",prime[k-1]);
}
return 0;
}
- 质因子分解,短除法
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
const int MAXN = 1e4;
vector<int> prime;
bool isPrime[MAXN];
void fun()
{
for(int i=0;i<MAXN;i++) // fill(isPrime,isPrime+MAXN,true)
{
isPrime[i]=true;
}
isPrime[0]=false;
isPrime[1]=false;
for(int i=2;i<MAXN;i++)
{
if(!isPrime[i])
continue;
prime.push_back(i);
for(int j=i*i;j<MAXN;j+=i) //如2 4 6 8 10 就已经不是素数
{
isPrime[j]=false;
}
}
}
int NumberOfFactor(int n)
{
int sum=0;
for(int i=0;i<prime.size();i++)
{
int factor=prime[i];
int current=0; // 记录某个因子多次被除 如20->10->5
if(factor>n) // 如果出现因子比n大,就已经没有计算的必要了
break;
else
{
while(n%factor==0) // 120->2 2 2 3 5 这里2就用了3次用current记录
{
current++;
n/=factor;
}
}
sum+=current;
}
if(n>1)
sum++;
return sum;
}
int main()
{
fun(); //初始化素数表
int n;
while(scanf("%d",&n)!=EOF)
{
cout<<NumberOfFactor(n)<<endl;
}
return 0;
}
- 约数个数(多组样例输入)
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
const int MAXN = 1e4;
vector<int> prime;
bool isPrime[MAXN];
void fun()
{
for(int i=0;i<MAXN;i++) // fill(isPrime,isPrime+MAXN,true)
{
isPrime[i]=true;
}
isPrime[0]=false;
isPrime[1]=false;
for(int i=2;i<MAXN;i++)
{
if(!isPrime[i])
continue;
prime.push_back(i);
for(int j=i*i;j<MAXN;j+=i) //如2 4 6 8 10 就已经不是素数
{
isPrime[j]=false;
}
}
}
int NumberOfFactor(int n)
{
vector<int> exp; //将质因子所除次数用指数数组来记录
for(int i=0;i<prime.size();i++)
{
int factor=prime[i];
int current=0; // 记录某个因子多次被除 如20->10->5
if(factor>n)
break;
else
{
while(n%factor==0)
{
current++;
n/=factor;
}
}
exp.push_back(current);
}
if(n>1)
exp.push_back(1);
int ans=1;
for(int i=0;i<exp.size();i++) // 12=2*2*3 约数有2:(2+1)*3:(1+1)=3*2=6
{
ans*=exp[i]+1; // 将指数数组中的数据累乘 就能够算出数的约数个数
}
return ans; // 返回约数个数
}
int main()
{
fun(); //初始化素数表
int n; // n个数字
while(scanf("%d",&n)!=EOF)
{
if(n==0) // 控制结束
break;
for(int i=0;i<n;i++)
{
int number;
scanf("%d",&number);
cout<<NumberOfFactor(number)<<endl;
}
}
return 0;
}
- 快速幂思想,用二进制来快速求解幂数
29 (2) = 11101 = 16+8+4+1
常用cmath中的pow(n,k)来表示n^k
#include<iostream>
#include<cstdio>
using namespace std;
const int MAXN =10;
struct Matrix
{
int row,col;
int matrix[MAXN][MAXN];
Matrix(){}
Matrix(int r,int c):row(r),col(c){}
};
Matrix add(Matrix x,Matrix y)
{
Matrix answer=Matrix(x.row,x.col);
for(int i=0;i<answer.row;i++)
{
for(int j=0; j<answer.col;j++)
{
answer.matrix[i][j]=x.matrix[i][j]+y.matrix[i][j];
}
}
return answer;
}
Matrix mul(Matrix x,Matrix y)
{
Matrix answer=Matrix(x.row,y.col);
for(int i=0;i<answer.row;++i)
{
for(int j=0; j<answer.col;++j)
{
answer.matrix[i][j]=0;
for(int k=0; k< x.col ;++k)// 3*4 4*3 = 3*3
{
answer.matrix[i][j]+=x.matrix[i][k]*y.matrix[k][j];
}
}
}
return answer;
}
void transform(Matrix &x)
{
for(int i=0;i<x.row;i++)
{
for(int j=0;j<x.col;j++)
{
x.matrix[i][j]==x.matrix[j][i];
}
}
}
void input(Matrix &x)
{
for(int i=0;i<x.row;i++)
{
for(int j=0;j<x.col;j++)
{
scanf("%d",&x.matrix[i][j]);
}
}
return ;
}
void output(Matrix x)
{
for(int i=0;i<x.row;i++)
{
for(int j=0;j<x.col;j++)
{
printf("%d ",x.matrix[i][j]);
}
printf("\n");
}
return ;
}
Matrix quickpower(Matrix x,int n)
{
Matrix answer=Matrix(x.row,x.col); // 必须为方阵
for(int i=0;i<answer.row;++i)
{
for(int j=0; j<answer.col;++j)
{
if(i==j)
answer.matrix[i][j]=1;
else
{
answer.matrix[i][j]=0;
}
}
}
while(n)
{
if(n%2==1)
answer=mul(answer,x);
n/=2;
x=mul(x,x);
}
return answer;
}
int main()
{
cout<<"矩阵乘法的输入: "<<endl;
Matrix x(2,3);
Matrix y(3,2);
input(x);
input(y);
Matrix answer =mul(x,y);
cout<<"矩阵乘法的输出: "<<endl;
output(answer);
int n,k;
cout<<"方阵快速幂的输入: "<<endl;
scanf("%d%d",&n,&k);
Matrix z=Matrix(n,n); // 保证是方阵才能幂乘
input(z);
Matrix answer2 =quickpower(z,k);
cout<<"方阵快速幂的输出: "<<endl;
output(answer2);
return 0;
}