进制转换
- 将p进制数x转换为十进制数y
int x=121,q=8;
int y=0,product=1;
while(x!=0){
y=y+(x%10)*product;
x/=10;
product*=p;
}
- 将十进制数y转换为q进制数z
int y=81,q=8;
int z[40],num=0;
do{
z[num++]=y%q;//除基取余
y=y/q;
}while(y!=0);
for(int i=num-1;i>=0;i--){
cout<<z[i];
}
使用do···while语句而不是while的原因是如果十进制数y恰好等于0,那么while语句将使循环退出,导致结果出错,正确结果应该是数组z中存储了z[0]=0
回文数
// 枚举五位数
for (int i = 10000; i <= 99999; i++) {
int sum = 0, t = i;
while (t) {
sum += t % 10; // 取出个位数字并累加
t /= 10; // 去掉个位数字
}
if (sum == n) {
// 判断是否为回文数
int a = i / 10000, b = i % 10, c = i / 1000 % 10, d = i / 10 % 10;
if (a == b && c == d )
cout << i << endl;
}
}
判断闰年
#include <iostream>
using namespace std;
int main() {
int y;
cin>>y;
if(y%400==0 || y%4==0 && y%100 !=0)
cout<<"yes";
else cout<<"no";
return 0;
}
杨辉三角
#include <iostream>
using namespace std;
int main() {
int numRows;
cin>>numRows;
int triangle[numRows][numRows]; // 创建一个二维数组来存储三角形中的数字
// 填充三角形数组
for (int i = 0; i < numRows; i++) {
for (int j = 0; j <= i; j++) {
if (j == 0 || j == i) {
triangle[i][j] = 1;
} else {
triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j];
}
}
}
// 输出结果
for (int i = 0; i < numRows; i++) {
for (int j = 0; j <= i; j++) {
cout << triangle[i][j] << " ";
}
cout << endl;
}
return 0;
}
并查集
//查找
int findFather(int x)
{
int a=x;
while(x!=father[x]){
x=father[x];
}
//路径压缩
while(a!=father[a]){
int z=a;
a=father[a];
father[z]=x;
}
return x;
}
//合并
void Union(int a,int b)
{
int faA=findFather(a);
int faB=findFather(b);
if(faA!=faB){
father[faA]=faB;
}
}
例题
样例输入
7 5
1 2
2 3
3 1
1 4
5 6
样例输出
3
Code
#include<bits/stdc++.h>
using namespace std;
const int N=110;
int father[N];
bool isRoot[N];
int findFather(int x)
{
int a=x;
while(x!=father[x]){
x=father[x];
}
//路径压缩
while(a!=father[a]){
int z=a;
a=father[a];
father[z]=x;
}
return x;
}
void Union(int a,int b)
{
int faA=findFather(a);
int faB=findFather(b);
if(faA!=faB){
father[faA]=faB;
}
}
void init(int n)
{
for(int i=1;i<=n;i++){
father[i]=i;
isRoot[i]=false;
}
}
int main()
{
int n,m,a,b;
cin>>n>>m;
init(n);
for(int i=0;i<m;i++){
cin>>a>>b;
Union(a,b);
}
for(int i=1;i<=n;i++){
isRoot[findFather(i)]=true;
}
int ans=0;
for(int i=1;i<=n;i++){
ans+=isRoot[i];
}
cout<<ans;
return 0;
}
注意 如果需要统计集合内元素个数,则将isRoot数组改为int型
二分查找
//二分查找 [left,right] 传入初始值[0,n-1] 查找失败返回-1
int binarySearch(int A[], int left ,int right, int x)
{
int mid;
while(left<=right){
mid=left+(right-left)/2;
if(A[mid]==x) return mid;
else if(A[mid]>x){
right=mid-1;
}else{
left=mid+1;
}
}
return -1;
}
//返回第一个大于等于x的位置 传入初始值[0,n]
int lower_bound(int A[], int left ,int right, int x)
{
int mid;
while(left<right){
mid=left+(right-left)/2;
if(A[mid]>=x){
right=mid;
}else{
left=mid+1;
}
}
return left;
}
//返回第一个大于x的位置 传入初始值[0,n]
int upper_bound(int A[], int left ,int right, int x)
{
int mid;
while(left<right){
mid=left+(right-left)/2;
if(A[mid]>x){
right=mid;
}else{
left=mid+1;
}
}
return left;
}
初始化
#include<bits/stdc++.h>
using namespace std;
const int maxn=10;
int main() {
int num[maxn];
//赋初值0 memset比较快,但是最好只用来赋初值为0
memset(num,'\0',sizeof(num));
for(int i=0;i<maxn;i++){
cout<<num[i]<<" ";
}
cout<<endl;
//赋初值 任意赋值
fill(num,num+maxn,2);
for(int i=0;i<maxn;i++){
cout<<num[i]<<" ";
}
return 0;
}