您的位置:首页 > 其它

北京航空航天大学2014第二次上机解题报告

2014-10-26 15:47 169 查看


2014第二次上机解题报告:

第一题:jhljx上小学

ProblemDescription

jhljx是一个特别喜欢数学的人,精通初等数学以上的各种数学,各种积分他都很精通。。

但他唯一的缺陷就是不会算加减法。。

于是,他只能默默的回去上小学了。。Orz。。他的小学老师是LuxakyLuee。

LuxakyLuee知道这件事以后说这是病,得治啊。。

LuxakyLuee不让他做普通的加减法,因为对于特殊病人要采取特殊手段治疗吖。

LuxakyLuee给了jhljx一个数,然后让他把这个数的每一位加起来。

如果加起来的和的位数多于1位的话,就继续将这个数的每一位数字加起来,直到最后只有一个为止。

这样jhljx就能进行好多次加法运算了。他表示很开心。

Input

输入一组数据。

该组数据只有一行,为一个整数n。

(保证33.33%的n在int范围内,33.33%的n在long
long范围内,33.33%的n超过long
long范围)

Output

输出最后所得的结果。

SampleInput

987

SampleOutput

6

Hint

样例解释:对于987,将每一位加起来就是9+8+7=24,24不是1位数,继续加,2+4=6。咦?变成一位数了。。好神奇吖!!

这道题可以说是本次上机难度最大的一道了。。。不过中途好心的刘京欣学长竟然给它讲了!所以说。。。算法不出自本人感到十分惭愧,具体解法不必再说了。。。将自己代码贴在上面啦~~~

#include<iostream>

#include<cstdio>

usingnamespacestd;

intmain()

{

intt,i,j,n;

charc;

longlongx;

x=0;

//cin>>c;

c=getchar();

while(c!='\n')

{

//cout<<c;

intnum=int(c)-int('0');

x=(x*10+num)%9;

c=getchar();

}

cout<<x<<endl;

}

总之是。。。第一题就这么水过了。。。

第二题:jhljx上中学

ProblemDescription

Last_Day教完jhljx加减法以后,jhljx的算数水平有了很大的长进。现在他从小学升入了中学,准备学习乘除法了。。

有人chaofeng他乘法肯定学不好,他好桑心啊。。

他决定表现给你们看。。可惜就像球球学姐学减肥一样,jhljx学乘法最终还是失败了。。

Last_Day给了jhljx两个数n和m,他让jhljx判断n的m次方的末尾数字是多少。

可是jhljx真的算不出来吖,他就把这个算数的活交给你了。。聪明的你快来帮帮他吧。

Input

输入多组数据。

每组数据有两个非负整数n和m。(保证n和m在long
long范围内)

Output

输出n的m次方的末尾数字。如果结果不存在,输出-1。

SampleInput

2

1

SampleOutput

2

初中时候就被老师要求对每一个个位数的次方末尾规律记了下,没想到在这里竟然用的上

注意的一:很多同学忘记了0的0次方是不存在的~;

注意的二:很多同学忘记了除了0之外的数的0次方是1

于是。。。贴代码

#include<iostream>


usingnamespacestd;


intmain()

{

longlongn,m;

while(cin>>n>>m)

{

if(n==0&&m==0)

{

cout<<"-1"<<endl;

}

elseif(n!=0&&m==0)

{

cout<<"1"<<endl;

}

else

{

n=n-n/10*10;

longlongt;

t=m%4;

switch(t)

{case1:

switch(n)

{case1:

cout<<"1"<<endl;

break;

case2:

cout<<"2"<<endl;

break;

case3:

cout<<"3"<<endl;

break;

case4:

cout<<"4"<<endl;

break;

case5:

cout<<"5"<<endl;

break;

case6:

cout<<"6"<<endl;

break;

case7:

cout<<"7"<<endl;

break;

case8:

cout<<"8"<<endl;

break;

case9:

cout<<"9"<<endl;

break;

case0:

cout<<"0"<<endl;

break;}

break;

case2:

switch(n)

{case1:

cout<<"1"<<endl;

break;

case2:

cout<<"4"<<endl;

break;

case3:

cout<<"9"<<endl;

break;

case4:

cout<<"6"<<endl;

break;

case5:

cout<<"5"<<endl;

break;

case6:

cout<<"6"<<endl;

break;

case7:

cout<<"9"<<endl;

break;

case8:

cout<<"4"<<endl;

break;

case9:

cout<<"1"<<endl;

break;

case0:

cout<<"0"<<endl;

break;}

break;

case3:

switch(n)

{case1:

cout<<"1"<<endl;

break;

case2:

cout<<"8"<<endl;

break;

case3:

cout<<"7"<<endl;

break;

case4:

cout<<"4"<<endl;

break;

case5:

cout<<"5"<<endl;

break;

case6:

cout<<"6"<<endl;

break;

case7:

cout<<"3"<<endl;

break;

case8:

cout<<"2"<<endl;

break;

case9:

cout<<"9"<<endl;

break;

case0:

cout<<"0"<<endl;

break;}

break;

case0:

switch(n)

{case1:

cout<<"1"<<endl;

break;

case2:

cout<<"6"<<endl;

break;

case3:

cout<<"1"<<endl;

break;

case4:

cout<<"6"<<endl;

break;

case5:

cout<<"5"<<endl;

break;

case6:

cout<<"6"<<endl;

break;

case7:

cout<<"1"<<endl;

break;

case8:

cout<<"6"<<endl;

break;

case9:

cout<<"1"<<endl;

break;

case0:

cout<<"0"<<endl;

break;}

break;

}


}

}

}




