解题思路:我的方法就是上来就把几种可能罗列出来,然后找规律,这种方法可能巨慢(反正我想了半天)
注意事项:以r转换为二进制后的最少位数开始,可能的次数为(2^k-2)+(2^k-3)+...+1,其中相加的数一共有2^k-2个(也就是内循环为2^k-2次),然后再往前加一位(从右往左),一直加到w(外循环),每加一位次数少1
参考代码:
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=1,s=0,i,j,m=1;
int k=sc.nextInt();
int w=sc.nextInt();
if(k==1){
s=1;
}//当k为1时,为2进制,r只有一种可能
else{
for(i=0;i<k;i++){
n=n*2;
}//判断进制数
for(i=0;i<w-2*k;i++){
m=m*2;
}//2*k是当前进制转换为2进制后的最低位数(比如8进制转换为2进制后最少要有6位)
//w-2*k是输入的位数比最低位数多的位数,因为2进制只有0和1,所以所有可能的次数为m
for(j=0;j<m;j++){
for(i=0;i<n-2-j;i++){//每外循环一次,就往前多一位(从右往左)
s=n-i-2+s-j;//每加一位少一次
}
}
}
System.out.print(s);
}
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复