題目一:第幾天
2000年的1月1日,是那一年的第1天押袍。
那么,2000年的5月4日凯肋,是那一年的第幾天谊惭?
注意:需要提交的是一個整數(shù),不要填寫任何多余內(nèi)容侮东。
答案:125天
解法:
新建文本文檔 1.vbs
msgbox dateadd("d",124,"2000-1-1")
1+124=125天
題目二:明碼
漢字的字形存在于字庫中圈盔,即便在今天,16點陣的字庫也仍然使用廣泛苗桂。
16點陣的字庫把每個漢字看成是16x16個像素信息药磺。并把這些信息記錄在字節(jié)中。
一個字節(jié)可以存儲8位信息煤伟,用32個字節(jié)就可以存一個漢字的字形了癌佩。
把每個字節(jié)轉(zhuǎn)為2進(jìn)制表示,1表示墨跡便锨,0表示底色围辙。每行2個字節(jié),
一共16行放案,布局是:
第1字節(jié)姚建,第2字節(jié)
第3字節(jié),第4字節(jié)
....
第31字節(jié), 第32字節(jié)
這道題目是給你一段多個漢字組成的信息吱殉,每個漢字用32個字節(jié)表示掸冤,這里給出了字節(jié)作為有符號整數(shù)的值。
題目的要求隱藏在這些信息中友雳。你的任務(wù)是復(fù)原這些漢字的字形稿湿,從中看出題目的要求,并根據(jù)要求填寫答案押赊。
這段信息是(一共10個漢字):
4 0 4 0 4 0 4 32 -1 -16 4 32 4 32 4 32 4 32 4 32 8 32 8 32 16 34 16 34 32 30 -64 0
16 64 16 64 34 68 127 126 66 -124 67 4 66 4 66 -124 126 100 66 36 66 4 66 4 66 4 126 4 66 40 0 16
4 0 4 0 4 0 4 32 -1 -16 4 32 4 32 4 32 4 32 4 32 8 32 8 32 16 34 16 34 32 30 -64 0
0 -128 64 -128 48 -128 17 8 1 -4 2 8 8 80 16 64 32 64 -32 64 32 -96 32 -96 33 16 34 8 36 14 40 4
4 0 3 0 1 0 0 4 -1 -2 4 0 4 16 7 -8 4 16 4 16 4 16 8 16 8 16 16 16 32 -96 64 64
16 64 20 72 62 -4 73 32 5 16 1 0 63 -8 1 0 -1 -2 0 64 0 80 63 -8 8 64 4 64 1 64 0 -128
0 16 63 -8 1 0 1 0 1 0 1 4 -1 -2 1 0 1 0 1 0 1 0 1 0 1 0 1 0 5 0 2 0
2 0 2 0 7 -16 8 32 24 64 37 -128 2 -128 12 -128 113 -4 2 8 12 16 18 32 33 -64 1 0 14 0 112 0
1 0 1 0 1 0 9 32 9 16 17 12 17 4 33 16 65 16 1 32 1 64 0 -128 1 0 2 0 12 0 112 0
0 0 0 0 7 -16 24 24 48 12 56 12 0 56 0 -32 0 -64 0 -128 0 0 0 0 1 -128 3 -64 1 -128 0 0
思路:將兩個數(shù)字(16位)為一行轉(zhuǎn)換為二進(jìn)制排列成16*16方陣
方法一:
#include<iostream>
using namespace std;
int main()
{
int m,n,w[16];
while(cin>>m>>n)
{
for(int i=7;i>=0;i--)//二進(jìn)制從右邊開始數(shù)7~0
{ //轉(zhuǎn)換為二進(jìn)制
w[i]=m&1;//同1進(jìn)行與操作
m>>=1;//右移一位(除2)
}
for(int i=15;i>=8;i--)
{
w[i]=n&1;
n>>=1;
}
for(int i=0;i<=15;i++)//正向輸出
{
cout<<w[i];
}
cout<<endl;
}
return 0;
}
方法二:
#include<iostream>
#include<bitset>
using namespace std;
int main(){
int n,m;
while(cin>>n>>m){
bitset<8> t;//t為二進(jìn)制8位 biset<length> t
t=n;//將n賦給t饺藤,即將n轉(zhuǎn)化為8位二進(jìn)制
cout<<t;//輸出n的8位二進(jìn)制
t=m;//將m賦給t,即將n轉(zhuǎn)化為8位二進(jìn)制
cout<<t<<endl;//輸出n的8位二進(jìn)制
}
return 0;
}
將上方所有信息復(fù)制運行流礁,得到如下圖所示九的九次方等于多少涕俗?
答案:387420489
思路2:如果你懶得編程,那么可以用Excel來處理神帅,里面有自帶的公式可以把十進(jìn)制轉(zhuǎn)換成二進(jìn)制再姑。首先把上述數(shù)據(jù)復(fù)制到txt里,按照兩個一行排好找御,然后導(dǎo)入Excel询刹,用公式DEC2BIN(num,8)就行了谜嫉,這里的8就是位數(shù),然后我不知道為什么負(fù)數(shù)出來都是10位的凹联,所以我讓他們都靠右,然后把第二列寬度調(diào)小了哆档,讓他們看起來是連在一起的蔽挠。如果你覺得不夠清楚,可以調(diào)成黑底白字(參考自網(wǎng)上)
題目三:乘積尾零
如下的10行數(shù)據(jù)瓜浸,每行有10個整數(shù)澳淑,請你求出它們的乘積的末尾有多少個零?
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
思路:0是由2*5得來的插佛,所以計算2和5中的個數(shù)數(shù)少的就是0的個數(shù)了
#include <iostream>
//#include <cstdio>
#include<cmath>
//#include<algorithm>
using namespace std;
int main()
{
int n,c2=0,c5=0;
for (int i = 0; i < 100; i++)
{
cin >> n;
while (n % 5 == 0)
{
n /= 5;
c5++;
}
while (n % 2 == 0)
{
n /= 2;
c2++;
}
}
cout<<c2<<endl<<c5;//cout << min(c2, c5) << endl;
return 0;
}
答案:31
題目五:快速排序杠巡。
以下代碼可以從數(shù)組a[]中找出第k小的元素。
它使用了類似快速排序中的分治算法雇寇,期望時間復(fù)雜度是O(N)的氢拥。
請仔細(xì)閱讀分析源碼,填寫劃線部分缺失的內(nèi)容锨侯。
#include <stdio.h>
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( _____________________________ ); //填空
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;
}
注意:只填寫劃線部分缺少的代碼嫩海,不要抄寫已經(jīng)存在的代碼或符號。
代碼審計
#include <stdio.h>
int quick_select(int a[], int l, int r, int k) {
int p = rand() % (r - l + 1) + l;//隨機定位一個基準(zhǔn)下標(biāo)
int x = a[p];//將基準(zhǔn)下標(biāo)代表的數(shù)字取出
/*這里由于已經(jīng)把基準(zhǔn)值存入了x中囚痴,所以可以認(rèn)為a[p]是挖了一個坑叁怪,可以填數(shù)據(jù)*/
{int t = a[p]; a[p] = a[r]; a[r] = t;}//將挖的坑移至數(shù)組尾端
int i = l, j = r;//i作為從前向后檢索的下標(biāo),j作為從后向前檢索的下標(biāo)
while(i < j) {//快速排序
while(i < j && a[i] < x) i++;//如果有值比基準(zhǔn)值小且在基準(zhǔn)值左方那么不變
if(i < j) {//如果有值比基準(zhǔn)值大且在基準(zhǔn)值左方
a[j] = a[i];//用這個值把坑填上
j--;//j下標(biāo)向前移動
}//此時i指向了那個坑
while(i < j && a[j] > x) j--;//如果有值比基準(zhǔn)值大且在基準(zhǔn)值右方那么不變
if(i < j) {//如果有值比基準(zhǔn)值小且在基準(zhǔn)值右方
a[i] = a[j];//再次把坑填上
i++;//i下標(biāo)向后移動
}
}
a[i] = x;//把x的值扔回去深滚,此時奕谭,比x小的值都在其左側(cè),比x大的值都在其右側(cè)痴荐。
p = i;//此時x是第幾個數(shù)血柳,就是第幾小的數(shù)。
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;
}