- 给你一个正整数
num ,请你统计并返回 小于或等于 num 且各位数字之和为 偶数 的正整数的数目。
- 正整数的 各位数字之和 是其所有位上的对应数字相加的结果。
示例
- 示例 1:
- 输入: num = 4
- 输出: 2
- 解释:只有 2 和 4 满足小于等于 4 且各位数字之和为偶数。
- 示例 2:
- 输入: num = 30
- 输出: 14
- 解释:只有 14 个整数满足小于等于 30 且各位数字之和为偶数,分别是: 2、4、6、8、11、13、15、17、19、20、22、24、26 和 28 。
提示:
代码
function countEven(num: number): number {
let sum = 0;
for(let i = 1; i <= num; i++){
if(i < 10 && i % 2 === 0){
sum++;
}
if(i > 10 && i < 100){
let m = Math.floor(i / 10);
let n = i % 10;
if((m + n) % 2 === 0){
sum++;
}
}
if(i > 100 && i < 1000){
let m = Math.floor(i / 100);
let n = i % 10;
let k = Math.floor(i / 10) % 10;
if((m + n + k) % 2 === 0){
sum++;
}
}
}
return sum;
};
- 取值判断:
- 给定的
num范围是1-1000,就可以按照位数来区分,把每一位上的数字取出来相加,再判断是否是偶数。但是如果取值范围过大,这种就显得十分麻烦,代码量增多。
- 但对于本题范围内取值,判断取值节省时间和内存成本
function countEven(num: number): number {
let sum = 0;
for(let i = 1; i <= num; i++){
let count = 0;
let no = i;
while(no !== 0){
count += no % 10;
no = Math.floor(no / 10);
}
if(count % 2 === 0){
sum++
}
}
return sum;
};
- 位数遍历:
- 这一种就比较通用了,无论你的取值多少,都可以解决每一位的取值。将给到的数字每一位上的数字依次取出累加,如果和是偶数则统计
- 相较于本题的范围来说,时间和空间开销略大
结果:

