PTA 练习实验6 十道练习题

T1 抗疫凯旋

输入格式:

若干行字符串。每行一个字符串,表示抗议英雄名字的拼音,长度不超过20个字符。

该题需要用到如何判断输入文件的结束。如果每次读一个整数,一直读到文件结尾,可以利用下面的示例:

int a;
while (scanf("%d", &a) != EOF)
{

}

输出格式:

当前名单中共有多少位抗疫英雄。

输入样例:

Wang Yaoping
Zhu Shengyong
Cu Zidong
Zhou Zheng

输出样例:

4

十分基础的一道题,附上代码

#include<iostream>
int cnt;
using namespace std;
int main(void){
    cout.tie(0);
    cin.tie(0);
    ios::sync_with_stdio(false);
    char ch;
    while((ch = getchar()) != EOF)
    {
        if(ch == '\n')
            cnt ++;
    }
    cout << cnt;
    return 0;
    }

 T2 求10个点到原点的距离和

求10个点到原点的距离和。输入10个点的坐标,计算并输出这些点到原点的距离和。定义函数dist(x, y),计算平面上任意一点(x, y)到原点(0, 0)的距离,函数返回值类型是double。

输入格式:

输入在一行中给出10对实数,每对实数对应一个点的横坐标和纵坐标。

输出格式:

在一行中按照“distance = S”的格式输出部分和的值S,精确到小数点后六位,请注意等号的左右各有一个空格。题目保证计算结果不超过双精度范围。

输入样例:

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

输出样例:

distance = 63.639610

 附上代码:

#include<iomanip>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
int cnt;
double dis[15];

using namespace std;
int main(void){
    cout.tie(0);
    cin.tie(0);
    ios::sync_with_stdio(false);
    double sum;
    int a[15][3];
    for(int i = 1; i<= 10; i ++)
    {
        for(int j = 1; j <= 2; j ++)
        {
            cin >> a[i][j];
        }
        dis[i] = sqrt(pow(a[i][1],2) + pow(a[i][2],2));
        sum += dis[i];

    };
    cout << fixed << setprecision(6) << "distance = " << sum << endl;
    return 0;
    }

T3 最小公倍数

3 最小公倍数

输入一对正整数x和y。

输入格式:

处理到文件结束
输入一对正整数x和y,输出二者的最小公倍数。

输出格式:

输出x,y的最小公倍数

输入样例:

1 3
15 20

输出样例:

3
60

 

显然,这也是一道基础题目

下面是代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
    
    int a, b;
    int gcd;
    while(cin >> a >> b)
    {
        if( a< b) swap(a, b);
        int lcm = a * b;
        int t = 0;
        while(b != 0)
        {
            t = a % b;
            a = b;
            b = t;
        }
        gcd = a;
        lcm = lcm / gcd;
        cout << lcm << '\n';
    }
    return 0;
    }
   

T4 变量有多少字节?

C/C++语言中,表示整数和浮点数有好多种数据类型。在32位平台中,每种类型在内存中占用的字节数各不相同:

char: 1 Byte

int: 4 Byte

long: 4 Byte

long long: 8 Byte

__int128: 16 Byte (前面两个下划线'_',此类型仅在C++支持,但不影响本题求解)

float: 4 Byte

double: 8 Byte

long double: 16 Byte

一个字节对应8位二进制数,这也决定了他们能表达数值的范围是有差异的。现在给你一些数据类型的查询,请输出其对应的字节数。

建议大家使用函数进行模块化编程,例如:

int getByteofType(char t[])
{
}

int main()
{
}

输入格式:

第一行一个整数N(1<=N<=1000),表示待查询的类型的数量。以下N行,每行给出一种类型。

输出格式:

每行一个整数,表示输入中类型对应的字节数。

输入样例:

6
char
long long
char
int
long
__int128

输出样例:

在这里给出相应的输出。例如:

1
8
1
4
4
16

主要思路在于如何判别两个字符串是否相等,故想到strcmp,对相等的字符串,返回值为0,利用这一点和题中提示,可得如下代码:

#include<stdio.h>
#include<string.h>
void getByteofType(char ch[])
{
    if(strcmp(ch,"char")==0)
        printf("1");
    if(strcmp(ch,"int")==0)
        printf("4");
    if(strcmp(ch,"long")==0)
        printf("4");
    if(strcmp(ch,"long long")==0)
        printf("8");
    if(strcmp(ch,"__int128")==0)
        printf("16");
    if(strcmp(ch,"float")==0)
        printf("4");
    if(strcmp(ch,"double")==0)
        printf("8");
    if(strcmp(ch,"long double")==0)
        printf("16");
    
}
int main()
{
    int n;
    char ch[100];
    scanf("%d", &n);
    getchar();
    for(int i = 0; i < n; i++)
    {
        gets(ch);
        getByteofType(ch);
        printf("\n");
    }
    return 0;
}

T5 斐波那契数列

输入格式:

一行,正整数N,(1<N<=1000000)

输出格式:

N位于第几项,如果不存在于数列中,输出-1

输入样例:

样例输入1:

2

样例输入2:

8

输出样例:

样例输出1:

3

样例输出2:

