北京航空航天大学2014第二次上机解题报告
2014 第二次上机解题报告:
第一题: jhljx上小学
Problem Description
jhljx热衷于学习数学,并熟练掌握了初等及以上的各类数学知识,在积分和相关领域方面也表现得非常出色。
他唯一的缺点就是计算基础薄弱。。
LuxakyLuee认为
特殊病人
LuxamyLeu特别规定
举个例子
Input
请提供一组数据,并将这些数据以一行的形式呈现给系统。其中仅包含一行的数据,并且该数据是一个整数n。为了确保测试的有效性与适用性:约有1/3的数据落在int类型范围内;约有1/3的数据落在long long类型范围内;约有1/3的数据超出long long类型范围
Output
输出最后所得的结果。
Sample Input
987
Sample Output
6
Hint
为了计算方便起见,在处理数字987时 将其各位相加之和等于9 + 8 + 7 = 24 其结果并非单一数字 再将其各位相加 则得到的结果即为6 观察到这一结果确实令人惊叹
不言而喻地说,这道题也可视为本次上机中最具挑战性的一道题目。若说先前我们是在蒙昧时期艰难求索,则这次借助刘京欣学长的指导堪称"受益匪浅"。再说一句,则 Algorithm 的设计实在感到由衷的遗憾,并非完全出自本人一人之手。实在不愿过多阐述细节,请看下面的代码 snippet 以便大家参考学习。
#include
#include
using namespace std;
int main()
{
int t,i,j,n;
char c;
long long x;
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
在教授完毕加减法课程后,jhljx的算术能力显著提升。随着他从小学升入初中,在未来将开始学习乘除法运算。
有人chaofeng他乘法肯定学不好,他好桑心啊。。
他决定以展示的姿态向大家显现。,遗憾就如球球学姐在减肥时 similarly, jhljx在学习乘法时也未能取得成功。
Last_Day将两个数字n和m分配给jhljx,并指示他计算n的m次方运算结果的最后一位是什么。然而,观察得知jhljx目前无法计算出结果,请帮助我解答这个问题吧!
Input
接收一批数据。对于每一组的数据来说,包含两个非负整数n与m
Output
输出n的m次方的末尾数字。如果结果不存在,输出-1。
Sample Input
2
1
Sample Output
2
初中时候老师就要求我们每个个位数的次方末尾规律记下来,并没有想到这里竟然能派上用场。
注意的一:很多同学忘记了0的0次方是不存在的~;
注意的二:很多同学忘记了除了0之外的数的0次方是1
于是。。。贴代码
#include<iostream>
using namespace std;
int main()
{
long long n,m;
while(cin>>n>>m)
{
if(n==0&&m==0)
{
cout<<"-1"<<endl;
}
else if(n!=0&&m==0)
{
cout<<"1"<<endl;
}
else
{
n=n-n/10*10;
long long t;
t=m%4;
switch(t)
{case 1:
switch (n)
{case 1:
cout<<"1"<<endl;
break;
case 2:
cout<<"2"<<endl;
break;
case 3:
cout<<"3"<<endl;
break;
case 4:
cout<<"4"<<endl;
break;
case 5:
cout<<"5"<<endl;
break;
case 6:
cout<<"6"<<endl;
break;
case 7:
cout<<"7"<<endl;
break;
case 8:
cout<<"8"<<endl;
break;
case 9:
cout<<"9"<<endl;
break;
case 0:
cout<<"0"<<endl;
break;}
break;
case 2:
switch (n)
{case 1:
cout<<"1"<<endl;
break;
case 2:
cout<<"4"<<endl;
break;
case 3:
cout<<"9"<<endl;
break;
case 4:
cout<<"6"<<endl;
break;
case 5:
cout<<"5"<<endl;
break;
case 6:
cout<<"6"<<endl;
break;
case 7:
cout<<"9"<<endl;
break;
case 8:
cout<<"4"<<endl;
break;
case 9:
cout<<"1"<<endl;
break;
case 0:
cout<<"0"<<endl;
break;}
break;
case 3:
switch (n)
{case 1:
cout<<"1"<<endl;
break;
case 2:
cout<<"8"<<endl;
break;
case 3:
cout<<"7"<<endl;
break;
case 4:
cout<<"4"<<endl;
break;
case 5:
cout<<"5"<<endl;
break;
case 6:
cout<<"6"<<endl;
break;
case 7:
cout<<"3"<<endl;
break;
case 8:
cout<<"2"<<endl;
break;
case 9:
cout<<"9"<<endl;
break;
case 0:
cout<<"0"<<endl;
break;}
break;
case 0:
switch (n)
{case 1:
cout<<"1"<<endl;
break;
case 2:
cout<<"6"<<endl;
break;
case 3:
cout<<"1"<<endl;
break;
case 4:
cout<<"6"<<endl;
break;
case 5:
cout<<"5"<<endl;
break;
case 6:
cout<<"6"<<endl;
break;
case 7:
cout<<"1"<<endl;
break;
case 8:
cout<<"6"<<endl;
break;
case 9:
cout<<"1"<<endl;
break;
case 0:
cout<<"0"<<endl;
break;}
break;
}
}
}
}
看起来挺冗长的嘛?不过基本上都是直接复制粘贴过来的吧?说实话吧,这样下来确实挺费时费力的。
第三题:jhljx去太空
ProblemDescription
jhljx对旅游有着浓厚的兴趣。。一天晚上他突然间穿越到了太空站里体验了一把未来感十足的旅行经历。他忍不住感叹道:"哇!真奇妙!"
jhljx启程乘坐宇宙飞船穿梭于不同种类的星球之上。他造访过许多星球包括火星、金星等这些地方都相对容易到达。他还曾前往过KMT184.05行星并观看了《来自星星的你》中提到的那位教授。归于旅行后感慨万千但仍有疑问:他是否真的抵达过那个最遥远的星球呢?由于计算能力不足他无法得出确切答案这个问题促使他开始思考
假设某颗母星的坐标为x_0, y_0, z_0以及jhljx总共进行了n次星际探测活动,
每一次太空探索任务都是从母星启程前往一个目标行星,
然后返回母星。
紧接着又一次太空探索任务开始,
再次前往下一个目标行星,
再次返回母星……
在每次太空飞行中,
宇宙飞船上每执行1光年行程就需要消耗k升燃油。
请问在这n次星际航行中,
宇宙飞船耗油最多的一次是哪一次?
这次航行消耗了多少燃油。(假设宇宙飞船都能够成功抵达目标行星而不需担心燃油不足的问题)
Input
处理多批次数据
Output
在飞船执行了n次旅行任务后,在所有完成的任务中,请返回耗油量最大的一次任务及其对应的燃油消耗数值,并以空格分隔的形式呈现,并且将数值计算结果精确至第六位小数。若存在多组符合此条件的任务,则返回序号最小的那一组数据
Sample Input
00 0
1
1 1 1
1
Sample Output
13.464102
Hint
请用 C++的输出格式输出结果,否则本题不记成绩。
这道题与当年那个"亿万星辰"的问题极为相像,在算法上非常相近。见及去年那道题后便认为此题已无需多虑了。为了避免时间超限问题,在此我选择了采用数组结构。
贴呀嘛贴代码~~:
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int main()
{
long long x0,y0,z0,x,y,z,n,k,m,i;
while(cin>>x0>>y0>>z0>>n)
{
double s[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;
}
}
第四题:last Day’dog
ProblemDescription
Last_Day要去西安了。但是Last_Day的狗狗被禁止带上火车。
为了防止饿出狗命来,Last_Day机智的准备了一些狗粮(#)
作为一个习惯性行为的执着者,Last_Day总是热衷于将狗粮排列得整齐大方。例如金字塔形。
由于Last_Day缺乏整理能力(手残),他现在轮到你来帮忙整理了。
Input
输入多组数据。
每组数据只有一行,为一个正整数n(n<=30)。
Output
每组数据输出n行,为n层的倒三角形
Sample Input
2
3
Sample Output
###
#
#####
###
#
由于战术的原因吧,我在看完了所有题之后才开始做,于是先挑了个软柿子捏,也就是先做的这一道,事实证明我的战术还是对的,毕竟把4,5,6这样的题A了之后心里踏实不少~~~~
代码~
#include<iostream>
using namespace std;
int main()
{
int n;
while (cin>>n)
{
for(int i=n;i>0;i--)
{
for(int j=1;j<=2*n-1;j++)
{
if(j<=n-i||j>=n+i)
{
cout<<" ";
}
else
{
cout<<"#";
}
}
cout<<endl;
}
}
}
起初我以为这个题目会很顺利地解决。结果我发现其实自己把符号搞反了——原来我把"#"看成了"*"!这让我意识到类似的问题可能在其他人身上也存在。
第五题:Collatz Conjecture
ProblemDescription
奇偶变化猜想(Collatz Conjecture),亦称3n+1问题、冰雹过程、角谷现象、哈塞猜测、乌拉姆问题或叙拉古假设等,在这一理论中指出:对于任意一个正整数值n,在实施以下运算时:若n为奇数值,则执行三倍加一操作;若n为偶数值,则执行除以二操作;持续进行上述步骤直至最终达到数值1。
选取任意正整数n(例如n=6),按照给定的计算公式3n+1(当n为奇数时)或n/2(当n为偶数时),经过计算得到序列:6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1。
现在,请你计算从给定的n变为1所需的步骤数。
Input
多组数据输入。
每行一个正整数n,n<=1000000000。
Output
每组数据输出一行,为一个整数t,即需要变换的次数。
Sample Input
6
Sample Output
8
Hint
此题数据范围较大,下手请慎重。
面对这个问题,并参考上一题的解法后发现最初认为这也是一道高精度的问题因此选择将其放置到最后处理结果发现它并非如此最终编写完代码后发现无法按时提交时感到懊悔不已。
说多都是泪啊。。。
#include<iostream>
using namespace std;
int main()
{
long long n,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;
}
}
这个题。。。要是这样的话。。。貌似比第四题还简单。。
第六题:pluperfect digital invariant
ProblemDescription
在数学领域中被称为水仙花数(Narcissistic number)或自幂数的一种特殊现象,在计算机科学中有时也被称为阿姆斯特朗数值(Armstrong number)。这种现象指的是一个N位正整数值满足其各位数字分别自乘N次后的总和等于该数值本身这一特性。例如,在十进制系统中最小的几个水仙花数值包括153、370等;其中最著名的一个是407这个三位数字自幂累加等式成立的例子:4^3 + 0^3 + 7^3 = 407。对于给定区间[a,b]内的所有整数值,请列出满足上述特性的所有pluperfectdigital invariant数值。
Input
第一行为数据组数T。(T<10)
接下来T行,每行两个数字a,b。(100<=a<=b<=999)
Output
每个数据集需单独输出一行,在区间[a, b]内寻找满足条件的 pluperfect digital invariants,并按升序排列结果。请确保数字之间用单个空格分隔。若区间内无满足条件的 pluperfect digital invariant,请输出-1。
Sample Input
1
153 153
Sample Output
153
Hint
请尽量避免采用打表的方式降低本题分数,并可能导致您的成绩受到一定影响以及在助教团队中的工作进度。
水仙花数问题:类似于水仙花数问题是算法领域中的一个非常经典的课题,在结合上周参加的练习赛L*中的相关内容后,我觉得自己还是相当熟悉的。
代码走起~~~
#include<iostream>
using namespace std;
int main()
{
int T,a,b;
cin>>T;
for(;T>0;T--)
{
int x,t;
cin>>a>>b;
x=a;
int counter=0;
for(;x<=b;x++)
{
int sum=0,q;
q=x;
for(int i=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;
}
}
对于这个问题而言,在其核心在于位数已知的情况下。由此可见,在这种情况下问题的解决难度得到了显著降低。
对您设置的难度适中的上机题目深感感激。觉得这对提升学习效果非常有益,并且对你们长时间以来每天有问题必回复以及邮件必回的态度表示由衷的感激。在此表示衷心的感谢~
