PTA乙级(持续更新...)

在这里插入图片描述

1001 害死人不偿命的(3n+1)猜想

参考代码

#include<stdio.h>
int main()
{
    int num=0,step=0;
    scanf("%d",&num);
    while(num != 1)
    {
        if(0==num%2)
        {
            num=num/2;
        }
        else
        {
            num=3*num+1;
            num=num/2;
        }
        step++;
    }
   printf("%d",step);
}
————————————————
版权声明:本文为CSDN博主「对音乐倔强的小周」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44042590/article/details/86133029

1002 写出这个数

1003 我要通过!

自己写的代码

自己再做一遍,感觉上面这段代码写的非常棒,是自己没有想到的方法

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string str;
	int n, x, y, p, t, a;
	cin >> n;
	while (n--)
	{
		cin >> str; //A A P A A T A A A A
					//0 1 2 3 4 5 6 7 8 9
					//    x     y
		x = 0; y = 0; p = 0; t = 0; a = 0;
		for (int i = 0; i < str.size(); i++)
		{
			if (str[i] == 'A')
			{
				a++;
			}
			if (str[i] == 'P')
			{
				p++;
				x = i;
			}
			if (str[i] == 'T')
			{
				t++;
				y = i;
			}
		}
		if (a + p + t != str.size() || p > 1 || t > 1 || y - x <= 1 || x * (y - x - 1) != str.size() - y - 1)
	  /*if (a + p + t != str.size() || p > 1 || t > 1 || p < t || x * (y - x - 1) != str.size() - y - 1)*/
			cout << "NO" << endl;
		else
			cout << "YES" << endl;
	}
	return 0;
}

参考代码

#include <stdio.h>
#include <string.h>
int main()
{
    char a[105];
    int i,j,n,len,P,A,T,x,y;
    scanf("%d\n",&n);
    for(i=0;i<n;i++)
    {
        gets(a);   //A A P A A T A A A A 
                   //0 1 2 3 4 5 6 7 8 9
                   //    x     y
        len=strlen(a);//10
        P = 0;
        A = 0;
        T = 0; 
        x= 0;
        y= 0;
        for(j=0;j<len;j++)
        {
            if(a[j]=='P')
            {
            	P++;        //1
                x= j;       //x=2
            }
            if(a[j]=='A')
            A++;        //1 2 3 4 5 6 7 8
            if(a[j]=='T')
            {
                T++;        //1
                y= j;       //y=5
            }
        }
        if (P+A+T!=len||y-x<=1||P>1||T>1||x*(y-x-1)!=len-y-1)
            //1+8+1=10  5-2<=1  1   1     2*(5-2-1)=4!=10-5-1=4
         //没有其他字母||P在T左面||保证只有一个p一个t||保证A的三段关系
            printf("NO\n");
        else
            printf("YES\n");
    }
} 
————————————————
版权声明:本文为CSDN博主「对音乐倔强的小周」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44042590/article/details/86133029

1004 成绩排名

以下是自己写的

这段代码14分,丢的6分段错误
段错误1:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
struct information
{
	int scord;
	string name;
	string num;
};
int comp(const information &a, const information &b)
{
	if (a.scord > b.scord) return 1;
	return 0;
}
int main()
{
	int n;
	information student[10000];
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> student[i].name >> student[i].num >> student[i].scord;
	}
	sort(student+0,student+n,comp);
	cout << student[0].name << " " << student[0].num << endl;
	cout << student[n - 1].name << " " << student[n - 1].num;
	return 0;
}

段错误2:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
struct information
{
	int scord=0;
	string name;
	string num;
};
information student[10000];
int main()
{
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> student[i].name >> student[i].num >> student[i].scord;
	}
	string maxName="", maxNum="", minName="", minNum="";
	int maxScord=0, minScord = 200;
	for (int i = 0; i < n; i++)
	{
		if (student[i].scord > maxScord)
		{
			maxScord = student[i].scord;
			maxName = student[i].name;
			maxNum = student[i].num;
		}
		if (student[i].scord < minScord)
		{
			minScord = student[i].scord;
			minName = student[i].name;
			minNum = student[i].num; 
		}
	}
	cout << maxName << " " << maxNum << endl << minName << " " << minNum;
	return 0;
}

