2014秋C++第18周 OJ题目及参考

课程主页在 http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在 云学堂“贺老师课堂”同步展示,使用的帐号请到课程主页中查看。 


1. 百位数答应了

Description

m是个三位的整数,家里出了点小麻烦。个位数和十位数一直对百位数凡事都先露脸心怀不满,想出个办法,联手向百位数发起挑点。他们两个先相加,再减去百位数,以相减结果得到正值为傲。大度的百位数答应了:不就是陪着这两个无聊的家伙解闷嘛。请你编程序,帮他们一比高低。

Input

一个3位的整数m

Output

m的个位数和十位数之和减去百位数的结果

Sample Input

293

Sample Output

10

HINT

#include <iostream>
using namespace std;
int main( )
{
    int m, a, b, c;
    cin>>m;
    a=m/100;
    c=m%10;
    b=(m%100)/10;
    cout<<b+c-a<<endl;
    return 0;
}


2. 复仇者联盟之关灯

Description

输入n1~500)盏灯并编号,输入1~9(包含19)的数字m,灭掉编号中带m的数及m倍数的灯,最后输出亮出的灯的编号。

Input

灯数n,数字m

Output

剩下的亮的灯的编号(每个编号占一行)

Sample Input

30 3

Sample Output

1

2

4

5

7

8

10

11

14

16

17

19

20

22

25

26

28

29

HINT

#include <iostream>
using namespace std;
int main()
{
    int t,m,n;
    cin>>n>>m;
    for(int i=1; i<n; ++i) //严格讲,这个参考答案中i<n是错的(正解i<=n)!坏事变好,详见后面的说明。
    {
        t=(i%m==0)+(i%10==m)+((i/10)%10==m)+((i/100)%10==m);
        if(t==0)cout<<i<<'\n';
    }
    return 0;
}
说明: 因为老师在做答案时失误,导致测试数据中,没有使应该亮着的n灯点亮。不少同学在藏在暗处的测试数据前栽了跟头。但从这个题目中,让我们再次意识到测试边界的重要性,或者当出现问题时,对一般性况的处理发现不了问题,应该首先意识到边界(本题的边界就是1和n)上是否有问题。其实在这方面有所察觉的同学,应该能够及时调整。再一个坏事变好事的方面是,当一道题不顺利时,是否影响了后面的状态?锻炼了心理素质,这也是要的进步之一。

3. 复仇者联盟之数组成绩统计

Description

定义一个53列的二维数组,各行分别代表一名学生的高数、英语、C++成绩。再定义一个有5个元素的一维数组,用于存储每名学生的平均成绩。请输入学生的各门课成绩,输出带平均成绩的成绩单,以及所有学生平均成绩的平均值。

Input

15整数,表示5名学生3科的成绩

Output

分5行显示每名学生的成绩及平均成绩

再显示所有学生平均成绩的平均值(保留两位小数)

Sample Input

97 78 87

78 63 68

73 81 85

91 87 88

76 81 89

Sample Output

97 78 87 87.33

78 63 68 69.67

73 81 85 79.67

91 87 88 88.67

76 81 89 82.00

81.47

HINT


#include<iostream>
#include <iomanip>
using namespace std;
int main()
{
    int score[5][3];  //保存成绩的数组
    double average[5];   //保存平均成绩的数组
    int i,j;
    double sum;
    //输入成绩
    for(i=0; i<5; i++)
        for(j=0; j<3; j++)
            cin>>score[i][j];
    //计算每位同学的平均成绩,保存到数组average中
    for(i=0; i<5; i++)
    {
        sum=0;
        for(j=0; j<3; j++)
            sum+=score[i][j];
        average[i]=sum/3.0;
    }
    //输出带平均成绩的成绩单
    cout<<setiosflags(ios::fixed)<<setprecision(2);
    for(i=0; i<5; i++)
    {
        for(j=0; j<3; j++)
            cout<<score[i][j]<<" ";
        cout<<average[i]<<endl;
    }
    //计算平均成绩的平均值并输出
    sum=0;
    for(i=0; i<5; i++)
        sum+=average[i];
    cout<<sum/5.0<<endl;
    return 0;
}

 

4. 找出素数

Description

输入若干个正整数,将其中的素数输出来。

请在下面的代码基础上完成本题,只提交你编写的部分

#include <iostream>
#include <cmath>
using namespace std;
bool isPrime(int n);
int main( )
{
    int n;
    while(cin>>n)
    {
        if(isPrime(n))
            cout<<n<<endl;
    }
    return 0;
}
//下面实现isPrime函数,其功能是判断n是否是素数。
//若是素数,返回true,否则,返回false

