数学问题--算法

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]的数整数,假如不能,那就是素数

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值