PTA作业(第一次)--编程题

  • 说反话-加强版

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int main() {
	string a; 
    getline(cin,a);
    int n=a.size();
    int i=0,t=0;
    for(i=n-1; i>=0; i--) {
        if(a[i]!=' ') {
            int len=i; 
            while(len>0&&a[len-1]!=' ')len--;
            if(t)cout<<' ';
            cout<<a.substr(len,i-len+1); 
            t=1;
            i=len;
        } }
    return 0;
}
  • 查验身份证

一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:
首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值:

Z:0 1 2 3 4 5 6 7 8 9 10
M:1 0 X 9 8 7 6 5 4 3 2

现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。
输入格式:
输入第一行给出正整数N(≤100)是输入的身份证号码的个数。随后N行,每行给出1个18位身份证号码。
输出格式:
按照输入的顺序每行输出1个有问题的身份证号码。这里并不检验前17位是否合理,只检查前17位是否全为数字且最后1位校验码计算准确。如果所有号码都正常,则输出All passed。
输入样例1:

4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X

输出样例1:

12010X198901011234
110108196711301866
37070419881216001X
点击查看代码
#include <bits/stdc++.h>
using namespace std;
int q[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
int flag=1;
char s[11]={'1','0','X','9','8','7','6','5','4','3','2'};
int main()
{
	int n;
    cin>>n;
	string id;
	int flag1=1;
    int k,sum;
	for(int i=0;i<n;i++){
		cin>>id;
       
		k=0,sum=0;
		flag=1;
		for(int j=0;j<17;j++){
			if(id[j]=='X'){
				flag=0;	
				break;
			}
			
			int temp=id[j]-'0';
			sum+=temp*q[k];
			k++;
		}
		int cmp=sum%11;
		char ch=s[cmp];
		if(ch!=id[17]||flag==0){
			cout<<id<<endl;
			flag1=0;
		}
			
		else 
			continue;

	}	
	if(flag1==1){
		cout<<"All passed";
	}
	return 0;
}
  • 掉入陷阱的数字

对任意一个自然数N ,先将其各位数字相加求和,再将其和乘以3后加上1,变成一个新自然数N1
​;然后对N1重复这种操作,可以产生新自然数N2;……多次重复这种操作,运算结果最终会得到一个固定不变的数Nk,就像掉入一个数字“陷阱”。
本题要求对输入的自然数,给出其掉入“陷阱”的过程。
输入格式:
在一行内给出一个自然数N (N<30000)。
输出格式:
对于输入的N0,逐行输出其掉入陷阱的步骤。第i行描述N掉入陷阱的第i步,格式为: i:Ni(i≥1)。当某一步得到的自然数结果Nk(k≥1)与上一步N k−1相同时,停止输出。
输入样例:
5
输出样例:

1:16
2:22
3:13
4:13
点击查看代码
#include <bits/stdc++.h>
using namespace std;
stack<int>s;
int main()
{
	int n,num=1;
	cin>>n;
    int a=n;
	int sum=0;
	while(n){
		
		sum+=n%10;
		n/=10;
	}
	n=sum*3+1;
    if(a==n){
        cout<<num<<":"<<n<<endl;
        return 0;
    }
	cout<<num<<":"<<n<<endl;
	s.push(n);
	while(1){
		num++;
		sum=0;
		while(n){

		sum+=n%10;
		n/=10;
		}
		n=sum*3+1;
		if(n==s.top()){
			cout<<num<<":"<<n;
            break;
		}
		s.push(n);
		cout<<num<<":"<<n<<endl;
	}
	return 0;	
}
  • 最长对称子串

对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11。
输入格式:
输入在一行中给出长度不超过1000的非空字符串。
输出格式:
在一行中输出最长对称子串的长度。
输入样例:
Is PAT&TAP symmetric?
输出样例:
11

点击查看代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
    string s;
    int maxlen = 1, len;//最小为一
    getline(cin, s);
    int right = 1, left = 0, flag = -1;
    int i, j;
    for (i = 0; i < s.size(); i++)
    {
        for (j = i + 1; j < s.size(); j++)
        {

            if (s[i] == s[j])
            {
                left = i;
                right = j;
                for (; left <= right; right--, left++)
                {
                    if (s[left] != s[right])
                        break;
                }
                if (left>right)
                {
                    maxlen=max(maxlen,j-i+1);
                
                }
            }
        }
    }
    cout << maxlen;
    return 0;
}
  • 求迷宫最短通道

