网易首页 > 网易号 > 正文 申请入驻

2026-09-17:判定好整数。用go语言,现有一个正整数 n。把它十进制写法中的每个数字拆出来,先累加这些数字,得到甲;再分别把每个数字平

0
分享至

2026-09-17:判定好整数。用go语言,现有一个正整数 n。把它十进制写法中的每个数字拆出来,先累加这些数字,得到甲;再分别把每个数字平方后累加,得到乙。如果乙减去甲的结果不少于五十,就认为这个数符合要求。请判断 n 是否符合要求:符合时输出 true,不符合时输出 false。

1 <= n <= 1000000000。

输入: n = 19。

输出: true。

解释:

19 的数字为 1 和 9。

digitSum 为 1 + 9 = 10。

squareSum 为 1² + 9² = 1 + 81 = 82。

squareSum - digitSum 为 82 - 10 = 72。由于 72 大于等于 50,因此输出 true。

题目来自力扣3959。

一、逐步骤拆解执行过程

第 0 步:入口与参数
main把 n = 19 传给checkGoodInteger。参数按值传递,函数内部对 n 的任何修改都不会影响调用方 —— 这一点很重要,因为下面的循环会破坏性地把 n 除到 0。

第 1 步:初始化累加器
diff := 0,用于存放「乙 − 甲」的最终结果。此时还没读入任何一位数字,贡献总和为 0。

第 2 步:进入循环前的判断
for ; n > 0; n /= 10的循环条件是n > 0。因为题目保证 n ≥ 1,所以循环至少执行一次;当 n 被除到 0 时说明所有位都处理完了,循环结束。(如果 n = 0,循环一次都不跑,diff 保持 0,返回 false —— 不过这不在题目范围内。)

第 3 步:取出当前最低位
d := n % 10,用「对 10 取余」拿到十进制的最右一位。注意取位顺序是从个位往高位走的,与题目描述的「从左到右」书写顺序相反,但如上所述,加法可交换,顺序不影响结果。

第 4 步:把这一位的贡献累加进 diff
diff += d*d - d。其中d*d是这一位对「乙」的贡献,d是这一位对「甲」的贡献,两者之差就是这一位对最终差值的净贡献。注意这里用的是整数乘法而不是浮点幂运算,避免了精度问题,也更快。

第 5 步:砍掉最低位,推进迭代
循环后置语句n /= 10执行整数除法,把已经处理过的最低位丢弃,原来的十位变成新的个位。此时若 n 仍大于 0,回到第 2 步继续;若 n 变成 0,说明最高位也处理完毕,退出循环。

第 6 步:得出判定结果
return diff >= 50。diff 此时恰好等于「乙 − 甲」。用>=对应题目里的「不少于五十」(含等于 50 的情形);若写成> 50就会在差值恰好为 50 时误判,这是个容易踩的边界点。返回值是 Go 的 bool 类型。

第 7 步:main 打印
fmt.Println(result)把 bool 按true/false(小写)输出并换行。

二、以 n = 19 为例的完整追踪

轮次

进入时 n

d = n % 10

d² − d

累加后 diff

结束后 n

初始

19

0

第 1 轮

19

9

81 − 9 = 72

0 + 72 = 72

1

第 2 轮

1

1

1 − 1 = 0

72 + 0 = 72

0

终止

0

循环条件 n > 0 不成立,退出

最终 diff = 72,72 ≥ 50 成立,返回true,程序打印true。

对照题目给的「分两步算」的口径验证:甲 = 1 + 9 = 10,乙 = 1 + 81 = 82,乙 − 甲 = 82 − 10 = 72 ≥ 50 → true。两种算法结果一致,说明第 2 步的等价变换没有改变语义。

三、几个值得留意的细节

  • •数字 0 和 1 是"零贡献"位:0² − 0 = 0、1² − 1 = 0,它们只增加位数不增加差值。所以 1000000000(1 后面九个 0)的所有位贡献都是 0,最终 diff = 0,结果是 false —— 位数多不代表符合。

  • •单调递增的累积过程:diff在整个循环中只会增加(每位贡献 d(d−1) ≥ 0),不会减少,因此不存在"后面被拉低"的情况。这也意味着理论上可以在 diff ≥ 50 时提前返回 true,但当前代码选择扫完全部位,逻辑更简单直接。

  • •数值范围安全:单个数字最大 9,贡献最大 72;即使 n 取上限 10⁹(10 位),diff 最大也只有 10 × 72 = 720,远在 int 范围内,不存在溢出。

  • •输入假设:代码没有对 n < 1 或 n > 10⁹ 做校验,依赖题目给出的约束;若输入可能为 0,则需要额外处理(当前实现会返回 false,语义上也可以接受)。

