求给定数等于最少的几个完全平方数之和

1.数据数量少,单个数据大小不限

int MixFuntion(int n)
{
    int i = sqrt(n);
    if (i*i == n)
        return 1;
    int minLen = INT_MAX;
    for(;i*i >= n/2;i--)
    {
        int len = 1 + MinExpressionInteger(n - i*i);
        if (minLen > len)
            minLen = len;
    }
    return minLen;
}

先计算其中最大的一个平方数,如果等于i就返回1。

之后用递归的方式算出最大平方数为k*k时的len,在与最大平方数为其他值的情况进行比较,得出minlen

i

┌───┬──────┬───────────────┐

│          │                  │                   k*k                     │

└───┴──────┴───────────────┘


2数据数量大,单个数据小

const int MAX = 100000;
int MinNum[MAX+1] = {0};

int MixFuntion(int n ,int &mixLen)
{
    if(n > MAX)
        return 0;

    int i = sqrt(n);
    if(i*i == n)
    {
        MinNum[n] = 1;
        return 1;
    }
    int flag = 0;
    for(;i*i >= n/2;i--)
    {
        int num = n-i*i;
        if(!MinNum[num])
            MixFuntion(num);
        if(!MinNum[flag] || MinNum[flag]>MinNum[num])
            flag = num;
    }
    MinNum[n] = MinNum[flag] + 1;
    mixLen = MinNum[n];

    return 1;
}

方法是一样的,只不过拿了个数组记了一下。。。

















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值