所有算法(基础)

第一个(未分类)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e7+10;
const int mod=1e7+5; 
ll fastpow(ll a,ll b)//1.快速幂(时间复杂度为ologn) 
{
	if(b==1)return a;
	ll temp=fastpow(a,b/2);
	if(b%2==1)return temp*temp*a;
	else return temp*temp;
}
//n&1 取n的最后一位
//n>>=1,将n右移一位
ll fastpow(ll a,ll b)//2.快速幂(最多算到2^62) 
{
	ll res=1;
	while(b){
		if(b&1) res=(res*a)%mod;//取模运算 
		a*=a;
		b>>=1;
	}
	return res;
}
//埃式筛 
ll is_prime[maxn];//记录质数 
bool vis[maxn];//判断是不是质数
void isprime(ll n)
{
	vis[0]=1;
	ll cnt=0;//记录质数个数 
	for(ll i=2;i<=n;i++){
		if(!vis[i]){
			is_prime[++cnt]=i;
			for(ll j=2*i;j<=n;j+=i){
				vis[j]=1;//记录质数的倍数是不是质数 
			}
		}
	}
	for(int i=1;i<=cnt;i++){
		cout<<is_prime[i]<<endl;
	} 
} 
//欧拉筛(比埃式筛要快) 
void isprime(ll n)
{
	vis[0]=1;
	ll cnt=0;//记录质数个数 
	for(ll i=2;i<=n;i++){
		if(!vis[i]){
			is_prime(++cnt)=i;
			if(i<=sqrt(n)){
				for(ll j=i*i;j<=n;j+=i){
					vis[j]=1;//记录质数的倍数是不是质数 
				}
			}
		}
	}
	for(int i=1;i<=cnt;i++){
		cout<<is_prime[i]<<endl;
	} 
}
//辗转相除法求最大公约数
ll gcd(ll a,ll b)
{
	if(b==0)return a;
	else return gcd(b,a%b);//return b==0?a:gcd(b,a%b);
}
//求最小公倍数
ll lcm(ll a,ll b)
{
	return a*b/gcd(a,b);
}
//裴蜀定理 
 ax+by=k*gcd(a,b)
//扩展欧几里得算法
void exgcd(ll a,ll b,ll &x,ll &y)//解 ax +by =gcd(a,b)的一组整数解 
{
	if(b==0)
	{
		x=1;
		y=0;
		return;
	}
	exgcd(b,a%b,x,y);
	ll s_x=x;
	ll s_y=y;
	x=s_y;
	y=s_x-(a/b)*s_y;//时间复杂度近似为logn 
}
//逆元
//1.扩展欧几里得求逆元
ll inv1(ll a)
{
	ll x,y;
	exgcd(a,mod,x,y);
	return (x%mod+mod)%mod;
 }
//2.费马小定理求逆元
ll inv2(ll a)
{
	return fastpow(a,mod-2);
 } 
int main()
{
	
}

第二个

高精度减法

#include<bits/stdc++.h>
using namespace std;
string x,y;
int a[10005],b[10005],c[10005],la,lb;
int main()
{
	cin>>x>>y;
	la=x.size();
	lb=y.size();
	if(la<lb||la==lb&&x<y){
		swap(x,y);
		swap(la,lb);
		cout<<'-';
	}
	for(int i=0;i<la;i++){
		a[la-i]=x[i]-'0';
	}
	for(int i=0;i<lb;i++){
		b[lb-i]=y[i]-'0';
	}
	for(int i=1;i<=la;i++){
		if(a[i]-b[i]<0){
			a[i]+=10;
			a[i+1]--;
		}
		c[i]=a[i]-b[i];
	}
	while(c[la]==0&&la>1)la--;
	for(int i=la;i>=1;i--){
		cout<<c[i];
	}
	return 0;
 } 

高精度加法

#include <bits/stdc++.h>
using namespace std;
int s1[10000],s2[10000],t[10000];
int main()
{
	string x,y;
	cin>>x>>y;
	int la,lb;
	la=x.length();
	lb=y.length();
	for(int i=0;i<la;i++){
		s1[la-i]=x[i]-'0';
	}
	for(int i=0;i<lb;i++){
		s2[lb-i]=y[i]-'0';
	}
	int lc=max(la,lb);
	for(int i=1;i<=lc;i++){
		t[i]+=s1[i]+s2[i];
		t[i+1]=t[i]/10;
		t[i]%=10;
	}
	if(t[lc+1]>0)lc++;
	for(int i=lc;i>=1;i--){
		cout<<t[i]; 
	}
	return 0;
}

高精度乘法

#include <bits/stdc++.h>
using namespace std;
string x,y;
int a[10005],b[10005],c[10005],la,lb,lc; 
int main()
{
	cin>>x>>y;
	la=x.size();//计算长度 
	lb=y.size();
	for(int i=0;i<la;i++){
		a[la-i]=x[i]-'0';
	}
	for(int i=0;i<lb;i++){
		b[lb-i]=y[i]-'0';
	}
	for(int i=1;i<=la;i++){
		for(int j=1;j<=lb;j++){
			c[i+j-1]+=a[i]*b[j];
			c[i+j]+=c[i+j-1]/10;
			c[i+j-1]%=10;//重要算法(乘法) 
		}
	}
	lc=la+lb;
	while(c[lc]==0&&lc>1){
		lc--;
	}//消零 
	for(int i=lc;i>=1;i--){
		cout<<c[i];
	}
	return 0;
}

二分求数

#include<stdio.h>
int max(int n,int a[],int len)
{
	int ret=-1;
	int left=0;
	int right=len-1;
	int mid=(left+right)/2;
	while(right>left){
		if(a[mid]==n){
			ret=mid;
			break;
		}else if(a[mid]>n){
			right=mid-1;
		}else{
			left=mid+1;
		}
	}
	return ret;
}
int main()
{
	int a[]={12,23,34,45,56,67,78,89,};
	int x=max(23,a,sizeof(a)/sizeof(a[0]));
	printf("%d",x); 
	return 0;
}

斐波那契数列

#include <bits/stdc++.h>
using namespace std;
const int MAXN=5005;
int a[MAXN],b[MAXN],c[MAXN],lc=1;
int main()
{
	int n;
	cin>>n;
	a[1]=1;
	b[1]=2;
	if(n==1){
		cout<<1;
		return 0;
	}
	if(n==2){
		cout<<2;
		return 0;
	}
	for(int i=3;i<=n;i++){
		memset(c,0,sizeof(c));
		for(int j=1;j<=lc;j++){
			c[j]+=a[j]+b[j];
			c[j+1]+=c[j]/10;
			c[j]%=10;
		}
		if(c[lc+1]>0)lc++;
		for(int j=1;j<=lc;j++){
			a[j]=b[j];
		}
		for(int j=1;j<=lc;j++){
			b[j]=c[j];
		}
	}
	for(int i=lc;i>=1;i--){
		cout<<c[i];
	}
	return 0;
}

结构体数组

#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
using namespace std;
struct student{
	string name;
	int age;
	int score;
};
struct teacher{
	string name;
	int age;
	struct student s[5];
};
void a(struct teacher stu[],int len){
	srand(time(NULL));
	int i,j;
	string nameseed="ABCDE";
	for(i=0;i<len;i++){
		int k=rand()%51+20;
		stu[i].name="Teacher_";
		stu[i].name+=nameseed[i];
		stu[i].age=k;
		for(j=0;j<5;j++){
			stu[i].s[j].name="Student_";
			stu[i].s[j].name+=nameseed[j];
			int l=rand()%31+10;
			stu[i].s[j].age=l;
			int x=rand()%61+40;
			stu[i].s[j].score=x;
		}
	}
}
void printinfo(struct teacher stu[],int len){
	int i,j;
	for(i=0;i<len;i++){
		cout<<"老师姓名:"<<stu[i].name
			<<" 老师年龄:"<<stu[i].age<<endl;
		for(j=0;j<5;j++){
			cout<<"\t学生姓名:"<<stu[i].s[j].name<<
				   " 学生年龄:"<<stu[i].s[j].age<<
				   " 学生分数:"<<stu[i].s[j].score<<endl; 
		}
	}
}
int main()
{
	int len;
	struct teacher stu[3];
	len=sizeof(stu)/sizeof(stu[0]);
	a(stu,len);
	printinfo(stu,len);
	return 0;
}

找质数

#include <bits/stdc++.h>
using namespace std;
bool isprime(int num){ 
	for(int i=2;i<=sqrt(num);i++){
		if(num%i==0) return false;
	}
	return true;
}
int main() {
	int num,x=0,count;
	long long sum=0;
	cin>>num;
	if(num<2) cout<<0<<endl;
	if(num==2) cout<<2<<"\n"<<1<<endl;
	for(int j=2;j<num;j++){
		count=j;
		if(sum+count>num){
			cout<<x<<endl;
			return 0;
		}
		if(isprime(count)){
		cout<<count<<endl;
		x++;
		sum+=count;
		}
	}
	return 0;
}
posted @ 2023-12-10 17:31  懒羊羊爱吃灰太狼  阅读(18)  评论(0)    收藏  举报