6.26测试
本次考试的粗心不忍吐槽(自带贴吧喷水表情),本次考试主要考察的知识点如下:
- 算法的分析与精简
- 暴力枚举输出字符
- 判断与枚举的综合考察
题目
第一题
【问题描述】
在一口井里,有一只神牛(其实是蜗牛),它打算从井底爬到地面上。已知井的深度为V米,蜗牛每天白天可以往上爬A米,可是每天晚上睡觉的时候,它会杯具地向下滑落B米。
求蜗牛需要多少天才能爬出井。
【输入】
包括三个由空格分开的数字:A,B和V
其中(1≤B<A≤V≤1 000 000 000)。第二题
【问题描述】
热衷图形输出的XW老师对于OJ上的图形输出题很不满意,认为难度太低,所以他亲自设计了此题来考验大家(╯﹏╰)。为了可以输出更大的图形,同时保证美观性,XW老师决定当输出的数字大于9的时候用小写字母进行代替(a代替10,b代替11,往后依次)。
【输入】
一个整数 N (1 ≤ N ≤ 35)
【输出】
一个所谓菱形。第三题
-总时间限制:
5000ms
内存限制:
65536kB
描述
一个数如果从左往右读和从右往左读数字是相同的,则称这个数是回文数,如121,1221,15651都是回文数。给定位数n,找出所有既是回文数又是素数的n位十进制数。(注:不考虑超过整型数范围的情况)。
输入
位数n,其中1<=n<=9。
得分
题目 | 分数 |
---|---|
1 | 50 |
2 | 100 |
3 | 80 |
共计 | 230 |
第一题
拿到题时,楼下的刘老师告诉我们先仔细看看题目,至少要到半个小时再去敲代码,但当他把这句话说完到时候,我就已经把第一道题到错误代码敲出来了(( ⊙ o ⊙ )!),当时看到数据范围的我蒙了一下,然后迅速的把我的代码运行>>输入数据;结果都没超时((^o^)/)然而得到分数的我才知道,当时我的数据试的太大,神牛爬的太快(笑)。当时还想老师会不会用一些比较特(hen)殊(tai)的数据,然后小心翼翼地输进去>>6>>1>>99999999(shutdown),小小的光标在不断的嘲讽我,循环是错误的,然而脑门一热,算了老师应该不会这么…….于是就接着看了下一道。
****************我滴思路(错误)**************
很明显嘛,定义一个天数,定义一个爬过的路,然后循环一次累加一天,就可以知道几天爬上去了。
然而超时………………(懵逼)
****************正确的思路*******************
这是一道用计算机语言花式解决小学奥数的典范,五六岁的刚学加减法的小孩就知道用加法一点一点的加就能知道几天就能上天,然而学过乘法的二年级小学生就知道要用除法计算蜗牛的天数。
首先判断,它能不能在一天内上天,如果可以,直接输出“1”;
其次判断,最后一天能不能正好上天;
如果可以那么就有:
天数=(长度-爬)/(爬-滑)+1
如果不能就有:
天数=(长度-爬)/(爬-滑)+2
(^o^)/
#include<iostream>
using namespace std;
int main()
{
int m,n,a,b;
cin>>m>>n>>a;
if(m>=a) cout<<1<<endl;
else
{
if((a-m)%(m-n)==0)
cout<<(a-m)/(m-n)+1<<endl;
else
cout<<(a-m)/(m-n)+2<<endl;
}
return 0;
}
第二题
拿到第二题的反应:一阵狂喜!!!
OJ的菱形,只不过把空格改成字符,把字符改成了空格
于是果断跳过看最后一个,
BUT当我做完第三个拐回头来看的时候,我却做了快一个小时!
*************我的思路**************
首先把图形看成两部分:上半部分倒三角,下半部分正三角
上半部分:输出的字符=行数(循环总共的行数-行数次)
空格=2*行数-1
下半部分:倒着输出来即可
***************代码实现************
#include <iostream>
#include <iomanip>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <cstdio>
using namespace std;
int main()
{
/*freopen("picture.in","r",stdin);
freopen("picture.out","w",stdout);*/
int a,b,m,n;
cin>>a;
n=a;
m=a;
char ch1='a';
if(a<10)
{
for(int ll=1;ll<=n;ll++)
{
for(int i=1;i<=a;i++)
{
cout<<ll;
}
a--;
for(int i=1;i<=2*ll-1;i++)
{
cout<<' ';
}
for(int i=1;i<=a+1;i++)
{
cout<<ll;
}
cout<<endl;
}
for(int ll=1;ll<=m-1;ll++)
{
for(int i=1;i<=ll+1;i++)
cout<<m-ll;
for(int i=2*n-3;i>=1;i--)
cout<<' ';
n--;
for(int i=1;i<=ll+1;i++)
cout<<m-ll;
cout<<endl;
}
}
if(a>10)
{
for(int ll=1;ll<=n;ll++)
{
for(int i=1;i<=a;i++)
{
if(ll<10)
cout<<ll;
else
cout<<char(96+ll-9);
}
a--;
for(int i=1;i<=2*ll-1;i++)
{
cout<<' ';
}
for(int i=1;i<=a+1;i++)
{
if(ll<10)
cout<<ll;
else
cout<<char(96+ll-9);
}
cout<<endl;
}
for(int ll=1;ll<=m-1;ll++)
{
for(int i=1;i<=ll+1;i++)
{
if(m-ll>9)
cout<<char(122+m-35-ll);
else
cout<<m-ll;
}
for(int i=2*n-3;i>=1;i--)
cout<<' ';
n--;
for(int i=1;i<=ll+1;i++)
{
if(m-ll>9)
cout<<char(122+m-35-ll);
else
cout<<m-ll;
}
cout<<endl;
}
}
return 0;
}
代码略臃肿,多多见谅,考试时候太慌
第三题
拿到第三题,脑子还是热的,我前一天刚看过回文数的代码,于是思路就有了
第一步:判断回文数
第二步:判断素数
考试的时候很紧张的就是,判断素数达到九位就会超时,疯狂的在想自己怎样才能不超时
依旧but我在考试结束的时候才想起来输出格式要先出来有几个素数,于是就又定义一个数组,把满足条件的数字存进去,最后再输出来
*********************判断回文数的思路***********************
每一次位数除以十,看看它的位数和前面的数字是否相同,如果相同,就是回文
************************代码实现***************************
#include <iostream>
#include <iomanip>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <cstdio>
using namespace std;
int main()
{
/*freopen("prime.in","r",stdin);
freopen("prime.out","w",stdout);*/
long long a,b=1,n,weishu[10000],huiwen,sum=0;
cin>>a;
for(int i=1;i<=a;i++)
{
b=10*b;
}
b=b/10;
huiwen=b;
for(int i=huiwen;i<huiwen*10;i++)
{
int tt=i;
int s=0,m=tt;
while(tt>0)
{
s=s*10+tt%10;
tt/=10;
}
if(s==m)
{
bool flag=true;
for(int i=2;i<=sqrt(m*1.0);i++)
if(m%i==0)
{
flag=false; break;
}
if(flag&&m!=1)
{ sum++;
weishu[sum]=m;
}
}
}
cout<<sum<<endl;
for(int i=1;i<=sum;i++)
cout<<weishu[i]<<' ';
return 0;
}
***************老师的代码****************
#include<iostream>
#include<cstring>
#include<utility>
#include<cstdlib>
#include<cstdio>
#include<string>
#include<vector>
#include<ctime>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define ll long long
#define ull unsigned long long
using namespace std;
const int oo=2000000000;
const int maxn=100000;
int n;
int Pw[15],Ans[maxn];
void Judge(int Num){
int Limit=(int)sqrt(1.0*Num);
for(int i=2;i<=Limit;i++)
if(Num%i==0)
return ;
Ans[++Ans[0]]=Num;
}
void Dfs(int x,int Num){
if(x*2>n+1){
Judge(Num);
return ;
}
if((n&1) && x*2>n)
for(int i=0;i<=9;i++)
Dfs(x+1,Num+Pw[x-1]*i);
else if(x==1)
for(int i=1;i<=9;i+=2)
Dfs(x+1,Num+Pw[0]*i+Pw[n-1]*i);
else
for(int i=0;i<=9;i++)
Dfs(x+1,Num+Pw[x-1]*i+Pw[n-x]*i);
}
int main(){
//srand(time(0));
/*freopen("prime.in","r",stdin);
freopen("prime.out","w",stdout);*/
Pw[0]=1;
for(int i=1;i<=9;i++) Pw[i]=Pw[i-1]*10;
cin>>n;
if(n==1){
printf("4
2 3 5 7
");
return 0;
}
Dfs(1,0);
printf("%d
",Ans[0]);
for(int i=1;i<=Ans[0];i++) printf("%d ",Ans[i]);
printf("
");
//cout<<"Time has passed:"<<1.0*clock()/1000<<"s!"<<endl;
return 0;
}
写在最后
本次考试,粗心丢了一百,原因是文件名打错。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。让我悲伤一会,这种错误实在令人无语,想想平时生活,平常的考试,不都是因为计算这种错误而丢掉很多分数吗?严谨对我就那么男吗(@某位严谨的男人)?此次考试,失误也就再此了,第一题的小学奥数,第二题的坑爹循环,第三题的莫名超时,错误贯穿程序猿的一生。