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次方进制最大值,这个值作为上限,然后根据题目的条件进行遍历,累加就可以