- 问答
- 2025-01-22 22:07:28 @
注意评论区!
24 条评论
-
20090818Cc LV 4 @ 2025-03-17 17:48:34
??
-
2025-03-15 19:54:56@
二分查找pro
#include<iostream> using namespace std; int n,x,a[1005],l,r,m; int main(){ cin>>n; for(int i=1;i<n-1;i++){ cin>>a[i]; } cin>>x; l=0; r=n-1; while(l<=r){ m=(l+r)/2; if(a[m]==x){ cout<<m<<"\n"; return 0; } if(a[m]<x){ l=m+1; } else{ r=m-1; } } cout<<"-1\n"; }
-
2025-01-23 17:30:39@
sort排序
#include<bits/stdc++.h> using namespace std; /*sort排序*/ int main(){ int n,a[1005]; cin>>n; for(int i=0;i<n;i++){ cin>>a[i]; } sort(a,a+n); for(int i=n-1;i>=0;i--){ cout<<a[i]<<" "; } }
-
2025-01-22 22:45:47@
最长连续子序列
#include<iostream> using namespace std; /* 最长连续子序列 功能:找出数组中最长的连续递增子序列的长度 原理:遍历数组,记录当前连续递增的长度,更新最大长度 例如:[1,3,5,4,7,8,9]中最长连续递增子序列为[4,7,8,9] 输出:4(长度为4) */ int main(){ int n,a[1005],m=1,c=1; cin>>n; for(int i=0;i<n;i++){ cin>>a[i]; } for(int i=1;i<n;i++){ if(a[i]>a[i-1]){ c++; if(c>m){ m=c; } } else{ c=1; } } cout<<m<<"\n"; }
-
2025-01-22 22:45:20@
最大子数组和
#include<iostream> using namespace std; /* 最大子数组和 功能:找出数组中和最大的连续子数组的和 原理:遍历数组,维护当前和,如果当前和小于0则重新开始 例如:[-2,1,-3,4,-1,2,1,-5,4]的最大子数组和为6 过程:连续子数组[4,-1,2,1]的和为6,是最大的 */ int main(){ int n,a[1005],s=0,m=0; cin>>n; for(int i=0;i<n;i++){ cin>>a[i]; } for(int i=0;i<n;i++){ if(s>0){ s+=a[i]; } else{ s=a[i]; } if(s>m){ m=s; } } cout<<m<<"\n"; }
-
2025-01-22 22:44:47@
数字统计
#include<iostream> using namespace std; /* 数字统计 功能:统计一个数的所有数位中指定数字出现的次数 原理:不断取出个位数,与目标数字比较,计数 例如:统计12345中数字3出现的次数 过程:12345 -> 5不是3 -> 4不是3 -> 3是 -> 2不是3 -> 1不是3 输出:1(出现1次) */ int main(){ int n,x,c=0; cin>>n>>x; while(n>0){ if(n%10==x){ c++; } n=n/10; } cout<<c<<"\n"; }
-
2025-01-22 22:44:27@
二分查找
#include<iostream> using namespace std; /* 二分查找 功能:在有序数组中查找目标值的位置 原理:每次将区间分成两半,比较中间值与目标值的大小来缩小查找范围 时间复杂度:O(logn) 例如:在[1,2,3,4,5]中查找4 过程:中间值3<4,往右半部分[4,5]找,中间值4=4,找到 */ int main(){ int n,x,a[1005],l,r,m; cin>>n; for(int i=0;i<n;i++){ cin>>a[i]; } cin>>x; l=0; r=n-1; while(l<=r){ m=(l+r)/2; if(a[m]==x){ cout<<m<<"\n"; return 0; } if(a[m]<x){ l=m+1; } else{ r=m-1; } } cout<<"-1\n"; }
-
2025-01-22 22:27:25@
最小公倍数(LCM)
#include<iostream> using namespace std; /* 最小公倍数(LCM) 功能:求两个数的最小公倍数 原理:两数乘积除以最大公约数即为最小公倍数 例如:lcm(12,18) = 12*18/gcd(12,18) = 216/6 = 36 */ int main(){ int a,b,c,m; cin>>a>>b; m=a*b; while(b>0){ c=a%b; a=b; b=c; } cout<<m/a<<"\n"; }
-
2025-01-22 22:26:46@
最大公约数(辗转相除法/欧几里得算法)
#include<iostream> using namespace std; /* 最大公约数(辗转相除法/欧几里得算法) 功能:求两个数的最大公约数(GCD) 原理:gcd(a,b) = gcd(b,a%b),当b=0时,a即为最大公约数 例如:gcd(12,18) = 6 */ int main(){ int a,b,c; cin>>a>>b; while(b>0){ c=a%b; a=b; b=c; } cout<<a<<"\n"; }
-
2025-01-22 22:26:14@
组合数计算 C(n,m)
#include<iostream> using namespace std; /* 组合数计算 C(n,m) 功能:计算从n个不同元素中取m个元素的组合数 原理:C(n,m) = A(n,m)/A(m,m) = n!/(m!*(n-m)!) 例如:C(5,3) = 5!/(3!*2!) = (5*4*3)/(3*2*1) = 10 注意:结果可能很大,注意数据范围 */ int main(){ int n,m,a=1,b=1; cin>>n>>m; for(int i=1;i<=m;i++){ a=a*(n-i+1); b=b*i; } cout<<a/b<<"\n"; }
-
2025-01-22 22:25:49@
选择排序
#include<iostream> using namespace std; /* 选择排序 功能:将n个数从小到大排序 原理:每次从未排序部分找到最小值,放到已排序部分的末尾 时间复杂度:O(n^2) 例如:[5,3,4,1,2] -> [1,3,4,5,2] -> [1,2,4,5,3] -> [1,2,3,5,4] -> [1,2,3,4,5] */ int main(){ int n,a[1005],c,m; cin>>n; for(int i=0;i<n;i++){ cin>>a[i]; } for(int i=0;i<n-1;i++){ m=i; for(int j=i+1;j<n;j++){ if(a[j]<a[m]){ m=j; } } c=a[i]; a[i]=a[m]; a[m]=c; } for(int i=0;i<n;i++){ cout<<a[i]<<" "; } cout<<"\n"; }
-
2025-01-22 22:25:25@
完数判断
#include<iostream> using namespace std; /* 完数判断 功能:判断一个数是否是完数 原理:一个数等于它所有真因子(不包括自身的因子)之和 例如:6的真因子有1,2,3,1+2+3=6,所以6是完数 输出:是完数输出1,否则输出0 */ int main(){ int n,s=0; cin>>n; for(int i=1;i<n;i++){ if(n%i==0){ s=s+i; } } if(s==n){ cout<<"1\n"; } else{ cout<<"0\n"; } }
-
2025-01-22 22:24:50@
桶排序
#include<iostream> using namespace std; /* 桶排序 功能:将n个数从小到大排序 原理:统计每个数出现的次数,按顺序输出对应次数的数 时间复杂度:O(n+m),m为数据范围 例如:[2,3,2,1,3] -> [1出现1次,2出现2次,3出现2次] -> [1,2,2,3,3] */ int main(){ int n,a[1005],b[1005]={0},c; cin>>n; for(int i=0;i<n;i++){ cin>>c; b[c]++; } for(int i=0;i<1005;i++){ while(b[i]>0){ cout<<i<<" "; b[i]--; } } cout<<"\n"; }
-
2025-01-22 22:24:26@
水仙花数判断
#include<iostream> using namespace std; /* 水仙花数判断 功能:判断一个数是否是水仙花数 原理:一个n位数等于其各位数字的n次方之和 例如:153 = 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153 输出:是水仙花数输出1,否则输出0 */ int main(){ int n,t,m,s; cin>>n; t=n; s=0; while(t>0){ m=t%10; s=s+m*m*m; t=t/10; } if(s==n){ cout<<"1\n"; } else{ cout<<"0\n"; } }
-
2025-01-22 22:24:03@
排列数计算 A(n,m)
#include<iostream> using namespace std; /* 排列数计算 A(n,m) 功能:计算从n个不同元素中取m个元素的排列数 原理:A(n,m) = n*(n-1)*(n-2)*...*(n-m+1) 例如:A(5,3) = 5*4*3 = 60 注意:结果可能很大,注意数据范围 */ int main(){ int n,m,a=1; cin>>n>>m; for(int i=n;i>n-m;i--){ a=a*i; } cout<<a<<"\n"; }
-
2025-01-22 22:23:39@
冒泡排序
#include<iostream> using namespace std; /* 冒泡排序 功能:将n个数从小到大排序 原理:相邻元素比较,每轮将最大值移到末尾,像冒泡一样上浮 时间复杂度:O(n^2) 例如:[5,3,4,1,2] -> [3,4,1,2,5] -> [3,1,2,4,5] -> [1,2,3,4,5] */ int main(){ int n,a[1005],c; cin>>n; for(int i=0;i<n;i++){ cin>>a[i]; } for(int i=0;i<n;i++){ for(int j=0;j<n-1-i;j++){ if(a[j]>a[j+1]){ c=a[j]; a[j]=a[j+1]; a[j+1]=c; } } } for(int i=0;i<n;i++){ cout<<a[i]<<" "; } cout<<"\n"; }
-
2025-01-22 22:23:20@
快速排序(非递归实现)
#include<iostream> using namespace std; /* 快速排序(非递归实现) 功能:将n个数从小到大排序 原理:选择基准值将数组分成两部分,小于基准值的放左边,大于的放右边 时间复杂度:O(nlogn) 例如:[5,3,4,1,2] -> 以5为基准 -> [3,4,1,2,5] -> 以3为基准 -> [1,2,3,4,5] */ int main(){ int n,a[1005],l,r,c,i,j; cin>>n; for(i=0;i<n;i++){ cin>>a[i]; } l=0; r=n-1; int p[1005],t=0; p[t++]=l; p[t++]=r; while(t>0){ r=p[--t]; l=p[--t]; i=l; j=r; c=a[l]; while(i<j){ while(i<j && a[j]>=c) j--; if(i<j) a[i++]=a[j]; while(i<j && a[i]<=c) i++; if(i<j) a[j--]=a[i]; } a[i]=c; if(l<i-1){ p[t++]=l; p[t++]=i-1; } if(i+1<r){ p[t++]=i+1; p[t++]=r; } } for(i=0;i<n;i++){ cout<<a[i]<<" "; } cout<<"\n"; }
-
2025-01-22 22:22:55@
阶乘计算
#include<iostream> using namespace std; /* 阶乘计算 功能:计算n的阶乘(n!) 原理:n个正整数的乘积,n!=n*(n-1)*(n-2)*...*2*1 例如:5! = 5*4*3*2*1 = 120 注意:n不能太大,否则会溢出 */ int main(){ int n,m=1; cin>>n; for(int i=1;i<=n;i++){ m=m*i; } cout<<m<<"\n"; }
-
2025-01-22 22:22:25@
回文素数判断
#include<iostream> using namespace std; /* 回文素数判断 功能:判断一个数是否是真正的回文素数 原理:这个数是素数,且它的回文数也是素数(不包括回文数本身) 例如:113的回文数是311,两个都是素数,所以113是真正的回文素数 输出:是真正的回文素数输出1,否则输出0 */ int main(){ int n,m,t,k,p; cin>>n; k=1; for(int i=2;i*i<=n;i++){ if(n%i==0){ k=0; break; } } if(n==1){ k=0; } if(k==1){ t=n; m=0; while(t>0){ m=m*10+t%10; t=t/10; } if(m==n){ cout<<"0\n"; } else{ p=1; for(int i=2;i*i<=m;i++){ if(m%i==0){ p=0; break; } } if(m==1){ p=0; } cout<<p<<"\n"; } } else{ cout<<"0\n"; } }
-
2025-01-22 22:21:51@
回文数判断
#include<iostream> using namespace std; /* 回文数判断 功能:判断一个数是否是回文数 原理:将数字翻转后与原数相同 例如:12321翻转后还是12321,所以是回文数 输出:是回文数输出1,否则输出0 */ int main(){ int n,m,t; cin>>n; t=n; m=0; while(t>0){ m=m*10+t%10; t=t/10; } if(m==n){ cout<<"1\n"; } else{ cout<<"0\n"; } }
-
2025-01-22 22:21:29@
分割排序
#include<iostream> using namespace std; /* 分割排序(选择排序的一种变体) 功能:将n个数从小到大排序 原理:每次将当前位置的数与后面所有数比较,找到更小的就交换 时间复杂度:O(n^2) 例如:[5,3,4,1,2] -> [1,2,3,4,5] */ int main(){ int n,a[1005],b[1005],c; cin>>n; for(int i=0;i<n;i++){ cin>>a[i]; } for(int i=0;i<n-1;i++){ for(int j=i+1;j<n;j++){ if(a[i]>a[j]){ c=a[i]; a[i]=a[j]; a[j]=c; } } } for(int i=0;i<n;i++){ cout<<a[i]<<" "; } cout<<"\n"; }
-
2025-01-22 22:21:04@
斐波那契数列
#include<iostream> using namespace std; /* 斐波那契数列 功能:计算第n个斐波那契数 原理:每个数是前两个数的和,f(n)=f(n-1)+f(n-2),f(1)=f(2)=1 例如:n=5 过程:1,1,2,3,5 结果:5 */ int main(){ int n,a=1,b=1,c; cin>>n; if(n<=2){ cout<<"1\n"; } else{ for(int i=3;i<=n;i++){ c=a+b; a=b; b=c; } cout<<c<<"\n"; } }
-
2025-01-22 22:20:17@
翻转数字
#include<iostream> using namespace std; /* 翻转数字 功能:将一个整数的各位数字顺序翻转 原理:不断取出个位数(n%10),原数去掉个位(n/10),新数乘10加上个位 例如:1234 -> 4321 过程:1234 -> 4 -> 43 -> 432 -> 4321 注意:末尾是0的数字翻转后会丢掉0 */ int main(){ int n,m=0; cin>>n; while(n>0){ m=m*10+n%10; n=n/10; } cout<<m<<"\n"; }
-
2025-01-22 22:09:24@
插入排序
#include<iostream> using namespace std; /* 插入排序 功能:将n个数从小到大排序 原理:将每个数插入到已排序部分的合适位置,类似打牌时整理牌 时间复杂度:O(n^2) 例如:[5,3,4,1,2] -> [3,5,4,1,2] -> [3,4,5,1,2] -> [1,3,4,5,2] -> [1,2,3,4,5] */ int main(){ int n,a[1005],c,j; cin>>n; for(int i=0;i<n;i++){ cin>>a[i]; } for(int i=1;i<n;i++){ c=a[i]; j=i-1; while(j>=0 && a[j]>c){ a[j+1]=a[j]; j--; } a[j+1]=c; } for(int i=0;i<n;i++){ cout<<a[i]<<" "; } cout<<"\n"; }
- 1