PAT乙级(四)(1008-1010)

1008

在这里插入图片描述
下面这段代码显示部分错误。

#include <stdio.h>
#include <map>
#include <iostream>
#include <stack>
#include <queue>
#include <math.h>
#include <vector>
using namespace std;

int main(){
    int sum1,ct1,temp,position,boxin,boxout;
    cin>>sum1>>ct1;
    vector <int> vc;
    int ct = ct1;
    int ct2 = ct1;
    int sum = sum1;
    while(sum1--){
        cin>>temp;
        vc.push_back(temp);
    }
    ct--;
    while(ct>=0){
        int i = ct;
        int loop = sum/ct2;
        boxin = vc[ct];
        while(loop--){
            position = (i+ct2)%sum;
            boxout = vc[position];
            vc[position] = boxin;
            boxin = boxout;
            i = position;
        }
        ct--;
    }
    bool flag = false;
    for(int j=0;j<vc.size();j++){
        if (flag){
            cout<<' ';
        }
        flag = true;
        cout<<vc[j];
    }
    return 0;
}

下面这段代码来自https://blog.csdn.net/Aldo101/article/details/79516499

    #include <cstdio>
    const int MAXN = 110;
    
    int gcd(int a,int b) // 求最大公约数
    {
        if(b == 0)    return a;
        else    return gcd(b, a%b);
    }

    int main()
    {
        int N, M, iInput[MAXN];
        while(~scanf("%d%d",&N, &M))
        {
            for(int i = 0;i < N;i++)
            {
                scanf("%d",&iInput[i]);
            }
            
            M %= N;
            
            if(M != 0)
            {
                int d = gcd(N, M);
                for(int i = N - M;i <= N - M + d - 1;i++)
                {
                    int temp = iInput[i]; //记录temp变量;
                    int pos = i, next; // pos为此时此刻正在处理的变量,即为空缺位, next为将要和空缺位进行交换的位置
                    do
                    {
                        next = (pos - M + N) % N; //计算将要进行交换的位置 ,加N是如果移动到数组小于M的位置时再从右边开始
                        
                        if(next == i)  //如果回到了初始位置
                             iInput[pos] = temp;
                        else
                            iInput[pos] = iInput[next]; //如果下一个位置不是初始位置,那么将下一个位置的数字填入空缺位
                            
                        pos = next; // 继续下一个位置
                     } while(pos != i);
                    
                }
            }
            
            for(int i = 0;i < N;i++)
            {
                printf("%d%c",iInput[i], (i != N - 1)?' ':'\n');
            }
        }
        return 0;

    }

总结陈词

1、关注最大公约数求法

1009

在这里插入图片描述

#include <stdio.h>
#include <map>
#include <iostream>
#include <stack>
#include <queue>
#include <math.h>
#include <vector>
#include <string>
using namespace std;

int main(){
    string st;
    getline(cin, st);
    stack <char> qu;
    for(int i=st.size()-1;i>=0;i--){
        if (st[i]!=' '){
            qu.push(st[i]);
        }
        else{
            while(!qu.empty()){
                cout<<qu.top();
                qu.pop();
            }
            cout<<' ';
        }
    }
    while(!qu.empty()){
        cout<<qu.top();
        qu.pop();
    }
    return 0;
}

总结陈词

1、如果想读取一段带有空格的String,使用
string st; getline(cin, st);

1010

在这里插入图片描述

下面这段代码显示部分错误,不知道原因

#include <stdio.h>
#include <map>
#include <iostream>
#include <stack>
#include <queue>
#include <math.h>
#include <vector>
#include <String>
using namespace std;

int main(){
    string st;
    int blankcount = 0;
    vector <int> vc;
    vector <int> result;
    int c;
    cin>>c;
    vc.push_back(c);
    while(cin.get()!='\n'){
        cin>>c;
        vc.push_back(c);
    }
    for (int i=0;i<vc.size();i+=2){
        result.push_back(vc[i]*vc[i+1]);
        result.push_back(vc[i+1]-1);
    }
    for (int i=0;i<result.size();i++){
        if (result[i]!=0){
            cout<<result[i];
            if(i!=result.size()){cout<<' ';}
        }
        else{
            cout<<result[i];
            break;
        }
    }
    return 0;
}

参考网上解析,发现边循环边输出才能正确通过,不解


#include<iostream>
using namespace std;
int main() 
{
	int a,b;
	bool flag = true;
	while(cin>>a>>b)
	{
		if(b==0)
		  break;
		if(!flag)
		  cout<<" ";
		else
		  flag=false;
		cout<<a*b<<" "<<b-1;
	}
	if(flag)
	    cout<<"0 0";
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值