段错误3:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
struct information
{
	int scord=0;
	string name;
	string num;
};
information student[10000];
int main()
{
	int n;
	int maxScord=0, minScord = 200,posMax=0,posMin=0;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> student[i].name;
		cin >> student[i].num;
		cin >> student[i].scord;
	}
	for (int i = 0; i < n; i++)
	{
		if (student[i].scord > maxScord)
		{
			maxScord = student[i].scord;
			posMax = i;
		}
		if (student[i].scord < minScord)
		{
			minScord = student[i].scord;
			posMin = i;
		}
	}
	cout << student[posMax].name << " " << student[posMax].num << endl << student[posMin].name <<" "<< student[posMin].num;
	return 0;
}

当大家运行之后会发现其实没有段错误,嘿嘿,这是因为刚开始定义的是

information student[10000];

在经过自己自习的研究后,改成

information student[10000];

就好了。
因为一个段错误,写出了3种方法,浪费了1个小时,不辛苦,命苦。
建议大家上个代码改成

information  *student = new Stu[n];

更佳,自个琢磨吧。

以下是参考他人的代码

#include <iostream>
 
using namespace std;
struct Student{
    string name;
    string number;
    int score;
};
 
int main()
{
    int n;
    cin>>n;
    Student *s = new Student[n];
    int smin=100,smax=0;
    int sminnum,smaxnum;
    for(int i=0;i<n;i++){
        cin>>s[i].name>>s[i].number>>s[i].score;
        if(s[i].score<smin){smin=s[i].score; sminnum=i;}
        if(s[i].score>smax){smax=s[i].score; smaxnum=i;}
    }
    cout<<s[smaxnum].name<<" "<<s[smaxnum].number<<endl;
    cout<<s[sminnum].name<<" "<<s[sminnum].number<<endl;
    return 0;
}
————————————————
版权声明:本文为CSDN博主「望君持之以恒」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/BoyInC0de/article/details/89065844

1007

#include<iostream>
using namespace std;
bool IsPrime(int num)	                    //num为我们要判断的数
{
	//for (int i = 2; i < num - 1; i++)		//最传统的方式
	//for (int i = 2; i < num/2; i++)		//只判断一半的方式
	for (int i = 2; i*i <= num; i++)		//最优化的判断方式
	{
		if (num % i == 0)
		{
			return false;
		}
	}
	return true;
}
int main()
{
	int n = 0, a[50000] = {0},count=0,count1=0;
	cin >> n;
	for (int i = 2; i <= n; i++)
	{
		if (IsPrime(i))
		{
			a[count] = i;
			count++;
		}
	}
	for (int i = 2; i < count; i++)
	{
		if (a[i] - a[i - 1] == 2)
			count1++;
	}
	cout << count1;
	return 0;
}

1008

#include<iostream>
using namespace std;
int main()
{
	int n, m, a[105] = {0};
	cin >> n >> m;
	m = m % n;
	for (int i = 1; i <= n; i++)
		cin >> a[i];
	for (int i = 0; i < m; i++)
	{
		a[0] = a[n];
		for (int j = n; j != 0; j--)
		{
			a[j] = a[j - 1];
		}
	}
	for (int i = 1; i <= n; i++)
		if (i == 1)
			cout << a[i];
		else
		cout <<" "<< a[i];
	return 0;
}

几个比较常用的函数

1. 判断素数

bool IsPrime(int num)	                    //num为我们要判断的数
{
	//for (int i = 2; i < num - 1; i++)		//最传统的方式
	//for (int i = 2; i < num/2; i++)		//只判断一半的方式
	for (int i = 2; i*i <= num; i++)		//最优化的判断方式
	{
		if (num % i == 0)
		{
			return false;
		}
	}
	return true;  //真为素数
}

对于一般题型比较常用

2.判断闰年

bool Leap_year(int y)//判断是否是闰年
{
    if (y % 400 == 0)    
        return true;
    if (y % 4 == 0 && y % 100 != 0)
        return true;
    return false;
}
bool LeapYear(int y)
{
	return (y%4==0&&y%100!=0)||(y%400==0);
}

3.求两数的最大公因数

while循环

inline int gcd(int a,int b) 
{
    int r;
    while(b>0) 
    {
        r=a%b;
        a=b;
        b=r;
    }
    return a;
}

三目运算符

inline int gcd(int a,int b) 
{
    return b>0 ? gcd(b,a%b):a;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值