看上去就有点长,不过大都是复制粘贴的,所以怎么说呢。。。我再一次写麻烦了。。。

第三题:jhljx去太空

ProblemDescription

jhljx是一个特别喜欢旅行的人。。一天他做梦梦到自己去太空旅行了。。o(≧v≦)o~~好棒吖。。

jhljx从地球出发,坐着宇宙飞船飞到各种神奇的星球去。。

他去过好多星球,比如说神马火星吖,金星吖,这些都随随便便。

他还去了一趟KMT184.05行星,见到了《来自星星的你》中的都教授。。

jhljx旅行归来,感慨万千啊。。

但他一直不知道自己最远到达了那个星球。

所以他想算一算。但他算数拙计啊。。

那么问题来了。。。

假设地球的坐标是x0,y0,z0,jhljx总共访问了n个星球,n个星球的坐标为x,y,z。

每次访问他都从地球出发,然后访问一个星球,再返回地球。

接着再从地球出发,去访问下一个星球,再返回地球。。。。

在飞行过程中,飞船每飞行1光年需要耗油k升。

请问在这n次飞行中,飞船耗油最多的一次是哪一次,这次飞行消耗了多少油。(假设飞船都能够到达星球,不考虑没油的情况)。

Input

输入多组数据。

每组数据共(n+3)行。第一行为地球的坐标x0,y0,z0。(x0,y0,z0均为整数,且-1000<=x0,y0,z0<=1000)

第二行为访问的星球个数n。(1<=n<=100)

下面从第三行到第(n+2)行为jhljx要访问的星球的坐标x,y,z。(x,y,z均为整数,且-1000<=x0,y0,z0<=1000)

第(n+3)行为飞船每飞行1光年消耗的油量k。(k为整数,且1<=k<=100)

Output

输出飞船在这n次旅行中,耗油最多的一次飞行和这次飞行消耗的油量,两个数之间用空格隔开,油量的结果保留6位小数。

如果有多次飞行都满足耗油量最大,请输出序号最少的那一次。

SampleInput

000

1

111

1

SampleOutput

13.464102

Hint

请用C++的输出格式输出结果,否则本题不记成绩。

这道题就和当时去年的“亿万星辰”很像,算法也十分相似,看到了去年那道题后就感觉这道题基本不是很用想了,不过为了不超时,我还是用了数组。

贴呀嘛贴代码~~:

#include<iostream>

#include<cmath>

#include<iomanip>

usingnamespacestd;


intmain()

{

longlongx0,y0,z0,x,y,z,n,k,m,i;

while(cin>>x0>>y0>>z0>>n)

{

doubles[n+1];

m=0;

s[0]=0;

for(i=1;i<=n;i++)

{

cin>>x>>y>>z;

s[i]=sqrt((x-x0)*(x-x0)+(y-y0)*(y-y0)+(z-z0)*(z-z0));

if(s[i]>s[m])

{

m=i;

}


}

cin>>k;

//cout<<k;

cout<<m<<""<<setiosflags(ios::fixed)<<setprecision(6)<<k*2*s[m]<<endl;

}

}






第四题:lastDay’dog

ProblemDescription

Last_Day要去西安了。但是Last_Day的狗狗被禁止带上火车。

