【学术】20道经典题代码汇总
【目录】
- 高精度加法
- 高精度减法
- 高精度乘法
- 高精度除以整型
- 高精度除法
- 并查集
- 树状数组(子区间的和)
- 快速幂取模
- 埃氏筛法
- 欧拉函数
- 哈希+宽搜(八数码问题)
- 全排列
- 有重复元素的全排列
- n的全排列
- 求n的r组合
- 汉诺塔问题
- 八皇后
- 自然数的拆分
- 手打快排
- 逆元
- 欧拉筛法
- 最短路减半问题
(未完待续)
【正文】
1.高精度加法
#include<bits/stdc++.h>
using namespace std;
string ra,rb;
int lena,lenb;
int a[1001],b[1001],ans[1001];
int main(){
cin>>ra;
cin>>rb;
lena=ra.size();
lenb=rb.size();
for(int i=lena;i>=1;i--){
a[i]=(int)(ra[lena-i]-'0');
}
for(int i=lenb;i>=1;i--){
b[i]=(int)(rb[lenb-i]-'0');
}
int len=max(lena,lenb);
for(int i=1;i<=len;i++){
ans[i]+=a[i]+b[i];
ans[i+1]=(ans[i]/10);
ans[i]%=10;
}
if(ans[len+1]){
len++;
}
for(int i=len;i>=1;i--){
printf("%d",ans[i]);
}
}
2.高精度减法
#include<bits/stdc++.h>
using namespace std;
char ra[301],rb[301],t[301];
int lena,lenb,len;
int a[1001],b[1001],ans[1001];
int main(){
cin>>ra;
cin>>rb;
lena=strlen(ra);
lenb=strlen(rb);
len=max(lena,lenb);
if(lena<lenb||lena==lenb&&strcmp(ra,rb)<0){
printf("-");
strcpy(t,ra);
strcpy(ra,rb);
strcpy(rb,t);
swap(lena,lenb);
}
for(int i=lena;i>=1;i--){
a[i]=(int)(ra[lena-i]-'0');
}
for(int i=lenb;i>=1;i--){
b[i]=(int)(rb[lenb-i]-'0');
}
/*for(int i=1;i<=lena;i++){
printf("%d",a[i]);
}
cout<<endl;
for(int i=1;i<=lenb;i++){
printf("%d",b[i]);
}*/
for(int i=1;i<=len;i++){
if(a[i]-b[i]<0){
a[i]+=10;
a[i+1]--;
}
ans[i]=a[i]-b[i];
}
bool flag=true;
for(int i=len;i>=1;i--){
if(ans[i]!=0){
flag=false;
}
if(!flag){
printf("%d",ans[i]);
}
}
if(flag){
printf("0");
}
}
3.高精度乘法
#include<bits/stdc++.h>
using namespace std;
char ra[301],rb[301];
int a[301],b[301],c[1001];
int lena,lenb;
int main(){
cin>>ra;
cin>>rb;
lena=strlen(ra);
lenb=strlen(rb);
for(int i=lena;i>=1;i--){
a[i]=(int)(ra[lena-i]-'0');
}
for(int i=lenb;i>=1;i--){
b[i]=(int)(rb[lenb-i]-'0');
}
int len=lena+lenb-1;
for(int i=1;i<=lena;i++){
for(int j=1;j<=lenb;j++){
c[i+j-1]+=(a[i]*b[j]);
c[i+j]+=(c[i+j-1]/10);
c[i+j-1]%=10;
}
}
while(c[len+1]){len++;}
for(int i=len;i>=1;i--){
printf("%d",c[i]);
}
}
4.高精度除以整型
#include <bits/stdc++.h>
using namespace std;
int len, a[1001], b, c[1001];
char ra[1001];
int main() {
cin >> ra;
scanf("%d", &b);
int x = 0;
len = strlen(ra);
for (int i = len; i >= 1; i--) {
a[i] = ra[len - i] - '0';
}
for (int i = len; i >= 1; i--) {
c[i] = (x * 10 + a[i]) / b;
x = (x * 10 + a[i]) % b;
}
while (len > 0 && c[len] == 0) {
len--;
}
for (int i = len; i >= 1; i--) {
printf("%d", c[i]);
}
if (len == 0)
printf("0");
cout << endl << x;
}
5.高精度除法
#include<bits/stdc++.h>
using namespace std;
char ra[1001],rb[1001];
int a[1001],b[1001],c[1001],t[1001];
int cmp(int a[],int b[]){
if(a[0]>b[0]){
return 1;
}
if(a[0]<b[0]){
return -1;
}
for(int i=a[0];i>=1;i--){
if(a[i]>b[i]){
return 1;
}
if(a[i]<b[i]){
return -1;
}
}
return 0;
}
void sub(int a[],int b[]){
int f=cmp(a,b);
if(f==0){
a[0]=0;
}
if(f==1){
for(int i=1;i<=a[0];i++){
if(a[i]<b[i]){
a[i+1]--;
a[i]+=10;
}
a[i]-=b[i];
}
while(a[0]>0&&a[a[0]]==0){
a[0]--;
}
}
}
int main(){
cin>>ra;
cin>>rb;
a[0]=strlen(ra);
b[0]=strlen(rb);
c[0]=a[0]-b[0]+1;
for(int i=1;i<=a[0];i++){
a[i]=ra[a[0]-i]-'0';
}
for(int i=1;i<=b[0];i++){
b[i]=rb[b[0]-i]-'0';
}
for(int i=c[0];i>=1;i--){
memset(t,0,sizeof(t));
t[0]=b[0]+i-1;
for(int j=1;j<=b[0];j++){
t[i+j-1]=b[j];
}
while(cmp(a,t)>=0){
c[i]++;
sub(a,t);
}
}
while(c[0]>0&&c[c[0]]==0){
c[0]--;
}
if(c[0]==0){
printf("0");
}else{
for(int i=c[0];i>=1;i--){
printf("%d",c[i]);
}
}
printf("\n");
if(a[0]==0){
printf("0");
}else{
for(int i=a[0];i>=1;i--){
printf("%d",a[i]);
}
}
}
6.并查集
#include<bits/stdc++.h>
using namespace std;
int n,m,z,x,y,p[10001];
int f(int x){
if(x==p[x]){
return x;
}else{
return p[x]=f(p[x]);
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)p[i]=i;
for(int i=1;i<=m;i++){
cin>>z>>x>>y;
if(z==1){
p[f(y)]=f(x);
}else{
if(f(p[x])==f(p[y])){
cout<<"Y"<<endl;
}else{
cout<<"N"<<endl;
}
}
}
}
7.树状数组(子区间的和)
#include<bits/stdc++.h>
using namespace std;
long long n,m,a[200001],tree[200001];
long long lowbit(long long x){
return x&-x;
}
long long sum(long long x){
long long sum=0;
while(x){
sum+=tree[x];
x-=lowbit(x);
}
return sum;
}
void update(long long x,long long y){
while(x<=200000){
tree[x]+=y;
x+=lowbit(x);
}
}
int main(){
scanf("%lld",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
update(i,a[i]);
}
char ch;
int x,y;
cin>>ch;
while(ch!='Q'){
if(ch=='P'){
scanf("%d%d",&x,&y);
printf("%d\n",sum(y)-sum(x-1));
}else if(ch=='-'){
scanf("%d%d",&x,&y);
update(x,-y);
}else if(ch=='+'){
scanf("%d%d",&x,&y);
update(x,y);
}
cin>>ch;
}
}
8.快速幂取模
#include<bits/stdc++.h>
using namespace std;
#define LL long long
LL n,m,mn;
LL ksm(LL a,LL b){
int r;
for(r=1;b;b>>=1,a=a*a%mn){
if(b&1){
r=r*a%mn;
}
}
return r;
}
int main(){
cin>>n>>m>>mn;
cout<<ksm(n,m)%mn;
}
9.埃氏筛法
#include<bits/stdc++.h>
using namespace std;
bool is_prime[10000001];
int main(){
int n;
scanf("%d",&n);
memset(is_prime,true,sizeof(is_prime));
is_prime[0]=is_prime[1]=false;
for(int i=2;i<=n;i++){
if(is_prime[i]){
for(int j=2;j*i<=n;j++){
is_prime[i*j]=false;
}
}
}
for(int i=1;i<n;i++){
if(is_prime[i]){
printf("%d\n",i);
}
}
}
10.欧拉函数
#include<bits/stdc++.h>
using namespace std;
int eular(int n){
int ans=n;
for(int i=2;i*i<=n;++i){
if(n%i==0){
ans=ans/i*(i-1);
while(n%i==0)n/=i;
}
}
if(n>1)ans=ans/n*(n-1);
return ans;
}
int main(){
int n;
scanf("%d",&n);
printf("%d",eular(n));
}
11.哈希+宽搜(八数码问题)
#include<cstdio>
#include<iostream>
using namespace std;
int ans[4][4],q[1000001][4][4],h[1000001],a[4][4];
int dx[5]={0,0,0,-1,1},dy[5]={0,-1,1,0,0};
int p[1000001];
int t=0,w=1;
int temp;
const int m=1000003;
bool flag=false;
int hash1(int x){
int y=(x-1)%m+1;
while(h[y]!=0&&h[y]!=x){
y++;
if(y>m)y=1;
}
return y;
}
bool check(){
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
if(q[t][i][j]!=ans[i][j]){
return false;
}
}
}
return true;
}
void bfs(){
while(t<w){
t++;
if(check()){
printf("%d",p[t]);
flag=1;
return ;
}
int x,y;
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
if(q[t][i][j]==0){
x=i;
y=j;
break;
}
}
}
for(int i=1;i<=4;i++){
int xx=dx[i]+x,yy=dy[i]+y;
if(xx>=1&&xx<=3&&yy>=1&&yy<=3){
w++;
for(int j=1;j<=3;j++){
for(int k=1;k<=3;k++){
q[w][j][k]=q[t][j][k];
}
}
q[w][xx][yy]=q[t][x][y];
q[w][x][y]=q[t][xx][yy];
p[w]=p[t]+1;
temp=0;
for(int j=1;j<=3;j++){
for(int k=1;k<=3;k++){
temp=temp*10+q[w][j][k];
}
}
if(h[hash1(temp)]==0){
h[hash1(temp)]=temp;
}else{
w--;
}
}
}
}
}
int main(){
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
scanf("%d",&q[w][i][j]);
temp=temp*10+q[w][i][j];
}
}
h[hash1(temp)]=1;
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
scanf("%d",&ans[i][j]);
}
}
bfs();
if(!flag){
printf("-1");
}
return 0;
}
12.全排列
#include<bits/stdc++.h>
using namespace std;
char a[10];
char b[10];
int n;
int vis[10];
void dfs(int x){
if(x==n) {
b[x]='\0';
printf("%s\n",b);
}
for(int i=0;i<n;i++)
if(vis[i]==0){
vis[i]=1;
b[x]=a[i];
dfs(x+1);
vis[i]=0;
}
}
int main() {
scanf("%s",a);
n=strlen(a);
dfs(0);
return 0;
}
13.有重复元素的全排列
#include<bits/stdc++.h>
using namespace std;
char a[101],b[101];
int n,sum,s[1001];
int dfs(int x){
if(x>n){
sum++;
cout<<sum<<":";
for(int i=1;i<=n;i++){
printf("%c",b[i]);
}
printf("\n");
}else{
for(int i=97;i<=123;i++){
if(s[i]){
b[x]=(char)i;
s[i]--;
dfs(x+1);
s[i]++;
}
}
}
}
int main(){
scanf("%s",a);
n=strlen(a);
for(int i=0;i<n;i++){
s[(int)a[i]]++;
}
dfs(1);
}
14.n的全排列
#include<bits/stdc++.h>
using namespace std;
int ans[11];
bool vis[11];
int len;
void f(int x){
if(x==len){
for(int i=0;i<len;i++){
printf("%d",ans[i]);
}
printf("\n");
return ;
}else{
for(int i=0;i<len;i++){
if(!vis[i]){
vis[i]=1;
ans[x]=i+1;
f(x+1);
vis[i]=0;
}
}
}
}
int main(){
scanf("%d",&len);
f(0);
}
15.求n的r组合
#include<bits/stdc++.h>
using namespace std;
int n,r,ans[1001],cnt;
bool vis[1001];
void dfs1(int x,int y){
if(y==0){
cnt++;
return;
}
for(int i=y;i<=x;i++){
dfs1(i-1,y-1);
}
}
void dfs(int x){
if(x>r){
for(int i=1;i<=r;i++){
printf("%d ",ans[i]);
}
printf("\n");
return ;
}else{
for(int i=1;i<=n;i++){
if(!vis[i]&&ans[x-1]<i){
ans[x]=i;
vis[i]=1;
dfs(x+1);
vis[i]=0;
}
}
}
}
int main(){
scanf("%d%d",&n,&r);
dfs1(n,r);
cout<<cnt<<endl;
dfs(1);
}
16.汉诺塔问题
#include<bits/stdc++.h>
using namespace std;
int n;
void dfs(int x,int a,int b,int c){
if(x==0){
return ;
}else{
dfs(x-1,a,c,b);
printf("%c->%d->%c\n",a,x,b);
dfs(x-1,c,b,a);
}
}
int main(){
char a,b,c;
scanf("%d %c %c %c",&n,&a,&b,&c);
dfs(n,a,b,c);
}
17.八皇后
#include<iostream>
#include<cstdio>
using namespace std;
int n=8,tot,m,g;
int a[14],b[14],c[30],d[30];
void sear(int x){
if(x==n+1){
tot++;
if(tot==g){
for(int i=1;i<=n;i++)
cout<<a[i];
cout<<endl;
}
return ;
}
for(int i=1;i<=n;i++)
if(!b[i]&&!c[x+i]&&!d[x-i+n]){
a[x]=i;
b[i]=1;
c[x+i]=1;
d[x-i+n]=1;
sear(x+1);
b[i]=0;
c[x+i]=0;
d[x-i+n]=0;
}
}
int main(){
cin>>m;
for(int i=1;i<=m;i++){
cin>>g;
tot=0;
sear(1);
}
return 0;
}
18.自然数的拆分
#include <bits/stdc++.h>
using namespace std;
int n, ans[31];
void dfs(int x,int y) {
if(x==0){
for(int i=1;i<y-1;i++){
printf("%d+",ans[i]);
}
printf("%d\n",ans[y-1]);
return ;
}
for(int i=1;i<n;i++){
if(x-i>=0&&i>=ans[y-1]){
ans[y]=i;
dfs(x-i,y+1);
ans[y]=0;
}
}
}
int main() {
scanf("%d", &n);
dfs(n,1);
}
19.手打快排
#include<stdio.h>
int a[1000],n,q;;
void qs(int a[],int l,int r)
{
if(l>=r) return;
int mid=(l+r)/2,i=l,j=r;
while(i<=j)
{
while(a[i]<a[mid]&&i<j) i++;//看看有没有那个数比基准数大的(左边)
while(a[j]>a[mid]&&i<j) j--;//看看有没有那个数比基准数小的(右边)
if(i<=j)
{//交换
int t=a[i];
a[i]=a[j];
a[j]=t;
i++;j--;//继续
}
}
qs(a,l,mid);//递归搜左边的
qs(a,mid+1,r);//递归搜右边的
}
int main()
{ scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
qs(a,1,n);
for(int i=1;i<=n;i++)
{
printf("%d ",a[i]);
}
return 0;
}
20.逆元
#include<bits/stdc++.h>
using namespace std;
long long x,y;
int oula(int x)
{
int ans=x;
for(int i=2;i*i<=x;i++){
if(x%i==0){
ans=ans/i*(i-1);
while(x%i==0){
x/=i;
}
}
}
if(x>1){
ans=ans-ans/x;
}
return ans;
}//~~显然,~~欧拉函数
long long ksm(long long a,long long b)
{
long long r=1;
while(b)
{
if(b&1)
{
r=(r*a)%y;
}
b>>=1;
a=a*a%y;
}
return r%y;
}//~~显然,~~快速幂
int main()
{
cin>>x>>y;
cout<<ksm(x,oula(y)-1);
return 0;
}//~~显然,主程序~~
21.欧拉筛法
#include<bits/stdc++.h>
using namespace std;
#define MAXN 10000005
int n,vis[MAXN],pri[MAXN],cnt=0;
int main()
{
scanf("%d",&n);
for(int i=2;i<n;i++)
{
if(!vis[i]) pri[++cnt]=i;
for(int j=1;j<=cnt && i*pri[j]<=n;j++)
{
vis[i*pri[j]]=1;
if(i%pri[j]==0) break;
}
}
for(int i=1;i<=cnt;i++) printf("%d\n",pri[i]);
return 0;
}
22.最短路减半问题
#include <bits/stdc++.h>
using namespace std;
int n, m, x, y, z, t, h[10005], dis[2][10005], last[2][10005];
struct road {
int to, s, next;
} a[20005];
queue<int> q;
void add(int x, int y, int z) {
t++;
a[t].to = y;
a[t].s = z;
a[t].next = h[x];
h[x] = t;
}
int main() {
cin >> n >> m;
for (int i = 1; i <= m; i++) {
cin >> x >> y >> z;
add(x, y, z);
add(y, x, z);
}
for (int i = 2; i <= n; i++) dis[1][i] = 1e9, dis[0][i] = 1e9, last[0][i] = 1e9, last[1][i] = 1e9;
q.push(1);
while (!q.empty()) {
int x = q.front();
q.pop();
for (int i = h[x]; i; i = a[i].next) {
int y = a[i].to;
int z = a[i].s;
if (dis[0][y] > dis[0][x] + z) {
dis[0][y] = dis[0][x] + z;
q.push(y);
}
if (dis[1][y] >= dis[0][x] + z / 2) {
dis[1][y] = dis[0][x] + z / 2;
last[0][y] = x;
last[1][y] = y;
q.push(y);
}
if (dis[1][y] >= dis[1][x] + z) {
last[0][y] = last[0][x];
last[1][y] = last[1][x];
dis[1][y] = dis[1][x] + z;
q.push(y);
}
}
}
cout << last[0][n] << ' ' << last[1][n] << endl;
cout << dis[1][n] << endl;
}
__EOF__

本文作者:zswangziye
本文链接:https://www.cnblogs.com/zswangziye/p/16056487.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/zswangziye/p/16056487.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
作者:zswagnziye
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】