递归求解迷宫最短通道的总步长。输入一个迷宫,求从入口通向出口的可行路径中最短的路径长度。为简化问题,迷宫用二维数组int maze[10][10]来存储障碍物的分布,假设迷宫的横向和纵向尺寸的大小是一样的,并由程序运行读入, 若读入迷宫大小的值是n(3<n<=10),则该迷宫横向或纵向尺寸都是n,规定迷宫最外面的一圈是障碍物,迷宫的入口是maze[1][1],出口是maze[n-2][n-2], 若maze[i][j] = 1代表该位置是障碍物,
若maze[i][j] = 0代表该位置是可以行走的空位(0<=i<=n-1, 0<=j<=n-1)。求从入口maze[1][1]到出口maze[n-2][n-2]可以走通的路径上经历的最短的总步长。要求迷宫中只允许在水平或上下四个方向的空位上行走,走过的位置不能重复走。
输入格式:
输入迷宫大小的整数n, 以及n行和n列的二维数组(数组元素1代表障碍物,0代表空位)
输出格式:
若有可行的通道则输出一个整数,代表求出的通道的最短步长;若没有通道则输出"No solution"
输入样例:

10
1 1 1 1 1 1 1 1 1 1
1 0 0 1 0 0 0 1 0 1
1 0 0 1 0 0 0 1 0 1
1 0 0 0 0 1 1 0 0 1
1 0 1 1 1 0 0 0 0 1
1 0 0 0 1 0 0 0 0 1
1 0 1 0 0 0 1 0 0 1
1 0 1 1 1 0 1 1 0 1
1 1 0 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1

输出样例:
14

点击查看代码
#include <bits/stdc++.h>
using namespace std;
int n;
int map1[10][10];
int book[10][10];
int step;
int min1=9999;
int nx[4]={1,-1,0,0};
int ny[4]={0,0,1,-1};
void dfs(int x,int y,int step){
	if(x==n-2&&y==n-2){
		if(step<min1){
			min1=step;
			return;
		}
	}
	if(step>=min1)return;
	for(int i=0;i<4;i++){
		int tx=x+nx[i];
		int ty=y+ny[i];
		if(tx>=0&&tx<n&&ty>=0&&ty<n&&book[tx][ty]==0&&map1[tx][ty]==0){
			book[tx][ty]=1;
			dfs(tx,ty,step+1);
			book[tx][ty]=0;

		}
	}
	return;
}
int main()
{
	cin>>n;
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			cin>>map1[i][j];
		}
	}
	dfs(1,1,0);
	book[1][1]=1;
	if(min1==9999)cout<<"No solution";
	else cout<<min1<<endl;
	return 0;
}
  • 停车场管理

设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的先后次序依次从停车场最里面向大门口处停放 (即最先到达的第一辆车停放在停车场的最里面) 。如果停车场已放满n辆车,则以后到达的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车可以进入停车场。停车场内如有某辆车要开走,则在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费,停留在便道上的车不收停车费。编写程序对该停车场进行管理。
输入格式:
先输入一个整数n(n<=10),再输入若干组数据,每组数据包括三个数据项:汽车到达或离开的信息(A表示到达、D表示离开、E表示结束)、汽车号码、汽车到达或离开的时刻。
输出格式:
若有车辆到达,则输出该汽车的停车位置;若有车辆离开,则输出该汽车在停车场内停留的时间。如果汔车号码不存在,输出the car not in park
输入样例:

3
A 1 1 
A 2 2
A 3 3
D 1 4
A 4 5
A 5 6
D 4 7
D 5 8
E 0 0

输出样例:

