Pat刷题第一周

Posted William_Tao(攻城狮)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pat刷题第一周相关的知识,希望对你有一定的参考价值。

文章目录

pat刷题(第一周)

第一题【PAT B1001】害死人不偿命的(3n+1)猜想

https://pintia.cn/problem-sets/994805260223102976/problems/994805325918486528

#include<iostream>
using namespace std;
int main()
    int n,step=0;
    cin>>n;
    while(n!=1)
        if(n%2==0) n=n>>1;
        else n=(3*n+1)/2;
        step++;
    
    cout<<step<<endl;
    return 0;

第二题【PAT B1032】挖掘机技术哪家强

https://link.zhihu.com/?target=https%3A//pintia.cn/problem-sets/994805260223102976/problems/994805289432236032

#include<bits/stdc++.h>

using namespace std;
int main()
    map<int,int> mp;
    int n=0;
    cin>>n;
    while(n--)
        int key;int value;
        cin>>key>>value;
        mp[key]+=value;
    
    int max=-888888;
    int id=-888888;
    for(auto v: mp)
        if(v.second >max)
            id=v.first;
            max= v.second;
        
    
    cout<<id<<" "<<max<<endl;
    return 0;

第三题【PAT B1011】A+B 和 C

https://pintia.cn/problem-sets/994805260223102976/problems/994805312417021952

#include <iostream>
#include<utility>
using namespace std;

int main()


int n;
int cnt=1;//用于计数
cin>>n;
long long int A,B,C;
while(n--)
    cin>>A>>B>>C;
    if((A+B-C)>0)
        cout<<"Case #"<<cnt<<": true"<<endl;
    else
           cout<<"Case #"<<cnt<<": false"<<endl;
    
    cnt++;

    return 0;

第四题【PAT B1016】部分A+B

https://pintia.cn/problem-sets/994805260223102976/problems/994805306310115328

#include <iostream>
#include<utility>
#include<string>
using namespace std;
int CountNum(int X, int DX)
  int Count = 0, PX = 0;
  while(X)
    if(X%10==DX) PX=PX*10+DX;
    X/=10;

  
  return PX;

int main()



  int A, DA, B, DB, PA, PB;
    cin >> A >> DA >> B >> DB;
    cout << CountNum(A, DA) + CountNum(B,DB) << endl;
    return 0;


第五题【PAT B1026】程序运行时间)

https://pintia.cn/problem-sets/994805260223102976/problems/994805295203598336

//#include<bits/stdc++.h>
#include <iostream>
#include<utility>
#include<string>
#include <math.h>
#include<iomanip>
using namespace std;

int main()



 int c1,c2;
 cin>>c1>>c2;
 int cnt=round((c2-c1)/100.0);
 int hh,mm,ss;
 hh=cnt/3600;
 mm=(cnt%3600)/60;
 ss=cnt-hh*3600-mm*60;
 cout<<setw(2)<<setfill('0') <<hh<<":"<<setw(2)<<setfill('0') <<mm<<":"<<setw(2)<<setfill('0')<<ss<<endl;
    return 0;


第六题【PAT B1046】划拳

https://pintia.cn/problem-sets/994805260223102976/problems/994805277847568384

题目最后输出给的有问题,应该输出的是甲 乙 而不是乙 甲

#include <iostream>
#include<utility>
#include<string>
#include <math.h>
#include<iomanip>
using namespace std;

int main()


int n;

//A代表甲喝的杯数 B代表乙喝的杯数
int A=0,B=0;
int i=0;
cin>>n;
while(n--)
        //AT 代表甲喊  BT代表乙喊   AH代表甲划  BH代表乙划
    int A1,B1,A2,B2;
    cin>>A1>>A2>>B1>>B2;
    if(((A1+B1)==A2) &&((A1+B1)!=B2))
        A++;
    
    if(((A1+B1)!=A2) &&((A1+B1)==B2))
        B++;
    


cout<<A<<" "<<B<<endl;
    return 0;

第七题【PAT B1008】数组元素循环右移问题

https://pintia.cn/problem-sets/994805260223102976/problems/994805316250615808

使用队列的方法来操作

using namespace std;

int main()


int n,m;
cin>>n>>m;
deque <int>res(n);

for (int i = 0;i<n;i++) cin >> res[i];
for(int i=0;i<m;i++)
    res.push_front(res[n-1]);
    res.pop_back();

