第九届填空
第几天(对)
明码(卡住,debug太久了!逻辑没问题的时候,记得多找输出和赋值的代码)
乘积尾零(对)
测试次数(不会)
快速排序(代码填空题)
第几天
细心点
#include<iostream>
using namespace std;
int main()
{
int sum = 31 + 29 + 31 + 30 + 4;
cout << sum << endl;
return 0;
}
明码
- bieset[HTML_REMOVED] t; bitset存的是X位二进制的t。输入一个十进制的数字t,bitset数组自动将t转化为二进制的字符串。
- 简单推理
bitset:
#include<iostream>
#include<bitset>
#include<cstring>
using namespace std;
int main()
{
int n, m;
int len;
string temp;
while(cin >> n >> m)
{
bitset<8> t;
t = n;//第一个字节
cout << t ;
t = m;//第二个字节
cout << t << endl;
}
return 0;
}
简单推理:
如果没有bitset,怎么自己求出一个数字的二进制表示呢?
#include<iostream>
#include<bitset>
#include<algorithm>
#include<cstring>
using namespace std;
int bin[10];//数组越界问题啊艹!
int a[20][40];
void get(int x)
{
int idx = 8;
int t = abs(x);
while(t)
{
bin[idx] = t % 2;
t /= 2;
idx --;
}
//比如4
//---->
//idx 1 2 3 4 5 6 7 8
//bin x x x x x 1 0 0
// 0 0 0 0 0 1 0 0 4
//
//取反
//
// 1 1 1 1 1 1 0 0 -4 =
//自动补全x的部分·
for(int i = idx ; i >= 1; i --)
{
bin[i] = 0;
}
//负数补码求法:如果是负数的话,我们把每一位数都取反
//法1:先得到负数绝对值二进制,除第一位不变,其他位按位取反,再+1
//法2:最后一位向前,直到遇见第一个1,这个1之前的数取反
if(x < 0)
{
for(int i = 8; i >= 1; i --)
{
if(bin[i] == 1)//从左往右找,直到找到最后一个1
{
for(int j = 1; j < i; j ++)//从原码的最后一位数码位往前数,当遇到第一个1时停在此位置
{
if(bin[j] == 0)
{
bin[j] = 1;//啊这,这里写成i了,debug不出来,浪费了半小时
}
else
{
bin[j] = 0;
}
}
break;//操作完退出操作
}
}
}
if(x == 0)
{
for(int i = 1; i <= 8; i ++) bin[i] = 0;
}
//for(int i = 1; i <= 8; i ++) cout << bin[i];
}
int main()
{
for(int i = 0; i < 10; i ++)//10行数据
{
for(int j = 0; j < 32; j ++)//32行
{
cin >> a[i][j];
get(a[i][j]);
for(int k = 1; k <= 8; k ++)
{
if(bin[k] == 1)
{
cout << "*";
}
else
{
cout << " ";
}
}
if(j % 2 == 1)//两个字节占一行
{
cout << endl;
}
}
}
return 0;
}
乘积尾零
用python做的:
if __name__ == '__main__':
a = [5650, 4542, 3554, 473, 946, 4114, 3871 , 9073, 90 , 4329 ,
2758, 7949 , 6113, 5659 , 5245 , 7432 , 3051, 4434, 6704, 3594 ,
9937 , 1173 , 6866, 3397 , 4759, 7557, 3070 , 2287 , 1453 , 9899 ,
1486, 5722 , 3135, 1170 , 4014, 5510 , 5120 , 729 , 2880 , 9019 ,
2049 , 698, 4582, 4346, 4427 , 646 , 9742, 7340, 1230, 7683 ,
5693, 7015 , 6887 , 7381 , 4172 , 4341 , 2909, 2027, 7355, 5649 ,
6701, 6645 , 1671 , 5978, 2704 , 9926 , 295 , 3125 , 3878 , 6785 ,
2066 , 4247 , 4800 , 1578 , 6652 , 4616 , 1113, 6205 , 3264 , 2915,
3966 , 5291 , 2904 , 1285 , 2193 , 1428 , 2265 , 8730 , 9436 , 7074,
689, 5510 , 8243 , 6114 , 337 , 4096 , 8199 , 7313 , 3685 , 211 ]
sum = 1
for i in range(0, 100):
sum = sum * a[i]
print(sum)
# 0000000000 0000000000 0000000000 0
# 31
测试次数
快速排序
答案以及解释
#include <stdio.h>
#include<algorithm>
int quick_select(int a[], int l, int r, int k) {
int p = rand() % (r - l + 1) + l;
int x = a[p];
{int t = a[p]; a[p] = a[r]; a[r] = t;}
int i = l, j = r;
while(i < j) {
while(i < j && a[i] < x) i++;
if(i < j) {
a[j] = a[i];
j--;
}
while(i < j && a[j] > x) j--;
if(i < j) {
a[i] = a[j];
i++;
}
}
a[i] = x;
p = i;
if(i - l + 1 == k) return a[i];
if(i - l + 1 < k) return quick_select( a, i + 1, r, k - (i - l + 1)); //填空
else return quick_select(a, l, i - 1, k);
}
int main()
{
int a[] = {1, 4, 2, 8, 5, 7, 23, 58, 16, 27, 55, 13, 26, 24, 12};
printf("%d\n", quick_select(a, 0, 14, 5));
return 0;
}