car#1 in parking space #1
car#2 in parking space #2
car#3 in parking space #3
car#1 out,parking time 3
car#4 in parking space #3
car#5 waiting
car#4 out,parking time 2
car#5 in parking space #3
car#5 out,parking time 1
点击查看代码
#include <bits/stdc++.h>
using namespace std;
class Car {
public:
    int id, start;
};
int main() {
    char mCase;
    int id, time, n;
    cin >> n;
    list<Car> park;
    stack<Car> waitPark;
    do {
        cin >> mCase >> id >> time;
        if (mCase == 'A') {
            if (park.size() >= n) {
                waitPark.push({id, time});
                printf("car#%d waiting\n", id);
            } else {
                park.push_back({id, time});
                printf("car#%d in parking space #%d\n", id, park.size());
            }
        } else if (mCase == 'D') {
            auto index = park.end();
            for (auto i = park.begin(); i != park.end(); i++) {
                if (i->id == id) {
                    index = i;
                    break;
                }
            }
            if (index == park.end())
                printf("the car not in park\n");
            else {
                printf("car#%d out,parking time %d\n", id, time - index->start);
                park.erase(index);
                while (park.size() < n && !waitPark.empty()) {
                    Car temp = waitPark.top();
                    temp.start = time;
                    waitPark.pop();
                    park.push_back(temp);
                    printf("car#%d in parking space #%d\n", temp.id, park.size());
                }
            }
        };
    } while (mCase != 'E');
}
  • 使用函数删除字符串中的字符

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:
输入一个字符串 str,再输入一个字符 c,将字符串 str 中出现的所有字符 c 删除。
要求定义并调用函数delchar(str,c), 它的功能是将字符串 str 中出现的所有 c 字符删除,函数形参str的类型是字符指针,形参c的类型是char,函数类型是void。
输入输出示例:括号内为说明,无需输入输出
输入样例:

3               (repeat=3)
happy new year  (字符串"happy new year")
a               (待删除的字符'a')
bee             (字符串"bee")
e               (待删除的字符'e')
111211          (字符串"111211")
1               (待删除的字符'1')

输出样例:

result: hppy new yer    (字符串"happy new year"中的字符'a'都被删除)
result: b               (字符串"bee"中的字符'e'都被删除)
result: 2               (字符串"111211"中的字符'1'都被删除)
点击查看代码
#include <stdio.h>
void delchar(char *str,char c){
    char *p,*q;
    for(p=str,q=str;*p!='\0';p++){
        if(*p!=c)
            *q++=*p;
    }
    *q=*p;
    printf("result: %s\n",str);
}
int main()
{
    int n;
    char s[10][1000]={0},c1[10]={0};
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        getchar();
        gets(s[n]);
        c1[n]=getchar();
    }
    for(int i=0;i<n;i++){
        delchar(s[n],c1[n]);
    }
    return 0;
}
  • 报数

输入两个正整数 n 和 m( (1<m<n<=50)),有 n 个人围成一圈,按顺序从 1 到 n 编号。从第一个人开始报数,报数 m 的人退出圈子,下一个人从 1 开始重新报数,报数 m 的人退出圈子。如此循环,直到留下最后一个人。请按退出顺序输出退出圈子的人的编号,以及最后一个人的编号。
提示:将每个人的编号存入数组,从第一个人开始报数,输出报数 m 的人的编号,并将该编号清除为0,重复这样的操作直至只剩下一个不为0的数,该数就是最后一个人的编号。
输入输出示例:括号内为说明,无需输入输出
输入样例:

5               (n个人报数,n=5)
3               (报数m=3)

输出样例:

