【无标题】

题目:给你一个正整数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;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值