有较为详细的解析,如有错误请直接联系我。
左侧目录可点击到达对应题目
点击标题可直接到达PTA
1.英文字母 - C/C++变量及简单数据类型
ASCII码中65对应A,97对应a,输入字符时,减去64即为大写字母的位数,反之+64即可
较为简单的判断
#include <bits/stdc++.h>
using namespace std;
int main(){
char a;
cin>>a;
cout<<(int(a)-64)<<endl;
int N;
cin>>N;
cout<<char(N+64);
}
2.温度单位转换 - C/C++ 语法基础
直接带入公式即可,注意第6行要写成5.0,要有一个高精度去自动转化
较为简单
#include <bits/stdc++.h>
using namespace std;
int main(){
int f;
cin>>f;
printf("%.1f",5.0/9*(f-32));
}
3.绩点计算 - C/C++ 语法基础
计算绩点首先先要收集数据,这一步较为简单
由于是固定的5组,每组两个初始数据,成绩和对应学分,但最后绩点计算的为各个绩点的加权平均
所以每组定义为三个数据,第一为分数,第二为学分,第三位为计算出来的绩点。
在计算绩点时,依据题意去添加一个判断,大于九十直接按4计算,
小于90按 课程绩点 = 4.0 * 分数/90 计算
if(i[0]<90){
i[2]=4.0*i[0]/90;
} else{
i[2] = 4;
}
接着循环累加各科目绩点加权平均即可
#include <bits/stdc++.h>
using namespace std;
int main(){
double num[5][3];
double sum = 0;
double sum1 = 0;
for (auto & i : num) {
cin >> i[0];
cin >> i[1];
if(i[0]<90){
i[2]=4.0*i[0]/90;
} else{
i[2] = 4;
}
}
for (auto & i : num) {
sum+=i[2]*i[1];
sum1+=i[1];
}
sum= sum/sum1;
printf("GPA:%.2f",sum);
}
4.菲姐游泳 -C/C++语法基础
这个似乎只能拆成分钟去计算,直接计算时钟减时钟,分钟减分钟,再判断的话,会有一点问题,暂时没想到好的解决办法。。。
#include <bits/stdc++.h>
using namespace std;
int main() {
int a = 0, b = 0,c =0, d = 0;
cin >> a >>b>>c>>d;
int delta = (c*60 + d) - (a*60 + b);
int m = delta % 60;
int h = (delta - m) / 60;
printf("%d:%d", h, m);
return 0;
}
5.求2个整数,3个整数的最大值,用同名函数实现
这个其实简单,不用同名函数直接判断也可以过测试,按照题意去写同名函数也不难
应该可以看懂代码,相当于方法的重(chong)载
#include <bits/stdc++.h>
using namespace std;
int max(int a,int b){
if(a>b){
cout<<a<<endl;
}else{
cout<<b<<endl;
}
}
int max(int a,int b,int c){
if(a>b){
if(a>c){
cout<<a;
}else{
cout<<c;
}
}else{
if(b>c){
cout<<b;
}else{
cout<<c;
}
}
}
int main(){
int a,b,c;
cin>>a>>b>>c;
max(a,b);
max(a,b,c);
}
6.函数重载(数据类型不同)
额,就是排序,直接用冒泡就可以。
#include <bits/stdc++.h>
using namespace std;
void sort(int n,int num[]){
for (int end = n-1; end>=0;end--) {
for (int j = 1; j <= end; ++j) {
if(num[j-1]>num[j]){
int temp = num[j-1];
num[j-1]=num[j];
num[j] = temp;
}
}
}
for (int i = 0; i < n; ++i) {
cout<<num[i]<<" ";
}
cout<<endl;
}
void sort(int n,double num[]){
for (int end = n-1; end>=0;end--) {
for (int j = 1; j <= end; ++j) {
if(num[j-1]>num[j]){
double temp = num[j-1];
num[j-1]=num[j];
num[j] = temp;
}
}
}
for (int i = 0; i < n; ++i) {
cout<<num[i]<<" ";
}
}
int main(){
int n;
cin>>n;
int num[n];
for (int i = 0; i < n; ++i) {
cin>>num[i];
}
double nummber[n];
for (int i = 0; i < n; ++i) {
cin>>nummber[i];
}
sort(n,num);
sort(n,nummber);
}
7.判断素数
判断素数,这个判断假如完全暴力循环判断时,遇到超大数时会超时。
for (int i = 2; i < num; ++i) {
if(num%i==0){
count++;
return 1;
break;
}
}
如何缩小范围呢?
有这样一个组合的乘积不是素数
3 * 3 = 9
4 * 4 = 16
5 * 5 = 25
……
46340 * 46340 = 2,147,395,600
任何一个非素数数都至少有一个小于等于该数开平方根的因数
所以将循环范围缩小到该数的开平方,就可以大大缩小循环次数
所以正解如下
#include <bits/stdc++.h>
using namespace std;
int PD(int num){
int count = 0;
if(num==1){
return 1;
}else{
for (int i = 2; i < sqrt(num); ++i) {
if(num%i==0){
count++;
return 1;
break;
}
}
if(count==0){
return 0;
}
}
}
int main(){
int n;
cin>>n;
int num[n];
for (int i = 0; i < n; ++i) {
cin >> num[i];
}
for (int j = 0; j < n; ++j) {
if(PD(num[j])==1){
cout<<"No"<<endl;
}else{
cout<<"Yes"<<endl;
}
}
return 0;
}
8.找完数
1.输入边界m n
2.在m n 之内进行循环
3.定义累加变量sum去累加各个因子
4.累加下的和和原数相同的话,进行输出
5.定义flag变量去记录是否有完数,没有的话最后输出“None”
#include <iostream>
using namespace std;
int main() {
int m;
int n;
int flag = 0;
cin >> m >> n;//输入边界,你可以自己换成scanf
for (int i = m; i <= n; ++i) {//循环,i为每一个在边界内的数
int sum = 0;//累加变量初始为0
for (int j = 1; j < i; ++j) {//与素数不同,这里要从1开始判断因子
if (i%j==0){
sum +=j;//定义累加变量sum去累加各个因子
}
}
if(sum == i){//累加下的和和原数相同的话,进行输出
int p = 0;
flag++;
cout<<i<<" = ";
for (int j = 1; j < i; ++j) {
if (i%j==0){
p +=j;
if(p!=i){
cout<<j<<" + ";
}else{
cout<<j;
}
}
}
cout<<endl;
}
}
if(flag == 0){//定义flag变量去记录是否有完数,没有的话最后输出“None”
cout<<"None";
}
return 0;
}
大佬嘎嘎牛,嘎嘎厉害
A wesome!!!