题目来源于---牛客小白月赛79(用于自己学习和积累经验)
作对一道题的前提条件是看懂一道题。
我在这道题中犯了两个错误:
第一,我没有理解好“前导零”。
我认为,若我输入的第一个数为零,那么我就要把第一个数为零的情况单独讨论,并且用一个判断特地“划”掉这个零。虽然我发现了一点端倪,但是仍不知所以然。
好在学姐提醒了我,如果第一个数为零的话,它对数组来说是一个不合法的值,会被数组直接忽略。
第二,我没有习惯给数组赋初始变量,后来学姐教我使用了 const 创建变量,我之前是用#define ,但是再之前(今年国庆看数组的时候)用的是const。这里突然想展开来说。
第三,关于const和#denfine,展开来说;
当时我是用 C语言 这样写的 :
但是这样是会报错的(cpp不会),要是想实现这种情况,需要使用动态开辟空间的方法来定义数组,对于此方法,chatgpt如是说:
(这也太麻烦了)(杀鸡焉用牛刀?)
这到底是为什么呢?
这是因为数组的大小应该是个变量,而我上述代码的 n 被修饰为 只读变量,而ANSI C规定数组定义时的维度必须是常量。
那么应该怎么样去解决这个问题呢?
我们可以使用#define的宏定义或者直接给数组一开始就套上个很大的值。
但是在我使用了#define的宏定义,我发现#define不如const来得灵活,比如我使用了#define M 1e5 + 5,在接下来的使用于int类型的数组时,会出现类型不匹配的报错,而const就不会出现这种情况。
(话扯远了)
以下是我给出的数位dp的答案:
#include<stdio.h>
const int N = 1e5 + 5;
int main()
{
long long n;
scanf("%lld", &n);
int f = n;
int count = 0;
int nn = 0;
int s[N] = {0};
if( n%2 == 0 )
{
}else
{
int i;
for(i = 0; f>0; ++i)
{
int m = f%10;
s[i] = m;
f /= 10;
}
for(int j = 0; j<i; ++j)
{
if( s[j]%2 != 0 )
{
++count;
}
if( s[j+1]%2 == 0 )
{
break;
}
}
}
printf("%d", count);
return 0;
}
end()