数位dp?

题目来源于---牛客小白月赛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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值