为了防止饿出狗命来,Last_Day机智的准备了一些狗粮(#)

作为强迫症,Last_Day决定把狗粮摆放的整齐大方。比如倒三角形。

Last_Day手残不会摆,是时候你上场了。

Input

输入多组数据。

每组数据只有一行,为一个正整数n(n<=30)。

Output

每组数据输出n行,为n层的倒三角形

SampleInput

2

3

SampleOutput

###

#

#####

###

#


由于战术的原因吧,我在看完了所有题之后才开始做,于是先挑了个软柿子捏,也就是先做的这一道,事实证明我的战术还是对的,毕竟把4,5,6这样的题A了之后心里踏实不少~~~~




代码~

#include<iostream>


usingnamespacestd;


intmain()

{

intn;

while(cin>>n)

{

for(inti=n;i>0;i--)

{

for(intj=1;j<=2*n-1;j++)

{

if(j<=n-i||j>=n+i)

{

cout<<"";

}

else

{

cout<<"#";

}

}

cout<<endl;

}


}

}


这个题开始竟然还错了两次,后来发现:我把“#”看成了“*”!!!!(后来发现,不只有我一个有这种比较二的错误啊~)

第五题:CollatzConjecture

ProblemDescription

奇偶归一猜想(CollatzConjecture),又称为3n+1猜想、冰雹猜想、角谷猜想、哈塞猜想、乌拉姆猜想或叙拉古猜想,是指对于每一个正整数,如果它是奇数,则对它乘3再加1,如果它是偶数,则对它除以2,如此循环,最终都能够得到1。

取一个数字,如n=6,根据上述公式,得出
6→3→10→5→16→8→4→2→1。

现在给你一个n,请输出变换到1需要的变换的次数。

Input

多组数据输入。

每行一个正整数n,n<=1000000000。

Output

每组数据输出一行,为一个整数t,即需要变换的次数。

SampleInput

6

SampleOutput

8

Hint

此题数据范围较大,下手请慎重。

看到这个题,结合第一题的题目描述,第一直觉是这也是一道高精度的题,于是就决定最后做,结果没想到这竟然不是,所以最后在编了代码却交不上的时候只能追悔莫及。。。了。。。

说多都是泪啊。。。

#include<iostream>

usingnamespacestd;


intmain()

{

longlongn,t;

while(cin>>n)

{

t=0;

while(n!=1)

{

if(n%2!=0)

{

n=3*n+1;

t++;

}

else

{

n=n/2;

t++;

}

}

cout<<t<<endl;

}

}


这个题。。。要是这样的话。。。貌似比第四题还简单。。

第六题:pluperfectdigitalinvariant

ProblemDescription

在数论中,水仙花数(Narcissisticnumber),也被称为超完全数字不变数(pluperfect
digitalinvariant,PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrongnumber),用来描述一个N位非负整数,其各个位数字的N次方和等于该数本身。例如153=1*1*1+5*5*5+3*3*3,则153为pluperfectdigital
invariant。

现给定区间[a,b],请输出[a,b]间pluperfectdigital
invariant。

Input

第一行为数据组数T。(T<10)

接下来T行,每行两个数字a,b。(100<=a<=b<=999)

Output

每组数据输出一行,为[a,b]间pluperfect
digitalinvariant,从小到大输出,每两个数字之间用一个空格隔开。若区间内不存在pluperfectdigitalinvariant请输出-1。

SampleInput

1

153153

SampleOutput

153

Hint

请不要使用打表的方式水掉本题orzorz,否则不计本题成绩,助教会检查代码……

水仙花数问题:貌似水仙花数问题是属于算法中比较经典的一类问题,再加上上周的练习赛L*题,让我感到还是比较熟悉吧。

代码走起~~~

#include<iostream>


usingnamespacestd;


intmain()

{

intT,a,b;

cin>>T;

for(;T>0;T--)

{

intx,t;

cin>>a>>b;

x=a;

intcounter=0;

for(;x<=b;x++)

{

intsum=0,q;

q=x;

for(inti=1;i<=3;i++)

{

t=q-q/10*10;

sum=t*t*t+sum;

q=q/10;

}

if(sum==x)

{

cout<<sum<<"";

counter++;

}

}

if(counter==0)

{

cout<<"-1";

}

cout<<endl;

}

}


这个题额。。。简单之处就在于连位数都已经确定了,所以说。。。难度基本给拿掉了

不过还是很感谢学长能在上机题里有难有易的出题,这样真的很有提高,也为你们这么多天一直有问必答,有邮件必回而感到感谢~谢谢啦
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: