用c语言写一个代码:一个正整数的每一位都由 0 或 1 构成,我们就称这个数为 01 数。 现在给你一个任务,给你一个整数 n ,需要你计算出 1 ~ n 范围内有多少个 01 数。 输入格式 一行,一个整数 n。( 1 ≤ n ≤ 109) 输出格式 一个整数,表示 01 数的数量。
时间: 2024-02-09 12:11:05 浏览: 123
这个问题可以用动态规划(DP)来解决。我们可以从小到大枚举每个数字,然后根据上一个数字的01数,得到当前数字的01数。
具体来说,我们可以用两个状态来表示当前数字的01数:
- f0[i]:表示以数i的最后一位为0的01数的数量
- f1[i]:表示以数i的最后一位为1的01数的数量
对于一个数i,如果它的最后一位为0,则可以在它前面添加一个0或者1来得到一个新的01数,所以有:
- f0[i] = f0[i-1] + f1[i-1]
如果它的最后一位为1,则只能在它前面添加一个0来得到一个新的01数,所以有:
- f1[i] = f0[i-1]
最终的答案为f0[n] + f1[n]。
以下是完整的代码实现:
```c
#include <stdio.h>
int main() {
long long f0 = 1, f1 = 1, n, i, tmp;
scanf("%lld", &n);
for (i = 2; i <= n; i++) {
tmp = f0;
f0 = f0 + f1;
f1 = tmp;
}
printf("%lld\n", f0 + f1);
return 0;
}
```
注意在计算时,需要使用long long类型来存储f0和f1的值,因为它们可能非常大。
相关问题
一个正整数的每一位都由 0 或 1 构成,我们就称这个数为 01 数。 现在给你一个任务,给你一个整数 n ,需要你计算出 1 ~ n 范围内有多少个 01 数。C语言
好的,这是一个有趣的问题。我可以为您提供以下C语言代码来解决此问题:
```c
#include <stdio.h>
int count(int n) {
int dp[n + 1][2];
dp[0][0] = 1;
dp[0][1] = 1;
for (int i = 1; i <= n; i++) {
dp[i][0] = dp[i - 1][0] + dp[i - 1][1];
dp[i][1] = dp[i - 1][0];
}
return dp[n][0] + dp[n][1];
}
int main() {
int n;
printf("请输入一个整数n:");
scanf("%d", &n);
printf("1~%d范围内的01数有%d个。", n, count(n));
return 0;
}
```
在这个代码中,我们使用动态规划来解决这个问题。我们定义 `dp[i][0]` 表示 i 位 01 数中以 0 结尾的个数, `dp[i][1]` 表示 i 位 01 数中以 1 结尾的个数。根据这个定义,我们可以得到以下递推式:
```
dp[i][0] = dp[i - 1][0] + dp[i - 1][1]
dp[i][1] = dp[i - 1][0]
```
这个递推式的含义是,对于 i 位的 01 数,以 0 结尾的数可以由 i - 1 位的任意一个 01 数在末尾加上 0 得到,以 1 结尾的数只能由 i - 1 位的以 0 结尾的 01 数在末尾加上 1 得到。
最终的结果就是 `dp[n][0] + dp[n][1]`。
希望这个代码可以解决您的问题。
C语言对于一个正整数,若它只有0~9中的一种数字构成,我们就称其为好数。现在给你一个正整数,请判断它是否为好数。单组输入。一个正整数x(1<= x <= 10100000)若该数x是“好数”则输出“YES”。否则输出“NO”。(没有双引号)
您好!根据您的要求,以下是一个使用C语言实现的判断给定正整数是否为好数的示例代码:
```c
#include <stdio.h>
#include <stdbool.h>
bool isGoodNumber(unsigned long long num) {
char str[20]; // 假设正整数不超过20位
sprintf(str, "%llu", num);
for (int i = 0; str[i] != '\0'; i++) {
if (str[i] < '0' || str[i] > '9') {
return false;
}
}
return true;
}
int main() {
unsigned long long num;
scanf("%llu", &num);
if (isGoodNumber(num)) {
printf("YES\n");
} else {
printf("NO\n");
}
return 0;
}
```
您可以将要判断的正整数输入到`num`变量中进行测试。请注意,由于题目要求正整数的范围较大,超过了C语言中常用的数据类型范围,因此我们使用了`unsigned long long`类型来表示输入的正整数。另外,为了能够将正整数转换为字符串进行逐个检查,我们使用了`sprintf`函数。
希望能对您有所帮助!如有任何问题,请随时提问。
阅读全文