PAT甲级_1024 Palindromic Number (25 分)|1025 PAT Ranking (25 分)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_44705116/article/details/102493264

1、1024 Palindromic Number (25 分)
题目大意:输入一个数,输入一个次数,在规定次数内若这个数不断与自己倒过来的数累加得到回文数,则输出回文数与次数,不然输出最终得到的数与次数。

使用字符串储存数,方便使用reverse进行翻转,此前我使用了N种reverse的错误用法…正确用法见代码;

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string str;
string t;
void add(string b){
    int l=b.length();
    int up=0;
    for(int i=0;i<l;i++){
        str[i]=up+str[i]+b[i]-'0';
        up=0;
        if(str[i]>'9'){
            up=1;
            str[i]=str[i]-10;
        }
    }
    if(up==1) str+='1';
    reverse(str.begin(),str.end());
}

上述代码在原字符串上进行运算修改,因为原字符串本就是逆向存放各位数字的,故最后要进位时只需加"1"如何reverse即可;同时注意将字符转化为int时要减"0";

写出主函数:

int main(){
    cin>>str;
    int d, i;
    scanf("%d", &d);
    for(i=0;i<d;i++){
        t=str;
        reverse(t.begin(),t.end());
        if(t==str) break;
        add(t);
    }   
    cout<<str<<endl;
    printf("%d", i);
}

2、1025 PAT Ranking (25 分)

考验使用排序函数、结构体的一题。

首先定义结构体与排序函数:

#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdio>
using namespace std;

struct stu
{
	long long int id;
	int mark, local, local_rank, final_rank;
};

bool cmp(stu a, stu b) {
	return a.mark != b.mark ? a.mark > b.mark : a.id < b.id;
}

写出主函数的输入部分,其中id输入使用%lld;将考场学生信息存入临时vector中,得出local_rank后,再存入全部学生的vector中。
使用?来完成对成绩相同的学生的排序并给予排名;


int main() {
	vector<stu> final;
	int N, K;
	scanf("%d", &N);
	for (int i = 0; i < N; i++) {
		scanf("%d", &K);
		vector<stu> temp(K);
		for (int j = 0; j < K; j++) {
			scanf("%lld %d", &temp[j].id, &temp[j].mark);
			temp[j].local = i + 1;
		}
		sort(temp.begin(), temp.end(), cmp);
		temp[0].local_rank = 1;
		final.push_back(temp[0]);
		for (int k = 1; k < K; k++) {
			temp[k].local_rank = (temp[k].mark == temp[k - 1].mark) ? (temp[k - 1].local_rank) :( k + 1);
			final.push_back(temp[k]);
		}
}

对全部学生进行排序:

	sort(final.begin(), final.end(), cmp);
	final[0].final_rank = 1;
	for (int k = 1; k < final.size(); k++) {
		final[k].final_rank = (final[k].mark == final[k - 1].mark )?( final[k - 1].final_rank ):( k + 1);
	}
	printf("%d\n", final.size());
	for (int i = 0; i < final.size(); i++) {
		printf("%013lld %d %d %d\n", final[i].id, final[i].final_rank, final[i].local, final[i].local_rank);
	}
	return 0;
}

注意输出格式。

每次编程都有低级错误能气死我

猜你喜欢

转载自blog.csdn.net/weixin_44705116/article/details/102493264
今日推荐