6

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
int main(void)
{
    int fib[32];
    memset(fib, 0, sizeof(fib));
    int i = 0;
    while(i ++ <= 32)
    {
        if( i == 1 || i == 2)
        {
            fib[i] = 1;
        }
        if(i >= 3)
        {
            fib[i] = fib[i-1] + fib[i-2];
         }
        //cout << i << " " << fib[i] << '\n';
    }
    int n;
    cin >> n;
    for(int j = 1; j<= 31; j ++)
    {
        if(fib[j] == n)
        {
            cout << j;
            return 0;
        }
    }
    cout << "-1" ;
    
    return 0;
}
   

T6 逆序实现输出

本题目要求读入1个正整数n,然后编写递归函数reverse(int n)实现将该正整数逆序输出。

输入格式:

输入在一行中给出1个正整数n。

输出格式:

对每一组输入,在一行中输出n的逆序数。

输入样例:

12345

输出样例:

54321

这里使用c++是十分简洁和优美的:

#include<iostream>
#include<cstdio>
#include<string.h>
#include<cmath>
#include<algorithm>
#include<cctype>
#include<cstring>
#define ll long long
#define ull unsigned long long
using namespace std;

int main(void){
    
    string a;
    cin >> a;
    int len = (int)a.size();
    for (int i = len - 1; i >= 0; i --){
        
        cout << a[i];
        
    }
    
    
    return 0;
}

T7 河南抗疫英雄

 

给出一系列抗疫英雄的姓名和来自的省份,现在请你帮忙统计来自河南的抗疫英雄有多少位。

注:建议大家使用函数进行模块化编程,例如:

bool judge(char name[], char province[]) //判断一个人员是否来自河南省
{

}

int main()
{

}

输入格式:

第一行一个整数N(1<=N<=100000),表示名单中共有多少人员。
以下N行中,每一行两个字符串用空格隔开,name province(name和province中均不包含空格,每个字符串长度都不超过20),分别表示姓名和省份的英文简称(这里我们明确河南省的代码固定为“HA”,其他省份代码我们不做要求,只要不是“HA”这个代码,我们就认为是其他省份);

输出格式:

一个数,表示来自河南省的人员有多少位。

输入样例:

在这里给出一组输入。例如:

3
aaa HA
bbb HK
qwe TW

输出样例:

在这里给出相应的输出。例如:

1

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
int cnt;


int main(void)
{
    int n;
    string name, province;
    cin >> n;
    for(int i = 1 ; i <= n; i ++)
    {
        cin >> name >> province;
        if(province == "HA")
        {
            cnt ++;
        }
    }
    cout << cnt;
    
}
   

8.出生年

 

以上是新浪微博中一奇葩贴:“我出生于1988年,直到25岁才遇到4个数字都不相同的年份。”也就是说,直到2013年才达到“4个数字都不相同”的要求。本题请你根据要求,自动填充“我出生于y年,直到x岁才遇到n个数字都不相同的年份”这句话。

输入格式:

输入在一行中给出出生年份y和目标年份中不同数字的个数n,其中y在[1, 3000]之间,n可以是2、或3、或4。注意不足4位的年份要在前面补零,例如公元1年被认为是0001年,有2个不同的数字0和1。

输出格式:

根据输入,输出x和能达到要求的年份。数字间以1个空格分隔,行首尾不得有多余空格。年份要按4位输出。注意:所谓“n个数字都不相同”是指不同的数字正好是n个。如“2013”被视为满足“4位数字都不同”的条件,但不被视为满足2位或3位数字不同的条件。

输入样例1:

1988 4

输出样例1:

25 2013

输入样例2:

1 2

输出样例2:

0 0001

附上代码:

请查看注释:

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
using namespace std;
bool vis[15];
int main(void)
{   int y, n;
    int sum;
    cin >> y >> n;
    for(int i = y; i <= 4000; i ++)
    {
        memset(vis, 0, sizeof(vis));//每次将其初始化为全负
        sum = 0;//每次更新sum
        for(int j = 1; j <= 1000; j *= 10)
        {
            if(!vis[(i/j) % 10])// i这里是年份,j相当于去位符,每次循环一次,就去掉一位
            {
                vis[(i/j) % 10] = 1;//标记这个数字,如1988, 为 1,9,8被标记
                sum += vis[(i/j) % 10];//被标记的个数,及不同数字的个数
            }
        }
        if(sum == n) // 被标记的个数和题目要求相同
        {
            cout << i - y << " " << setw(4) << setfill('0') << i << endl; //c++ yyds 使用setfill和setw使标准4位和0填充
            return 0;
        }
    }
        return 0;
    }

T9 汉诺塔 

 

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
void hanoi(int n, char a[], char b[], char c[])
{
    if  (n == 0) return;
    if  (n == 1)
    {
        cout << a << "->" << c << '\n';
    }
    else
        {
        hanoi(n-1, a, c, b);
        cout << a << "->" << c << '\n';
        hanoi(n-1, b, a, c);
        }
}
 int main()
   {
     int n;
     cin >> n;;
     char a[20], b[20], c[20];
     cin >> a >> b >> c;
     hanoi(n, a, b, c);
     return 0;
 }

 

T10

素因子分解

将单独发一篇文章介绍

 

 

 

 

 

 

 

  • 7
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值