for(int i=0;i<n;i++)
    cout << (i == 0 ? "" : " ");
		cout << res[i];

return 0;


第八题【PAT B1012】数字分类

本题参考的别人的:

思路:

开始没用flagx计数,然后就部分错误,后来想了想,发现几个A等于0的情况不一定就是N,还有的是真的算出0来。比如说A1,如果只有一个数字,而且是0输入,那么A1=0;比如说A2,如果有两个数字6、6输入,那么A2=6-6=0。

所以需要flagx来计数,看看到底是没有这一类的数据,还是算出了0值。

https://pintia.cn/problem-sets/994805260223102976/problems/994805311146147840

#include <iostream>
#include <stdio.h>
using namespace std;

int main()

    int N, A1=0, A2=0, A3=0, A4=0, A5=0;
    int tmp, flag=1, flag1=0, flag2=0, flag3=0, flag4=0, flag5=0;
    cin >> N;
    while(N--)
        cin >> tmp;
        if(tmp%10==0) A1 += tmp; flag1++;
        if(tmp%5==1)A2 += flag*tmp; flag *= -1; flag2++;
        if(tmp%5==2) A3++; flag3++;
        if(tmp%5==3) A4 += tmp; flag4++;
        if(tmp%5==4 && tmp>A5) A5 = tmp; flag5++;
    
    if(!A1 && !flag1) cout << "N";
    else cout << A1;
    if(!A2 && !flag2) cout << " N";
    else cout << " " << A2;
    if(!A3 && !flag3) cout << " N";
    else cout << " " << A3;
    if(!A4 && !flag4) cout << " N";
    else printf(" %.1f", (double)A4/(double)flag4);
    if(!A5 && !flag5) cout << " N";
    else cout << " " << A5;
    return 0;


第九题【数素数】

#include<bits/stdc++.h>
using namespace std;
bool isPrime(int n)
    for ( int i=2; i<=(int)sqrt(n); i++ )//如果n被i整除,则返回false
        if(n%i==0)
            return false;
            break;
        
    
    return true;    // 反之则返回true


#include<stdio.h>
int main()

	int m, n, pri[10000] ; //(因为2~1000素数太多,放在博客太冗余)pri初始化自写百度,也就是2~10000中的所有素数
	cin>>m>>n;
	for (int i = m - 1; i < n - 1; i++)
	
		if ((i - m + 1) % 10 == 9)
		cout<<pri[i]<<endl;
		else
			cout<<pri[i]<<" ";
	
	cout<<pri[n-1];
	return 0;

第十题 【福尔摩斯的约会】

https://www.nowcoder.com/pat/6/problem/4040

注意点:

  • 对于临界点的等号不要少
  • 记得if里面的break不能丢,否则会有问题
#include<bits/stdc++.h>
using namespace std;
vector<string> week ="MON","TUE","WED","THU","FRI","SAT","SUN";
int main()

    string a1,a2,b1,b2;
    cin>>a1>>a2>>b1>>b2;
    int flag=false;
    int day;
    for(day=0;a1[day]&&a2[day];day++)
        if(a1[day]==a2[day] &&a1[day]>='A' &&a1[day]<='G')
            cout<<week[a1[day]-'A']<<" ";
            break;
        
    
    int hh;
    for(hh=day+1;a1[hh]&&a2[hh];hh++)
        if(a1[hh]==a2[hh])
            if(a1[hh]>='A' &&a1[hh]<='N')

                    printf("%02d",a1[hh]-'A'+10);
                    break;
            
            if(isdigit(a1[hh]))
                  printf("%02d",a1[hh]-'0');
                   break;

            
        
    
    int ss;
    for(ss=0;b1[ss]&&b2[ss];ss++)
        if(b1[ss]==b2[ss] &&isalpha(b1[ss]))
              printf(":%02d",ss);
              break;
        
    

	return 0;


第十一题【查验身份证】

https://www.nowcoder.com/pat/6/problem/4057

#include<bits/stdc++.h>
using namespace std;
vector<int> weight =7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2;
//计算权重
    int returnWeight(vector<int> &weight,string arr)
         int sum=0;
        for(int i=0;i<17;i++)
                sum+=(arr[i]-'0')*weight[i];

        
        return sum%11;
    
    //判断前17个是否为数字
    bool Isdigit(string str)

      for(int i=0;i<17;i++)
            if(!isdigit(str[i]))
                return false;
            

         
         return true;
    
