1.next_permutation
next_permutation只能获得下一个排列,如果要获得全排列,那么就需要先对数组进行升序排序
prev_permutation只能获得上一个排列,如果要获得全排列,那么就需要先对数组进行降序排序
基本定义如下:
next_permutaion(起始地址,末尾地址+1)(从小到大)
next_permutaion(起始地址,末尾地址+1,自定义排序)(从大到小)
int main()
{
int a[4]={2,1,4,3};
sort(a,a+4);
do{
for(int i=0;i<4;i++){
cout<<a[i]<<' ';
}
out<<endl;
}while(next_permutation(a,a+4)); //原来的数组会进行相应的全排列
}
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int num[10]={1,2,3,4,5,6,7,8,9};
int getsum(int begin,int end)//算从第begin位到第end位提取出来的数字
{
int s=0;
for(int k=begin;k<=end;k++)
{
s=s*10+num[k];
}
return s;//自定义函数不要忘记返回值
}
int main()
{
int n;
cin>>n;
int result=0;
while(next_permutation(num,num+9))
{
for(int i=0;i<=8;i++)
{
//算出a,b,c
int a=getsum(0,i);//从0位开始到第i位
if(a>n) continue;//continue;跳过当前循环立即进入下一个循环
for(int j=i+1;j<8;j++)//最后必须留一位给c
{
int b=getsum(i+1,j);
int c=getsum(j+1,8);
if((a+b/c==n)&&b%c==0&&b>=c)
result++;
}
}
}
cout<<result;
}
最大公约数
最大公约数定理:gcd(a,b)=gcd(a,b-a),因此gcd(a+k,b+k)=gcd(a+k,b-a)
因此a+k是c=b-a的倍数,k=c-a%c(c减去a求余剩下的)
#include <iostream>
using namespace std;
int main()
{
long long a,b;
cin>>a>>b;
long long c=b-a;
long long k=c-a%c;
cout<<k;
}
因子分析
pow(a,b)为a的b次方
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long max=59084709587505;
int ans=0;
for(long long i=0;pow(3,i)<=max;i++)
{
for(long long j=0;pow(5,j)<=max;j++)
{
for(long long k=0;pow(7,k)<=max;k++)
{if(pow(3,i)*pow(5,j)*pow(7,k)<=max)
ans++;}
}
}
cout<<(ans-1);
return 0;
}