1、神奇的数字-6174
就是给定一个四位数,最大的全排列减去最小的全排列的结果反复运算,终会到达6174
思路是:给定一个四位的整形数组,使用algorithm的sort进行从大到小排列,然后通过两个函数进行最大(小)排列运算;
然后将结果也带入运算。
这道题难度低。
#include <algorithm>
#include <iostream>
using namespace std;
bool cmp(int a,int b){
return a>b;
}
int An(int a[]){
sort(a,a+4,cmp);
return a[0]*1000+a[1]*100+a[2]*10+a[3];
}
int Bn(int a[]){
sort(a,a+4,cmp);
return a[3]*1000+a[2]*100+a[1]*10+a[0];
}
int main(){
int sum,a[4];
cin>>sum;
while (1){
a[0]=sum/1000;
a[1]=(sum%1000)/100;
a[2]=(sum%100)/10;
a[3]=sum%10;
sum=An(a)-Bn(a);
cout<<An(a)<<"-"<<Bn(a)<<"=="<<An(a)-Bn(a)<<endl;
if (sum==0||sum==6174)
break;
}
return 0;
}
2、最大公约数与最小公倍数
最大公约数求解使用的是递归思想
递归式:gcd(a,b)==gcd(b,a%b)
逻辑边界:a%b==0
#include <iostream>
using namespace std;
int gcd(int a,int b){
if (a%b==0)
return b;
return gcd(b,a%b);
}
int main(){
int a, b;
while(1){
cin>> a>>b;
cout<<gcd(a,b);
}
return 0;
}
然后是最小公倍数,通过数学公式:lcm(a,b)==a*b/gcd(a,b)
为了防止出现溢出,可以改变运算顺序:lcm(a,b)==a/gcd(a,b)*b
3、找1000以内的素数表问题
两种问题解决方式
第一种:遍历每个数n,判断他能不能被[2,根号n]的数整数,假如不能,那就是素数