解析:2的四次方等于16,因此4位二进制可以写成一位十六进制。
解析:哈夫曼编码采取贪心思想,它实际上是构建了一棵二叉树,每次取出权重最小的两个点合并成新的点,新点权重为原来权重的和。最后这个点编码长度就是所在深度−1。这题最后的二叉树形态如下图所示,此时200对应的点深度为4,其编码长度为3。
解析:本题答案为22366472011,观察题目中给出的map子串,我们可以发现题目要求输出在九键输入法下的每个数字或字母对应的按键。
解析:本题答案为3,这个程序是在找二分之n加一位上的数,a是计数器数组,统计数字出现的次数
解析:本题答案为20,这道题运用的了递归,可以借助表格来计算 最后可以发现solve(n,m)=solve(n,m-1)+solve(n-1,m-1)
#include <iostream>
using namespace std;
const int SIZE = 50;
int n1, m1, n2, m2, a[SIZE][SIZE], b[SIZE][SIZE];
int main(){
int i, j, k1, k2;
bool good, haveAns;
cin>>n1>>m1;
for (i = 1; i <= n1; i++)
for (j = 1; j <= m1; j++)
cin>>a[i][j];
cin>>n2>>m2;
for (i = 1; i <= n2; i++)
for (j = 1; j <= m2; j++)
①;
haveAns = false;
for (i = 1; i <= n1 - n2 + 1; i++)
for (j = 1; j <= ②; j++){
③;
for (k1 = 1; k1 <= n2; k1++)
for(k2 = 1; k2 <= ④; k2++) {
if (a[i + k1 - 1][j + k2 - 1] != b[k1][k2])
good = false;
}
if (good) {
cout<<i<<' '<<j<<endl;
⑤;
}
}
if (!haveAns)
cout<<"There is no answer"<<endl;
return 0;
}
解析:答案如下
填空位置 ①:
cin>>b[i][j]
填空位置 ②:
m1 - m2 + 1
填空位置 ③:
good = true
填空位置 ④:
m2
填空位置 ⑤:
haveAns = true
可以发现一开始并没有读入b,所以第一空就应该是读入。然后下面是一个暴力的枚举,其中i和j变量的枚举表示子矩阵在 A中的起点。k1,k2在枚举子矩阵的长度。根据上一个for的条件可以推出第二空和第四空。第三空联系上下文应该是给 good赋初值,最后一空要注意不是跳出循环应该是修改haveans的值。
#include <iostream>
#include <string>
using namespace std;
const int SIZE = 200;
struct hugeint {
int len, num[SIZE];
};
//其中 len 表示大整数的位数;num[1]表示个位、num[2]表示十位,以此类推
hugeint times(hugeint a, hugeint b) {
//计算大整数 a 和 b 的乘积
int i, j; hugeint ans;
memset(ans.num, 0, sizeof(ans.num));
for (i = 1; i <= a.len; i++)
for (j = 1; j <= b.len; j++)
①+= a.num[i] * b.num[j];
for (i = 1; i <= a.len + b.len; i++) {
ans.num[i + 1] += ans.num[i] / 10;
②;
}
if (ans.num[a.len + b.len] > 0)
ans.len = a.len + b.len;
else
ans.len = a.len + b.len - 1;
return ans;
}
hugeint add(hugeint a, hugeint b){
//计算大整数 a 和 b 的和
int i; hugeint ans;
memset(ans.num, 0, sizeof(ans.num));
if (a.len > b.len)
ans.len = a.len;
else
ans.len = b.len;
for (i = 1; i <= ans.len; i++) {
ans.num[i] +=③;
ans.num[i + 1] += ans.num[i] / 10;
ans.num[i] %= 10;
}
if (ans.num[ans.len + 1] > 0) ans.len++;
return ans;
}
hugeint average(hugeint a, hugeint b){
//计算大整数 a 和 b 的平均数的整数部分
int i; hugeint ans;
ans= add(a, b);
for(i = ans.len; i >= 2; i--) {
ans.num[i - 1] += (④) * 10;
ans.num[i] /= 2;
}
ans.num[1] /= 2;
if (ans.num[ans.len] == 0) ans.len--;
return ans;
}
hugeint plustwo(hugeint a) {
//计算大整数 a 加 2 后的结果
int i; hugeint ans;
ans = a;
ans.num[1] += 2;
i = 1;
While ((i <= ans.len) && (ans.num[i] >= 10)) {
ans.num[i + 1] += ans.num[i] / 10;
ans.num[i] %= 10;
i++;
}
if (ans.num[ans.len + 1] > 0)⑤;
return ans;
}
bool over(hugeint a, hugeint b){
//若大整数 a>b 则返回 true,否则返回 false
int i;
if (⑥) return false;
if (a.len > b.len) return true;
for (i = a.len; i >= 1; i--) {
if (a.num[i] < b.num[i])return false;
if (a.num[i] > b.num[i]) return true;
}
return false;
}
int main(){
string s;
int i;
hugeint target, left, middle, right;
cin>>s;
memset(target.num, 0, sizeof(target.num));
target.len = s.length();
for (i = 1; i <= target.len; i++)
target.num[i]= s[target.len - i] - ⑦;
memset(left.num, 0, sizeof(left.num));
left.len = 1;
left.num[1] = 1;
right = target;
do {
middle = average(left, right);
if (over(⑧))right = middle;
else left = middle;
} while (!over(plustwo(left), right));
for (i = left.len; i >= 1; i--)
cout<<left.num[i];
cout<<endl;
return 0;
}
解析:答案如下
填空位置 ①:
ans.num[i + j - 1]
填空位置 ②:
ans.num[i] %= 10
填空位置 ③:
a.num[i] + b.num[i]
填空位置 ④:
ans.num[i] % 2
填空位置 ⑤:
ans.len
填空位置 ⑥:
a.len < b.len
填空位置 ⑦:
‘0’
填空位置 :
times(middle, middle), target
快速浏览一下这题,二分法+高精度,然后看各个函数过程的功能。可以知道 add 就是加,看这个函数 add 里面,的确是 a+b,然后就可以很快得出 ③,注意之前有进位,它还要加上它自己。
既然这一模块唯一的空已经很快填好了,就可以不看这块了,知道这是个 a+b 的函数就行了。接下来看到 average,average 就是平均,看主过程,middle=average(left,right);这是求 a 和 b 的平均值,里面有个 ④,可以轻松看出 ④ 所在的循环是 ans 已经等于 a+b 了,现在正在除以 2。模拟笔算用的竖式除法,可以知道 ④ 这个地方是退位,就用 ans.num[i] %2就行了。
然后看到 plustwo,plustwo 的意思就是“加二”,这里面只有一个空,是 ⑤。不用看上面,只看 ⑤ 所在的 if 语句,就知道这里应该是对 ans.lenans.len 的修正,应该填ans.len。
再看到 overover,在主程序里知道这是个二分用的判断函数。看到 over中的if( a.len>b.len)这段,得知如果 aa 比 bb 长,也就是 aa 比 bb 大,那 overover 就为真。看来这个 over 就是个比大小的函数,a>b 为真,a<b为假。 ⑥ 所在的地方与下面类似,所以写上a.len<b.len。
还有一个函数没看到,那就是 times,times就是乘法这是个 a\times a×b的高精度乘法函数,从而可以轻易写出 ① 和 ②
最后主程序还有两个空,第一个空 ⑦ 是字符转数字,较简单;第二个空是在 over()over() 里面,而且可以发现,整个程序都没用到 timestimes,肯定是这里用了。最后联系上下文,得出这里是 times(middle,middle),target,比较 middle的平方与 target。