四、复杂度

设 n 的十进制位数为 k = ⌊log₁₀ n⌋ + 1。

  • •总时间复杂度:O(k),即 O(log₁₀ n),也就是 O(log n)。循环每轮砍掉一位,共执行 k 轮;每轮内部只做取余、乘法、减法、除法这些常数时间的基本运算,因此是 O(1) × k。由于题目限定 n ≤ 10⁹,k ≤ 10,循环次数被常数 10 卡住,所以在这个约束下也可以视作O(1)。若放宽到任意精度的大整数(比如用字符串读入),则严格是 O(k)。

  • •总的额外空间复杂度:O(1)。全程只用了diff、d两个局部变量(外加按值传入、原地修改的形参 n),没有开辟数组、字符串或任何与位数相关的数据结构,也不涉及递归调用栈。无论 n 是 1 位还是 10 位,占用的额外空间都是常数级别。

一句话总结:这段代码用一次「从低位到高位」的逐位扫描,把「平方和减数字和」合并为「每位贡献 d(d−1) 的累加」,一趟 O(log n) 时间、O(1) 额外空间就完成了判定。

Go完整代码如下:

package main

import (
"fmt"
)

func checkGoodInteger(n int) bool {
diff := 0
for ; n > 0; n /= 10 {
d := n % 10
diff += d*d - d
}
return diff >= 50
}

func main() {
n := 19
result := checkGoodInteger(n)
fmt.Println(result)
}

Python完整代码如下:

# -*-coding:utf-8-*-

def checkGoodInteger(n: int) -> bool:
diff = 0
while n > 0:
d = n % 10
diff += d * d - d
n //= 10
return diff >= 50

def main():
n = 19
result = checkGoodInteger(n)
print(result)

if __name__ == "__main__":
main()

C++完整代码如下:

  


bool checkGoodInteger(int n) {
int diff = 0;
while (n > 0) {
int d = n % 10;
diff += d * d - d;
n /= 10;
}
return diff >= 50;
}

int main() {
int n = 19;
bool result = checkGoodInteger(n);
std::cout << std::boolalpha << result << std::endl;
return 0;
}

我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
一轿车冲出路面坠崖司机仅受轻伤 当事司机:目测车辆坠落百米,现已报废,驾驶遇石块出事故

一轿车冲出路面坠崖司机仅受轻伤 当事司机:目测车辆坠落百米,现已报废,驾驶遇石块出事故

红星新闻
2026-10-13 00:03:33
73岁迟重瑞身体状况惹担忧!与继子赵勇现身保定,走路费劲,且左手的问题大

73岁迟重瑞身体状况惹担忧!与继子赵勇现身保定,走路费劲,且左手的问题大

裕丰娱间说
2026-10-11 09:56:12
中方:从不承认印度单方面非法设立的所谓“拉达克中央直辖区”,印方公布所谓“标准地名”是非法的、无效的

中方:从不承认印度单方面非法设立的所谓“拉达克中央直辖区”,印方公布所谓“标准地名”是非法的、无效的

南方都市报
2026-10-13 15:16:30
每经热评 | 大国重器“天眼”,岂能被旅游生意“迷了眼”

每经热评 | 大国重器“天眼”,岂能被旅游生意“迷了眼”

每日经济新闻
2026-10-13 14:29:07
全球媒体聚焦 | 沙特为何挡不住胡塞武装的袭击?

全球媒体聚焦 | 沙特为何挡不住胡塞武装的袭击?

国际在线
2026-10-12 20:52:35
钓鱼岛又爆发交锋,不等日本登岛,中国先出手,海警船搭载万发炮

钓鱼岛又爆发交锋,不等日本登岛,中国先出手,海警船搭载万发炮

经纬戎韬
2026-10-13 00:18:42
老师布置“不可描述”作业,家长愣住:往后这种暗号只会越来越多

老师布置“不可描述”作业,家长愣住:往后这种暗号只会越来越多

世界圈
2026-10-13 10:14:10
耐心正被消耗?巴基斯坦有识之士疾呼:别等被中国抛弃才悔不当初

耐心正被消耗?巴基斯坦有识之士疾呼:别等被中国抛弃才悔不当初

