- 求一个数的幂次方,除了递归,还有更高效方法即快速幂方法
#include<iostream>
#include<string.h>
#include<algorithm>
#include<iomanip>
#include<stdlib.h>
using namespace std;
long long exp1(long long x,long long n){
long long y=1;
while(n>0){
if(n&1!=0) y*=x%1000;
n>>=1;
x*=x%1000;
}
return y%1000;
}
long long exp(long long x,long long n){
long long y=1;
while(n>0){
if(n&1!=0) y*=x;//奇数 按位与& 相当于n%2!=0
n>>=1;//移位符号>> 相当于n=n/2;
x*=x;
}
return y;
}
int main(){
cout<<exp1(3,24);
return 0;
}
扩展:求矩阵的快速幂(这里列举3*3矩阵的快速幂)
#include<iostream>
#include<string.h>
#include<algorithm>
#include<iomanip>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sstream>
using namespace std;
#define N 4
int ans[N][N],tmp[N][N];
int a[N][N];
void multi(int a[][N],int b[][N]) {
memset(tmp,0,sizeof(tmp));
for(int i=1; i<=N; i++) {
for(int j=1; j<=N; j++) {
for(int k=1; k<=N; k++) {
tmp[i][j]+=a[i][k]*b[k][j];
}
}
}
for(int i=1; i<=N; i++) {
for(int j=1; j<=N; j++)
a[i][j]=tmp[i][j];
}
}
void Pow(int a[][N],int n) {
memset(ans,0,sizeof(ans));
for(int i=1; i<=N; i++)
ans[i][i]=1;
while(n!=0) {
if(n&1==1) {
multi(ans,a);
}
multi(a,a);
n>>=1;
}
}
int main() {
int n;
cin>>n;
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
cin>>a[i][j];
}
}
Pow(a,n);
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
cout<<ans[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
- 求矩阵的转置
#include<iostream>
using namespace std;
void fun(int a[3][3]) {
int t,i,j;
for(int k=0; k<2; k++) {
i=j=k;
for(; i<3; i++) {
for(; j<3; j++) {
t=a[i][j];
a[i][j]=a[j][i];
a[j][i]=t;
}
}
}
for(i=0; i<3; i++) {
for(j=0; j<3; j++) {
cout<<a[i][j]<<" ";
}
cout<<endl;
}
}
int main() {
int i,j,k,a[3][3];
for(i=0; i<3; i++) {
for(j=0; j<3; j++) {
cin>>a[i][j];
}
}
fun(a);
return 0;
}
- 二叉树求深度高度
#include<iostream>
using namespace std;
void fun(int a[3][3]) {
int t,i,j;
for(int k=0; k<2; k++) {
i=j=k;
for(; i<3; i++) {
for(; j<3; j++) {
t=a[i][j];
a[i][j]=a[j][i];
a[j][i]=t;
}
}
}
for(i=0; i<3; i++) {
for(j=0; j<3; j++) {
cout<<a[i][j]<<" ";
}
cout<<endl;
}
}
int main() {
int i,j,k,a[3][3];
for(i=0; i<3; i++) {
for(j=0; j<3; j++) {
cin>>a[i][j];
}
}
fun(a);
return 0;
}
- 蛇形矩阵
#include<iostream>
#include<string.h>
#include<algorithm>
#include<vector>
#include<math.h>
using namespace std;
int a[100][100];
int main(){
int i,n,j,num=1;
cin>>n;
memset(a,0,sizeof(a));
i=0;
j=n-1;
a[i][j]=1;
while(num<n*n){
while(i+1<n&&!a[i+1][j])
a[++i][j]=++num;
while(j-1>=0&&!a[i][j-1])
a[i][--j]=++num;
while(i-1>=0&&!a[i-1][j])
a[--i][j]=++num;
while(j+1<n&&!a[i][j+1])
a[i][++j]=++num;
}
for(i=0;i<n;i++){
for(j=0;j<n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}
- 暴力
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int sum=0;
for(int a=0; a<=9; a++)
for(int b=0; b<=9; b++)
{
if(abs(b-a)==1||b==a) continue;
for(int c=0; c<=9; c++)
{
if(abs(c-b)==1||c==a||c==b) continue;
for(int d=0; d<=9; d++)
{
if(abs(d-a)==1||d==a||d==b||d==c) continue;
for(int e=0; e<=9; e++)
{
if(abs(e-a)==1||abs(e-b)==1||abs(e-d)==1||e==a||e==b||e==c||e==d) continue;
for(int f=0; f<=9; f++)
{
if(abs(f-a)==1||abs(f-b)==1||abs(f-c)==1||abs(f-e)==1||f==a||f==b||f==c||f==d||f==e) continue;
for(int g=0; g<=9; g++)
{
if(abs(g-b)==1||abs(g-c)==1||abs(g-f)==1||g==a||g==b||g==c||g==d||g==e||g==f) continue;
for(int h=0; h<=9; h++)
{
if(abs(h-d)==1||abs(h-e)==1||h==a||h==b||h==c||h==d||h==e||h==f||h==g) continue;
for(int i=0; i<=9; i++)
{
if(abs(i-d)==1||abs(i-e)==1||abs(i-f)==1||abs(i-h)==1||i==a||i==b||i==c||i==d||i==e||i==f||i==g||i==h) continue;
for(int j=0; j<=9; j++)
{
if(abs(j-e)==1||abs(j-f)==1||abs(j-g)==1||abs(j-i)==1||j==a||j==b||j==c||j==d||j==e||j==f||j==g||j==h||j==i) continue;
sum++;
}
}
}
}
}
}
}
}
}
cout<<sum<<endl;
return 0;
}
- 最大公约数最小公倍数
#include <iostream>
using namespace std;
int yue(int a,int b) {
if(b!=0) {
return yue(b,a%b);
} else
return a;
}
int bei(int a,int b){
return a*b/yue(a,b);
}
int main() {
int a,b,yueshu,beishu;
cin>>a>>b;
yueshu=yue(a,b);
beishu=bei(a,b);
cout<<yueshu<<endl;
cout<<beishu<<endl;
return 0;
}
- 给出最大公约数和最小公倍数
#include<iostream>
using namespace std;
int yue(int a,int b) {
if(b!=0) {
return yue(b,a%b);
} else
return a;
}
int bei(int a,int b){
return a*b/yue(a,b);
}
int main()
{
int x0,y0;
cin>>x0>>y0;
int count=0;
long long s=x0*y0;
for(int q=x0;q<=y0;q+=x0)
{
if(bei(q,s/q)==y0)
cout<<q<<" "<<s/q<<endl;
}
return 0;
}
- 判断素数
#include<iostream>
#include<math.h>
using namespace std;
int main() {
int i,a,b,c;
cin>>a;
bool flag=true;
for(i=2; i<=sqrt(a); i++) {
if(a%i==0) flag=false;
}
cout<<flag;
return 0;
}
- 判断闰年
#include <iostream>
using namespace std;
int main() {
int n,i;
cin>>n;
if((n%4==0&&n%100!=0)||(n%400==0)) {
cout<<"yes"<<endl;
} else
cout<<"no"<<endl;
return 0;
}
- 并查集
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
const int size=100;
int father[size];
int find(int x){
if(father[x]!=-1||father[x]!=1){
father[x]=find(father[x]);
}
return father[x];
}
void dfs(int x){
}
int main(){
memset(father,-1,sizeof(father));
int n,min1,max1,a[size];cin>>n;
cin>>a[1];
father[a[1]]=1;
min1=max1=a[1];
for(int i=2;i<=n;i++){
cin>>a[i];
min1=min(min1,a[i]);
max1=max(max1,a[i]);
father[a[i]]=1;
}
for(int i=1;i<min1;i++){
father[i]=0;
}
for(int i=1;i<=n;i++){
if(find(a[i])!=0||find(a[i])!=1){
dfs(a[i]);
}
}
return 0;
}