一个整数如果按从低位到高位的顺序,奇数位 (个位、百位、万位 ⋯⋯ ) 上的数字是奇数,偶数位 (十位、千位、十万位 ⋯⋯ ) 上的数字是偶数,我们就称之为 “好数”。给定一个正整数 𝑁,请计算从 1 到 𝑁 一共有多少个好数。用c,c++两种方法给出“好数”的代码
时间: 2025-06-27 17:17:05 浏览: 12
### 计算从 1 到 N 的好数数量
#### 定义
好数定义为二进制表示中相邻两位数字不同的数。例如,在十进制下,`5` 是一个好数,因为其二进制形式 `101` 中每一位与其前后位均不同。
#### C 语言实现
下面是一个完整的 C 语言程序,用于计算给定整数 N 范围内的所有好数的数量:
```c
#include <stdio.h>
#include <stdbool.h>
bool isGoodNumber(int num) {
int prevBit = -1;
while (num > 0) {
int currentBit = num % 2;
if (prevBit != -1 && prevBit == currentBit) return false;
prevBit = currentBit;
num /= 2;
}
return true;
}
int countGoodNumbers(int n) {
int count = 0;
for (int i = 1; i <= n; ++i) {
if (isGoodNumber(i)) {
++count;
}
}
return count;
}
int main() {
int n;
printf("请输入N的值:");
scanf("%d", &n);
printf("从1到%d之间的好数共有:%d\n", n, countGoodNumbers(n));
return 0;
}
```
此代码首先定义了一个辅助函数 `isGoodNumber()` 来判断单个数字是否满足条件[^1]。接着实现了核心逻辑 `countGoodNumbers()` 函数遍历从 1 至 N 并调用上述方法统计好数数目。最后提供了简单的命令行界面让用户输入参数并显示结果。
#### C++ 实现
对于 C++ 版本,则可以利用标准模板库(STL),使某些操作更加简洁高效:
```cpp
#include <iostream>
using namespace std;
class GoodNumberCounter {
public:
static bool checkIfGood(long long number) {
long long previousDigit{-1};
while(number){
auto digit{number & 1};
if(previousDigit!=-1&&previousDigit==digit)return false;
previousDigit=digit;
number>>=1;
}
return true;
}
static int getGoodCount(const unsigned& limit) {
int counter{};
for(unsigned i{} ; i<=limit ; ++i )
if(checkIfGood(i))
++counter;
return counter;
}
};
int main(){
unsigned upperLimit{};
cout << "Enter the value of N:";
cin >> upperLimit ;
cout << "There are " << GoodNumberCounter::getGoodCount(upperLimit)
<< " good numbers between 1 and "<< upperLimit<<endl;
return 0;
}
```
这段代码同样完成了相同的功能,但是采用了面向对象的方式设计类 `GoodNumberCounter` 将功能封装起来,并且使用了更高效的按位运算代替取模和除法操作来处理二进制转换过程中的比较[^2]。
阅读全文
相关推荐


