int main()

    int n;
    cin>>n;
    //输出All pass or other
    int flag=1;
    while(n--)
        string str;
        cin>>str;
        vector<int> arr(17);
         for(int i=0;i<17;i++)
            arr[i]=str[i]-'0';
         
         //计算加权平均和
         int sum=returnWeight(weight,str);
      char M[11]='1','0','x','9','8','7','6','5','4','3','2';



       if(!(Isdigit(str)==1 &&M[sum]==str[17]))
        flag=0;
            cout<<str<<endl;
       



    
    if(flag)
    
        cout<<"All passed"<<endl;
    


	return 0;


第十二题【个位数统计】

https://www.nowcoder.com/pat/6/problem/4047

#include<bits/stdc++.h>
using namespace std;

int main()

    map<int,int> mp;
    string str;
    cin>>str;
    for(int i=0;i<str.size();i++)
        mp[str[i]-'0']++;
    
    for(auto v:mp)
        if(v.second!=0)
            cout<<v.first<<":"<<v.second<<endl;
        
    

	return 0;


第十三题【A除以B 】

https://www.nowcoder.com/pat/6/problem/4043

本题参考的答案

基本思想:

是手算除法的过程,比如100/2: 等价于1/2, 商为0, 余数为1, 商为0的情况下不能输输出,然后余数和下一位: 即0, 组合为110+0=10, 就变成10/2, 商为5余数为0,此时输出商数.然后0和下一位0组合为010+0=0, 0/2余数为0, 此时运算完毕。

链接:https://www.nowcoder.com/questionTerminal/25c3ae17bc99425b99542802ee882377
来源:牛客网

#include <iostream>
 
int main()
 

 
using namespace std;
 
 
 
string A;
 
char Q;
 
int B, R = 0;
 
int current;
 
 
 
cin >> A >> B;
 
 
 
for(int i = 0; i < A.length(); i++)
 

 
// 当前的被除数
 
current = R * 10 + (A[i] - '0');
 
// 除数
 
Q = current / B + '0';
 
// 余数
 
R = current % B;
 
 
 
// 当除数以0开头时,则不打印
 
if(i == 0 && Q == '0')
 
continue;
 
else
 
cout << Q;
 

 
cout << ' ';
 
cout << R;
 
 
 
return 0;
 

第十四题【剪刀石头布】

https://www.nowcoder.com/pat/6/problem/4044

#include <iostream>
using namespace std;

int main()

    int N;
    cin >> N;
    char tmp1, tmp2;
    int win=0, equ=0, lose=0;
    int C1=0, C2=0, B1=0, B2=0, J1=0, J2=0;
    while(N--)
        cin >> tmp1 >> tmp2;
        if(tmp1=='C' && tmp2=='C') equ++;
        else if(tmp1=='C' && tmp2=='J') win++;C1++;
        else if(tmp1=='C' && tmp2=='B') lose++;B2++;
        else if(tmp1=='J' && tmp2=='C') lose++;C2++;
        else if(tmp1=='J' && tmp2=='J') equ++;
        else if(tmp1=='J' && tmp2=='B') win++;J1++;
        else if(tmp1=='B' && tmp2=='C') win++;B1++;
        else if(tmp1=='B' && tmp2=='J') lose++;J2++;
        else if(tmp1=='B' && tmp2=='B') equ++;
    
    cout << win << ' ' << equ << ' ' << lose << endl;
    cout << lose << ' ' << equ << ' ' << win << endl;
    if(B1>=C1 && B1>=J1) cout << "B ";
    else if(C1>=J1) cout << "C ";
    else cout << "J ";
    if(B2>=C2 && B2>=J2) cout << 'B';
    else if(C2>=J2) cout << 'C';
    else cout << 'J';
    return 0;


以上是关于Pat刷题第一周的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode刷题第一周

csp刷题第一周

LeetCode算法题--刷题第一天

(基础杂记) —— 2021-07-13 —— 牛客刷题错题记录

(基础杂记) —— 2021-07-13 —— 牛客刷题错题记录

(基础杂记) —— 2021-07-13 —— 牛客刷题错题记录