No1: 3          (第1个退出圈子的人编号是3)
No2: 1	        (第2个退出圈子的人编号是1)
No3: 5	        (第3个退出圈子的人编号是5)
No4: 2	        (第4个退出圈子的人编号是2)
Last No is: 4   (最后一个人的编号是4)
点击查看代码
#include <bits/stdc++.h>
using namespace std;
list<int>l;
int main()
{
    int n,num;
    cin>>n>>num;
    for(int i=0;i<n;i++){
        l.push_back(i+1);
    }
    int count=1;
    list<int>::iterator it=l.begin();
     int temp=1;
    while (l.size()>1)
    {
           
            if(temp++%num==0){
                cout<<"No"<<count<<": "<<*it<<endl;
                count++;
                it=l.erase(it);
                temp=1;
            }
            else
                it++;
                if(it==l.end())it=l.begin();
        
    }
    cout<<"Last No is: "<<*l.begin();
    
}
  • 使用函数实现字符串复制

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:
输入一个字符串 t 和一个正整数 m,将字符串 t 中从第 m 个字符开始的全部字符复制到字符串 s 中,再输出字符串 s。
要求定义并调用函数 strmcpy(s,t,m), 它的功能是将字符串 t 中从第 m 个字符开始的全部字符复制到字符串 s 中,函数形参s和t的类型是字符指针,形参m的类型是int,函数类型是void。
输入输出示例:括号内为说明,无需输入输出
输入样例:

3              (repeat=3)
happy new year
7
happy
1
new
4

输出样例:

new year        (从"happy new year"第7个字符开始组成的新字符串为"new year")
happy           (从"happy"第1个字符开始组成的新字符串为"happy")
error input     ("new"的长度小于4)
点击查看代码
#include<stdio.h>
#include<string.h>
void main()
{
	char s[100], t[100];
	int m;
	int repeat, r;
	void strmcpy(char* s, char* t, int m);
	scanf("%d", &repeat);
	getchar();
	for (r = 1; r <= repeat; r++) {
		gets(t);
		scanf("%d", &m);
		getchar();
		if (strlen(t) < m)
			printf("error input");
		else {
			strmcpy(s, t, m);
			puts(s);
		}
	}
}
void strmcpy(char* s, char* t, int m)
{
	int i, j;
	j = 0;
	for (i = m - 1; t[i] != '\0'; i++)
		s[j++] = t[i];
	s[j] = '\0';
}
  • 简单字符串string处理(三人行)

凤湖中学在这学期流行一个名为“三人行”英文诗赛。比赛中,"老师"先说一个英语单词作为主题词,然后三位“路人"各说一句英语诗,看谁的诗更符合主题词。以主题词中的字母在诗中的出现次数作为符合度。在评价符合度时:不区分大小写;只关注英语字母(a-z),忽略其它字母。如果某句诗所含英语字母数大于20个,则分别用该诗句的前20个英语字母和后20个英语字母来计算符合度,并取两者之较大值作为实际的符合度。
输入格式:
输入一共有4行,第1行是一个主题词,接下来的3行,各输入一句英语诗句。
输出格式:
输出一共有3行,是各句诗的符合度。
输入样例:

soon
Some tours are doomed to return, Some doors are destined to open then to close.
Days fly by. Soon I need to remove this page, and hang up a new year.
Summer isn't far behind, And another year has passed.

输出样例:

8
7
5
点击查看代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
    string s1, poem,spoem;
    getline(cin, s1);
    for(int i=0;i<s1.size();i++){
        s1[i] = tolower(s1[i]);
    }
    for (int h= 0; h < 3; h++)
    {
        int num1 = 0,num2=0;
        getline(cin, poem);
        for (int i= 0; i< poem.size(); i++){
            if(isalpha(poem[i])){
                poem[i] = tolower(poem[i]);
                spoem.push_back(poem[i]);
            }
        }
        int len = spoem.length();
//         cout<<len<<endl;
//         cout<<spoem<<endl;   
        for (int j = 0; j <len&&j<20; j++){
            for (int k = 0; k < s1.size(); k++){
                if (spoem[j] == s1[k]){
                    num1++;
                    break;
                }
            }
        }
        if(len>20){
           for (int j = len-1; j>=len-20; j--){
            for (int k = 0; k < s1.size(); k++){
                if (spoem[j] == s1[k]){
                    num2++;
                    break;
                }
            }
        }
       
    }
     num1=max(num1,num2);
    cout << num1 << endl;
    spoem.clear();
    }
}
posted @ 2022-04-26 16:24  21CodeXin  阅读(487)  评论(0)    收藏  举报