解题思路:
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 人评分
C语言程序设计教程(第三版)课后习题8.4 (Java代码)浏览:788 |
钟神赛车 (C++代码)浏览:905 |
C语言训练-计算一个整数N的阶乘 (C语言代码)浏览:982 |
小明A+B (C语言代码)浏览:1316 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:668 |
C语言程序设计教程(第三版)课后习题6.9 (C语言代码)浏览:805 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:591 |
本人酷爱递归实现很多问题,这里也是浏览:631 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:645 |
蚂蚁感冒 (C语言代码)浏览:1408 |