17HNUCM计科练习2题解

目录

冒泡排序

判断素数

对称矩阵 

矩阵对角求和

字符统计 

百元百鸡 

汽水瓶 

一只小蜜蜂... 

倒序输出 

数字求和 

骨牌铺方格 

递归计数 


冒泡排序

题目描述

从键盘上输入10个整数,用冒泡法对这10个数进行排序(由小到大)。

输入

以空格分隔的10个整数

输出

依次输出排好序的10个整数,每个数占一行。

样例输入 Copy

1 3 5 7 9 2 4 6 8 0

样例输出 Copy

0
1
2
3
4
5
6
7
8
9
#include

using namespace std;
int main()
{
    int a[10],i;
    for(i=0;i<10;i++){
        scanf("%d",a+i);
    }
    int j;
    for(j=0;j<10;j++){
        for(i=j+1;i<10;i++){
            if(a[j]>a[i])
                swap(a[j],a[i]);
        }
    }
    for(i=0;i<10;i++){
        printf("%d\n",a[i]);
    }
    return 0;
}

判断素数

题目描述

写一个函数判断一个正整数是否为素数。在主函数中输入一个大于1的正整数,通过调用这个函数,输出该数是否为素数的信息。
如果该数为素数,输出信息为:
Prime! 
若该数不为素数,则输出信息为:
Not Prime!
输入输出在主函数中进行。
 

输入

输入一个大于1的正整数。

输出

对输入的正整数进行素数的判定:
如果该数为素数,输出信息为:
Prime!
若该数不为素数,则输出信息为:
Not Prime!
输出信息单独占一行。

样例输入 Copy

18

样例输出 Copy

Not Prime!

 

#include

using namespace std;
int aa(int n){
    int i;
    if(n==1)
        return 0;
    for(i=2;i<=sqrt(n);i++){
        if(n%i==0)
            return 0;
    }
    return 1;
}
int main()
{
    long long  n;
    while(cin>>n){
        if(aa(n))
            printf("Prime!\n");
        else
            printf("Not Prime!\n");
    }
    return 0;
}

对称矩阵 

题目描述

 

输入一个N维矩阵,判断是否对称。

 

输入

 

输入第一行包括一个数:N(1<=N<=100),表示矩阵的维数。
接下来的N行,每行包括N个数,表示N*N矩阵的元素。

 

输出

 

可能有多组测试数据,对于每组数据,
输出"Yes!”表示矩阵为对称矩阵。
输出"No!”表示矩阵不是对称矩阵。

 

样例输入 Copy

1
68 
3
1 70 25 
70 79 59 
25 59 63 
3
6 46 82 
28 62 92 
96 43 28 

样例输出 Copy

Yes!
Yes!
No!

 

#include

using namespace std;

