题目:2698. 求一个整数的惩罚数
思路:枚举每一个i,将t=i*i转变为字符串形式s。通过位运算来选择字符串s的分割位置。细节看注释,时间复杂度为0(1000 * 2^6 * 6)
class Solution {
public:
int punishmentNumber(int n) {
int sum=0;
//枚举每一个i
for(int i=1;i<=n;i++){
//将t转变为字符串形式
int t=i*i;
string s=to_string(t);
int n=s.size();
//通过位运算来选择分割的位置
for(int j=0;j<(1<<n);j++){
int res=0;
int tmp=0;
for(int k=0;k<n;k++){
tmp=tmp*10+s[k]-'0';
if(j>>k&1){
res+=tmp;
tmp=0;
}
}
if(tmp) res+=tmp;
//如果当前的i已经满足,需跳出,避免重复
if(res==i){
sum+=t;
break;
}
}
}
return sum;
}
};