王道复试机试(5)

数学篇

  • 十进制数转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; 
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值