历史的烟火
2026-10-13 11:39:22
深圳一男子在铁仔山公园晨练时发现一条1米多长大蛇,当事人:以前也有遇到过,应该是条毒蛇,没敢凑太近;多位市民留言称在该公园见过蛇

深圳一男子在铁仔山公园晨练时发现一条1米多长大蛇,当事人:以前也有遇到过,应该是条毒蛇,没敢凑太近;多位市民留言称在该公园见过蛇

潇湘晨报
2026-10-13 16:02:18
又丢人了!希拉里公开羞辱特朗普:我真希望他正在看这场演讲!

又丢人了!希拉里公开羞辱特朗普:我真希望他正在看这场演讲!

霁寒飘雪
2026-10-13 14:32:05
俄军对乌克兰实施集群打击

俄军对乌克兰实施集群打击

新华社
2026-10-13 16:55:13
谭松韵亲自解答兰香结局遗憾,不戴红线的真相太好哭了

谭松韵亲自解答兰香结局遗憾,不戴红线的真相太好哭了

动物奇奇怪怪
2026-10-13 15:07:22
博主:巴林本来要参加泰王杯,但球队主帅想和中国过招

博主:巴林本来要参加泰王杯,但球队主帅想和中国过招

懂球帝
2026-10-13 17:19:52
红毯土疯了!马伊琍穿成地摊货 倪萍似地主婆 宋佳礼服写满野心

红毯土疯了!马伊琍穿成地摊货 倪萍似地主婆 宋佳礼服写满野心

一盅情怀
2026-10-11 14:46:29
重磅打虎!黄奇帆被查

重磅打虎!黄奇帆被查

新京报
2026-10-13 18:12:18
重磅:乌克兰前总司令西尔斯基称俄军的进攻能力已被瓦解!

重磅:乌克兰前总司令西尔斯基称俄军的进攻能力已被瓦解!

项鹏飞
2026-10-13 20:08:59
俄罗斯专家把话挑明了:如果中国铁了心要对日本动手,那就只有两个选择,要么不出手,要么一击毙命!

俄罗斯专家把话挑明了:如果中国铁了心要对日本动手,那就只有两个选择,要么不出手,要么一击毙命!

回京历史梦
2026-10-11 16:35:06
既然不让卖给中企,那就索性统统毁掉!英国巨头这回直接正面叫板欧盟:宁可自家关门歇业,也决不妥协,立场可以说是极其坚决

既然不让卖给中企,那就索性统统毁掉!英国巨头这回直接正面叫板欧盟:宁可自家关门歇业,也决不妥协,立场可以说是极其坚决

z千年历史老号
2026-10-13 09:53:20
田晨光任通辽市代市长 奇·达楞太辞去市长职务

田晨光任通辽市代市长 奇·达楞太辞去市长职务

中国经济网
2026-10-13 11:25:17
张雪峰离世后,武亮接手峰学蔚来被质疑转移公司财产、争夺股权,本人回应:现在要做的是让公司活下去,若志愿填报出问题将是毁灭性打击

张雪峰离世后,武亮接手峰学蔚来被质疑转移公司财产、争夺股权,本人回应:现在要做的是让公司活下去,若志愿填报出问题将是毁灭性打击

第一财经资讯
2026-10-13 19:24:52
2026-10-13 20:59:00
moonfdd incentive-icons
moonfdd
福大大架构师每日一题
1511文章数 83关注度
往期回顾 全部

科技要闻

扎克伯格宣布追上OpenAI!Meta新模型亮相

头条要闻

黄奇帆被查:早年在上海工作 2016年卸任重庆市市长

头条要闻

黄奇帆被查:早年在上海工作 2016年卸任重庆市市长

体育要闻

走调的歌声里全是感情 最好的郑钦文尚未登场

娱乐要闻

谭松韵亲自解答兰香结局遗憾

财经要闻

"黑医师"产业链调查:不学医竟能"拿证"

汽车要闻

平台可以共享 设计不能趋同:Stellantis的六个新答案

态度原创

教育
手机
亲子
房产
公开课

教育要闻

高中也能“登记入学、划片招生”?把国家改革方向和成都现状放在一起看

手机要闻

荣耀官宣WIN系列全家桶产品矩阵

亲子要闻

宝蓝和爸爸用娃娃机选材料,制作好看又好玩的的蛋糕~

房产要闻

巨无霸来了!海口百亿大盘,正式动工!

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版