Input

个数不确定的正整数

Output

输入数据中的素数,一数一行,保持原来的顺序

Sample Input

83 5 12 363 137 307 31 87 126 490 300 358 28 239 286 69 25 94 7 336^Z

Sample Output

83

5

137

307

31

239

7

 

HINT

#include <iostream>
#include <cmath>
using namespace std;
bool isPrime(int n);
int main( )
{
    int n;
    while(cin>>n)
    {
        if(isPrime(n))
            cout<<n<<endl;
    }
    return 0;
}
 
bool isPrime(int n)
{
    bool prime=true;
    int k=int(sqrt(n));
    for(int i=2;i<=k;i++)
    {
        if(n%i==0)
        {
            prime=false;
            break;
        }
    }
    return prime;
}


逗逗泡泡的保密电文

Description

某电报局的电文保密的规律是将每个英文字母变成其后的第4个字母(很原始的那种啦),如A变成E,a变成e。最后四个字母(W,X,Y,Z或w,x,y,z)又变成前4个字母(A,B,C,D或a,b,c,d).非字母字符不变。输入一行字母,要求输出对应的加密后的文字 

Input

一行字符串

Output

改变后的字符串

Sample Input

I am 20 years old.

Sample Output

M eq 20 cievw sph.

HINT

 

参考解答1

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
    char str[81];
    gets(str);
    int i=0;
    while (str[i]!='\0')
    {
        if ((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z'))
        {
            str[i]=str[i]+4;
            if ((str[i]>'Z'&&str[i]<='Z'+4)||(str[i]>'z'&&str[i]<='z'+4))
                str[i]=str[i]-26;
        }
        i++;
    }
    puts(str);
    return 0;
}

参考解答2

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
    char c;
    while ((c=getchar())!='\n')
    {
        if ((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
        {
            c=c+4;
            if ((c>'Z'&&c<='Z'+4)||(c>'z'&&c<='z'+4))
                c=c-26;
        }
        cout<<c;
    }
    cout<<endl;
    return 0;
}


6. 用数字造数字

Description

输入一个3位以上的整数,求其中最大的两个数字之和与最小的数字之和之间的差。例如:输入8729,输出8,即(9+8)-(2+7)=8,再如,输入24825,输出9,即(8+5)-(2+2)=9。

Input

一个3位以上的整数

Output

最大的两个数字之和与最小的数字之和之间的差

Sample Input

8729

Sample Output

8

HINT

将分离好的数字存储在数组中,再从数组中找出最大、次大值,以及最小、次小值。最坏的策略,将得到的数组排序后取头尾两个元素。

#include <iostream>
using namespace std;
int main( )
{
    int n,arr[15],num=0;
    int i, max1, max2, min1, min2, t;
    cin>>n;
    while(n>0)
    {
        arr[num++]=n%10;
        n/=10;
    }
    //找最大和次大
    for(i=0; i<num-1; i++) //参照冒泡排序思想,将最大交换到最后
    {
        if(arr[i]>arr[i+1])
        {
            t=arr[i];
            arr[i]=arr[i+1];
            arr[i+1]=t;
        }
    }
    for(i=0; i<num-2; i++) //参照冒泡排序思想,将次大交换到次后
    {
        if(arr[i]>arr[i+1])
        {
            t=arr[i];
            arr[i]=arr[i+1];
            arr[i+1]=t;
        }
    }
    max1=arr[num-1];
    max2=arr[num-2];
    //找最大和次大
    for(i=0; i<num-1; i++) //参照冒泡排序思想,将最小交换到最后
    {
        if(arr[i]<arr[i+1])
        {
            t=arr[i];
            arr[i]=arr[i+1];
            arr[i+1]=t;
        }
    }
    for(i=0; i<num-2; i++) //参照冒泡排序思想,将次小交换到次后
    {
        if(arr[i]<arr[i+1])
        {
            t=arr[i];
            arr[i]=arr[i+1];
            arr[i+1]=t;
        }
    }
    min1=arr[num-1];
    min2=arr[num-2];
    cout<<max1+max2-min1-min2<<endl;
    return 0;
}

 

 







=================== 迂者 贺利坚 CSDN博客专栏=================
|== IT学子成长指导专栏 专栏文章的分类目录(不定期更新) ==|
|== C++ 课堂在线专栏  贺利坚课程教学链接(分课程年级) ==|
|== 我写的书——《逆袭大学——传给IT学子的正能量》    ==|
===== 为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =====

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迂者-贺利坚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值