int main()
{
    long long  n;
    int i,j;
    while(cin>>n){
       int a[n][n];
       for(i=0;i

矩阵对角求和

题目描述

求一个n×n矩阵对角线元素之和,其中1≤n<100,矩阵元素都小于10000。

输入

第一行是一个正整数n。

然后是n行,每行对应矩阵的每行,元素间用空格隔开。

输出

第一行为主对角线元素和,第二行为副对角线的元素和。

样例输入 Copy

3
5724 1478 9358
6962 4464 5705
8145 3281 6827

样例输出 Copy

17015
21967

 

#include

using namespace std;

int main()
{
    long long  n;
    int i,j;
    while(cin>>n){
       int a[n][n];
       for(i=0;i

字符统计 

题目描述

输入一行字符串(字符串长度小于10000,由大小写字母、阿拉伯数字和空格组成),分别统计出其中大写英文字母,小写英文字母、阿拉伯数字和空格的个数。

输入

一行字符串(字符串长度小于10000,由大小写字母、阿拉伯数字和空格组成)

输出

分别输出大写英文字母,小写英文字母、阿拉伯数字和空格的个数,用空格隔开

样例输入 Copy

h0u84nfx 7

样例输出 Copy

0 5 4 1

 

#include

using namespace std;
int main()
{
    char a[10000];
    gets(a);
    int i;
    int b,c,d,f;
    b=c=d=f=0;
    for(i=0;i

百元百鸡 

题目描述

百元百鸡问题。每只母鸡3元,每只公鸡4元,每只小鸡0.5元,如果花100元钱买100只鸡,请问有哪些可能?试编程输出所有的组合。【注:每种鸡的数量都可以为零】

输入

输出

输出购买方案
每一种方案输出占一行,且每行按照母鸡,公鸡,小鸡的次序输出
然后行按照母鸡数量由小到大的次序输出。
例如:
x1 x2 x3
y1 y2 y3
z1 z2 z3
其中 x1 < y1 < z1 

 

#include

using namespace std;
int main()
{
    int i,j,k;
    for(i=0;i<=100/3;i++){
        for(j=0;j<=100/4;j++){
            if(i*3+j*4+(100-i-j)*0.5==100)
                cout<

汽水瓶 

题目描述

有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?

输入

输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1<=n<=100),表示小张手上的空汽水瓶数。n=0表示输入结束,你的程序不应当处理这一行。

输出

对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出0。

样例输入 Copy

3
10
81
0

样例输出 Copy

1
5
40
#include

using namespace std;
int aa(int n){
    if(n==2||n==3)
        return 1;
    else
        return n/3+aa(n/3+n-n/3*3);
}
int main()
{
    int n;
    while(cin>>n&&n){
        int s=aa(n);
        cout<

一只小蜜蜂... 

 

题目描述

有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。
其中,蜂房的结构如下所示。
17HNUCM计科练习2题解_第1张图片

输入

多组数据输入,每组数据包含两个正整数a, b,且 a

输出

蜜蜂从蜂房a爬到蜂房b的可能路线数。

样例输入 Copy

1 2
3 4

样例输出 Copy

1
1

 

#include

using namespace std;

int aa(int a,int b){
    if(b==a+1)
        return 1;
    else if(b==a+2)
        return 2;
    else
        return aa(a,b-1)+aa(a,b-2);
}

int main()
{
    int a,b;
    int i,j;
    while(cin>>a>>b){
        int s=aa(a,b);
        printf("%d\n",s);
    }
    return 0;
}

 

倒序输出 

 

题目描述

使用递归编写一个程序,逆序输出一个正整数。例如输入1234,输出4321。

输入

多组输入,每组输入一个正整数。

输出

逆序输出结果,每个结果占一行。

样例输入 Copy

12
1234

样例输出 Copy

21
4321
#include
using namespace std;

int main()
{
    long long  n;
    while(cin>>n){
        int a[100];
        int i=0;
        while(n){
            a[i]=n%10;
            n/=10;
            i++;
            printf("%d",a[i-1]);
        }
        cout<

数字求和 

题目描述

使用递归编写一个程序,计算一个正整数中所有数字之和。例如输入234,输出9

输入

多组输入,每组输入一个正整数。

输出

输出结果,每个结果占一行。

样例输入 Copy

234

样例输出 Copy

9

 

#include

using namespace std;

int aa(int a){
    if(a/10==0)
        return a%10;
    else
        return a%10+aa(a/10);
}

int main()
{
    int a;
    int i,j;
    while(cin>>a){
        int s=aa(a);
        cout<

骨牌铺方格 

题目描述

用大小为1×2的骨牌铺满一个大小为2×n的长方形方格,编写一个程序,输入n,输出铺放方案总数。例如,输入n=3,即大小为2×3的方格,输出3。3种骨牌铺放方案如下图所示:
17HNUCM计科练习2题解_第2张图片

输入

多组测试用例,每一组是一个正整数。

输出

每组输出占一行。
只需要输出铺放方案总数,不需要输出具体的铺放方案。

样例输入 Copy

3

样例输出 Copy

3

递归解法(原题提交超时): 

#include

using namespace std;

long long aa(long long n){
    if(n==2)
        return 2;
    else if(n==3)
        return 3;
    else
        return aa(n-1)+aa(n-2);
}

int main()
{
    long long  n;
    while(cin>>n){
        cout<

 非递归解法(不超时):

#include
using namespace std;
typedef long long lint;
int main()
{
    lint fun[55];
    int i;
    fun[1]=1;
    fun[2]=2;
    for(i=3;i<51;++i){
        fun[i]=fun[i-1]+fun[i-2];
    }
    long long n;
    while(cin>>n){
        cout<

递归计数 

 

题目描述

编写一个递归函数,返回一个字符串中大写字母的数目。例如,输入“AbcD”,输出2。

输入

多组输入,每组包括一个仅由大小写字母组成的字符串。

输出

输出字符串中出现大写字母的数目。

样例输入 Copy

AbcD

样例输出 Copy

2

 

#include

using namespace std;
int aa(string s,int n){
    if(n==0){
        if(isupper(s[n]))
            return 1;
        else
            return 0;
    }
    else{
        if(isupper(s[n]))
            return 1+aa(s,--n);
        else
            return 0+aa(s,--n);
    }
}
int main()
{
    string s;
    while(getline(cin,s)){
        int sum=aa(s,s.length());
        cout<

 

你可能感兴趣的:(算法学习)