2021-03-25

package 算法练习;

import java.util.Scanner;

public class k进制数 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in=new Scanner(System.in);
		//进制为w,位数限制k
		int w=in.nextInt();
		w=(int)Math.pow(2, w)-1;
		int k=in.nextInt();
	    //int i = ‘1’ + 1你可以试试它是多少,怎么样?
		int w1=w+1+48;
		char w2=(char)w1;
//		System.out.println(w2);
		//字符串用b表示,c表示数字长度
		String b=Integer.toString(k);
		int c=b.length();
        //最大值,是求二进制,转换成八进制数的最大值
		int max1=(int)Math.pow(2, k)-1;
//		System.out.println(max1);
//		System.out.println(w);
		int max=0;
		int p=0;
		while(max1!=0)
		{
			max+=max1%(w+1)*(int)Math.pow(10, p);
//			System.out.println(p);
//			System.out.println(max);
			p++;
			
			max1=max1/(w+1);
//			System.out.println(max1);
		}
//		System.out.println(max);
		int answer=0;
		for(int i=12;i<=max;i++)
		{
			//判断每位数字是否小于进制,判断前一个数字是否小于后一个数字
			//n表示每个数字循环的次数,e表示用字符串表示数字
			int n=Integer.toString(i).length();			
			String e=Integer.toString(i);
			int j=0;
			//比较比数字个数少一次
			for(j=0;j<n-1;j++)
			{
				if(e.charAt(j)>=e.charAt(j+1)||e.charAt(j)>w1)
				{
					break;
				}
			}

			//判断最后一位是否大于进制的数字
			if(j+1==n&&e.charAt(j)<w2)
			{
//				System.out.println(i);
				answer++;
			}
			}
		System.out.println(answer);
		}
	
	}



方法

1.关键在于拆分,多少进制,就拆分多少次
2.2进制最大值转10进制,10进制再转得2的k次方进制,得到的2的k次方进制最大值,这个值作为上限,然后根据题目的条件进行遍历,累加就可以
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值