解题思路:
1.先求出 k位二进制数(因为其他进制数均可用二进制表示,eg.1个8进制 可用 3个二进制 表示) 所能表示的最大值s(即 2^k - 1); 2.再求出 该数可能的 最多位数m(即 w / k + 1),但是后面需要用到while(m --)循环,则不用 + 1 ; 3.循环 m-1 次(因为不考虑 1位数):每次从 s个数 中选2个,则有 s * (s - 1) / 2 种方案; 4.每次循环结束时,s 需要自减1 ,表示下一次 从 s-1个数 中选。
注意事项:
1.由于k≤9,w≤30000,则结果ans最大(k=9,w=30000)为 3 7678 24291 ,超过int的4字节的范围,所以得使用long long (实际测试中,使用int也可通过); 2.1 << k 表示 将1右移k位 ,相当于 2^k ; 3.由于ans为 全局变量,默认初始化为0 (否则得手动初始化)。
参考代码:
#include<stdio.h> int k, w, s; long long ans; int main(){ scanf("%d %d", &k, &w); s = (1 << k) - 1; int m = w / k;//该数最多可能为m + 1位数 while(m --){//m + 1位数,循环m次(循环到2位数则结束。eg.3位数,则循环2次) ans += s * (s - 1) / 2; s --; } printf("%lld", ans); return 0; }
0.0分
2 人评分
IP判断 (C语言代码)浏览:761 |
用筛法求之N内的素数。 (C++代码)浏览:692 |
C语言程序设计教程(第三版)课后习题5.6 (C语言代码)浏览:531 |
川哥的吩咐 (C语言代码)浏览:609 |
C语言程序设计教程(第三版)课后习题8.4 (C语言代码)浏览:565 |
小O的乘积 (C++代码)浏览:518 |
回文数(一) (C语言代码)浏览:1117 |
C语言程序设计教程(第三版)课后习题5.5 (C语言代码)浏览:446 |
很简单,,题解1041:C语言程序设计教程(第三版)课后习题9.8 (C语言代码)浏览:586 |
求教大神。。。。1063,统计字符。浏览:11684 |