K-进制数

K-进制

题目描述
考虑包含N位数字的K-进制数. 定义一个数有效, 如果其K-进制表示不包含两连续的0.
例:
1010230 是有效的7位数
1000198 无效
0001235 不是7位数, 而是4位数.

给定两个数N和K, 要求计算包含N位数字的有效K-进制数的总数.

假设2 <= K <= 10; 2 <= N; 4 <= N+K <= 18.
输入
两个十进制整数N和K
输出
十进制表示的结果
样例输入
2
10
样例输出
90

首先进行题目分析:

首位绝对不能是零,两个0不能挨着。
首位不能是0,那么有k-1种选择,_是除了0以外的数,所以有k-1种选择
所以可以一步步的进行推断,可以连着,但是0后面必须是

_表示已经确定出来的,0就表示这一位上是零,X表示未确定的位数

假设是五位数
一开始这一串数字就是_xxxx
分析图
在这里插入图片描述

之后这个题就可以用dfs深度优先搜索来解题:
public class K进制 {
//	求和sum
	static int sum=0;
//	位数
	static int n;
//	进制
	static int k;
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		 n=sc.nextInt();
		 k=sc.nextInt();
		dfs(1,1);
		System.out.println(sum);
	}
//	length表示已经确定的长度(_,0都算),step代表_的个数
	private static void dfs(int length, int step) {
//		当length==n时,表明这一串已经确定好了(除了0就是_)
		if(length==n) {
			sum+=Math.pow(k-1, step);
			return;
		}
//	有一种情况当最后一位是X时,X变成0,就会出现一个X被0_代替,这个时候length会成为n+1,而step也会多出来一个_,
//	这时候step应当减一
		if(length==n+1) {
			sum+=Math.pow(k-1, step-1);
			return;
		}
//		深度优先搜索:
//			当X变成_时,length+1且step+1;
//		    当X变成0时,length+2,step+1 (因为0后面必定是_,所以length就直接确定两位,一位是0,另一位是_)
		for(int i=1;i<3;i++) {
			dfs(length+i, step+1);
		}
	}
}







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值