题目:给你一个正整数n,请你返回n的惩罚数
n的惩罚数定义为所有满足以下条件的数的平方和
1<=i<=n
i*的十进制表示的字符串可以分割成若干连续子字符串,且这些子字符串对应的整数值之和等于i。
力扣原题:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
#include<stdio.h>
#include<stdbool.h>
//1.该数是某个整数的平方
//2.该数的各位数字可以通过重排得到该整数//dfs中 pos表示当前处理的字符串位置
// tot表示目前已经处理的数字之和
// target表示i的值,即要判断是不是i的平方
bool dfs(const char* s, int pos, int tot, int target) {
if (s[pos] == '\0') {
return tot == target;
}
int sum = 0;
for (int i = pos; s[i] != '\0'; i++) { //函数从pos开始遍历字符数组,将连续的数字字符转换成数字,累加到sum中,并与之前的tot相加
sum = sum * 10 + s[i] - '0';
if (sum + tot > target) { //如果sum + tot > target,说明当前的值已经超过了i的平方,因此退出循环。
break;
}
if (dfs(s, i + 1, sum + tot, target)) {
return true; //如果sum + tot = target,说明找到了符合要求的数,返回true。
}
}
return false;
}
int punishmentNumber(int n) { //函数punishmentNumber用来遍历1到n所有的数,找出符合条件的数,并将其平方的值加到res中返回
int res = 0;
char s[32];
for (int i = 1; i <= n; i++) {
sprintf(s, "%d", i * i); //用sprintf将当前i的平方转换成字符串
if (dfs(s, 0, 0, i)) { //函数dfs用来判断当前数是否符合条件
res += i * i; //若符合条件,将其平方的值加到res中。最后返回res,即为结果
}
}
return res;
}