第一题
这是第一道填空题,比较水 ,方法有两种,第一种是Excel的方法,但是我Excel并不好,不太会用,第二种方法是枚举的方法,需要考虑好每一种情况。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
bool isPrimeyear(int y)
{
return (y%4==0&&y%100!=0)||(y%400==0);
}
int main()
{
int y=1777;
int m=4;
int d=30;
for(int i=0;i<8112;i++)
{
d++;
if(m==12&&d==32)
{
y++;
m=1;
d=1;
continue;
}
if((m==1||m==3||m==5||m==7||m==8||m==10)&&d==32)
{
m++;
d=1;
continue;
}
if((m==4||m==6||m==9||m==11)&&d==31)
{
m++;
d=1;
continue;
}
if(m==2&&isPrimeyear(y)&&d==30)
{
m++;
d=1;
continue;
}
if(m==2&&!isPrimeyear(y)&&d==29)
{
m++;
d=1;
continue;
}
//cout<<y<<" "<<m<<" "<<d<<endl;
}
cout<<y<<" "<<m<<" "<<d<<endl;
return 0;
}
运行结果为1799-7-16.
第二题
这道题也是枚举的应用。
//有一次,老师出的题目是:36 x 495 = ?
//他却给抄成了:396 x 45 = ?
// 但结果却很戏剧性,他的答案竟然是对的!!
// 因为 36 * 495 = 396 * 45 = 17820
//假设 a b c d e 代表1~9不同的5个数字(注意是各不相同的数字,
// 且不含0)能满足形如:
// ab * cde = adb * ce 这样的算式一共有多少种呢?
//请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。
//满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
int cnt=0;
for(int a=1;a<10;a++)
{
for(int b=1;b<10;b++)
{
if(b!=a)
for(int c=1;c<10;c++)
{
if(c!=b&&c!=a)
for(int d=1;d<10;d++)
{
if(d!=c&&d!=b&&d!=a)
for(int e=1;e<10;e++)
{
if(e!=d&&e!=c&&e!=b&&e!=a)
{
if((a*10+b)*(c*100+d*10+e)==
(a*100+d*10+b)*(c*10+e))
{
cnt++;
}
}
}
}
}
}
//cout<<cnt<<endl;
}
cout<<cnt<<endl;
return 0;
}
第三题 39级台阶
题目标题: 第39级台阶
小明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!
站在台阶前,他突然又想着一个问题:
如果我每一步只能迈上1个或2个台阶。先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。那么,上完39级台阶,有多少种不同的上法呢?
请你利用计算机的优势,帮助小明寻找答案。
要求提交的是一个整数。
注意:不要提交解答过程,或其它的辅助说明文字。
这道题我们很容易想到斐波那契数列这种问题。这就是所谓的相似问题推测现有问题,我们可以去掉一个条件,偶数步,最后进行判断就可以, 所以函数中可以定义两个变量,n代表剩下的阶梯数,step代表已走的步数。
//如果我每一步只能迈上1个或2个台阶。
//先迈左脚,然后左右交替,最后一步是迈右脚,
//也就是说一共要走偶数步。那么,上完39级台阶,
//有多少种不同的上法呢?
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int ans;
void Fib(int n,int step)//n代表剩下的阶梯数目
//step代表已走的步数
{
if(n<0)
return;
if(n==0&&step%2==0)
{
ans++;
}
Fib(n-1,step+1);
Fib(n-2,step+1);
}
int main()
{
ans=0;
Fib(39,0);//2^39
cout<<ans<<endl;
return 0;
}
最后得到的结果非常大,是51167078,因为他需要进行2^39次运算。所以复杂度很高,可以通过dp进行优化剪枝。但由于填空,没有考虑太多。
第五题 前缀判断
如下的代码判断 needle_start指向的串是否为haystack_start指向的串的前缀,如不是,则返回NULL。
比如:"abcd1234" 就包含了 "abc" 为前缀
char* prefix(char* haystack_start, char* needle_start)
{
char* haystack = haystack_start;
char* needle = needle_start;
while(*haystack && *needle){
if(______________________________) return NULL; //填空位置
}
if(*needle) return NULL;
return haystack_start;
}
请分析代码逻辑,并推测划线处的代码,通过网页提交。
注意:仅把缺少的代码作为答案,千万不要填写多余的代码、符号或说明文字!!
这道题就是字符串类型的题,首先明白每句的含义。注意 haystack 是母串,needle 是子串。while语句的含义是指如果这两个字符串均不为空,按照正常情况,needle前缀长度是小于haystack长度的,ifneedle更长,,母串越出,while语句里面的何时返回NULL,如果heystack当前字符不等于needle当前字符,则返回所以括号里面的内容为移动指针并判断。
while(*haystack && *needle){
if(*(heystack++)!=*(needle++)) return NULL; //填空位置
}
当然可以自己测试一下。
第六题
标题:三部排序
一般的排序有许多经典算法,如快速排序、希尔排序等。
但实际应用时,经常会或多或少有一些特殊的要求。我们没必要套用那些经典算法,可以根据实际情况建立更好的解法。
比如,对一个整型数组中的数字进行分类排序:
使得负数都靠左端,正数都靠右端,0在中部。注意问题的特点是:负数区域和正数区域内并不要求有序。可以利用这个特点通过1次线性扫描就结束战斗!!
以下的程序实现了该目标。
其中x指向待排序的整型数组,len是数组的长度。
void sort3p(int* x, int len)
{
int p = 0;
int left = 0;
int right = len-1;
while(p<=right){
if(x[p]<0){
int t = x[left];
x[left] = x[p];
x[p] = t;
left++;
p++;
}
else if(x[p]>0){
int t = x[right];
x[right] = x[p];
x[p] = t;
right--;
}
else{
__________________________; //填空位置
}
}
}
如果给定数组:
25,18,-2,0,16,-5,33,21,0,19,-16,25,-3,0
则排序后为:
-3,-2,-16,-5,0,0,0,21,19,33,25,16,18,25
请分析代码逻辑,并推测划线处的代码,通过网页提交
注意:仅把缺少的代码作为答案,千万不要填写多余的代码、符号或说明文字!!
这道题实际上就是快速排序的一个变形,它和快速排序的原理,选择一个基准值,比基准值大的放在右边,比基准值小的放在左边。
这道题他的思想就是双指针法的一个应用。 空白处需要填写的是 p++;