首页 > 试题广场 >

数位平方和

[编程题]数位平方和
  • 热度指数:145 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

输入一个小于100的正整数n,输出一个最小正整数m,使得m的各位平方之和等于n。

示例1

输入

63

输出

1156

说明

63可以为7*7+3*3+2*2+1*1,或6*6+5*5+1*1+1*1或者是6*6+3*3+3*3+3*3等,可组合的数中最小的是1156
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 
 * @param n int整型 正整数
 * @return int整型
 */
function getNumber( n ) {
    // write code here
    let i = 1
    while (true) {
        let numArr = `${i}`.split('').map(item => parseInt(item))
        let count = 0
        for (let num of numArr) {
            count += Math.pow(num, 2)
        }
        if (count === n) {
            return i
        }
        i++
    }
}
module.exports = {
    getNumber : getNumber
};

发表于 2022-09-01 10:23:44 回复(0)
function getNumber( n ) {
    // write code here
    let dp=new Array(n+1).fill(0).map(()=>new Array(10).fill(Infinity));
    for(let i=0;i<=n;i++) dp[i][0]=999999;
    for(let j=0;j<=9;j++) dp[0][j]=0;
    for(let i=1;i<=n;i++){
        for(let j=1;j<=9;j++){
            //如果j*j大于i,则不能将j加入进来
            if(j*j>i) dp[i][j]=dp[i][j-1];
            else{
                let tmp=dp[i-j*j][j]+'';
                let arr=tmp.split('');
                arr.push(j+'');
                let num=Number(arr.sort().join(''));
                dp[i][j]=dp[i][j-1]<num?dp[i][j-1]:num;
            }
        }
    }
    return dp[n][9]
}
借鉴力扣硬币凑零钱那道题,将问题转化为硬币为[1,2,3,4,5,6,7,8,9],从中选择若干个,凑出n,a1^2+a2^2+a3^2+...=n
发表于 2022-08-30 21:01:35 回复(0)
怎没人
发表于 2021-04-16 18:04:03 回复(0)