PAT刷题笔记——和奥巴马一起编程,日期差值,D进制的A+B,回文串和说反话

目录

PAT B1036和奥巴马一起编程

###(1)运行代码与结果展示
###(2)思路分析

codeup 1928求日期差值

###(1)运行代码与结果展示
###(2)思路分析

PAT B1022D进制的A+B

###(1)运行代码与结果展示
###(2)思路分析

codeup 5901回文串

###(1)运行代码与结果展示
###(2)思路分析

PAT B1009说反话

###(1)运行代码与结果展示
###(2)思路分析

PAT B1036和奥巴马一起编程

(1)运行代码与结果展示

(PAT B10361跟奥巴马一起编程题目描述

美国总统奥巴马不仅呼吁所有人都学习编程,甚至亲自编写代码,成为美国历史上首位编写计算机代码的总统。2014 年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了一个简单的计算机程序 在屏幕上画一一个正方形。现在你也跟他“一起”编程吧!输入格式

在一行中给出正方形边长N (3≤N≤20)和组成正方形边的某种字符C,间隔- -个空格。输出格式

由给定字符C画出的正方形。但是注意到行间距比列间距大,所以为了让结果看上去更像正方形,所输出的行数实际上是列数的50% (四舍五入取整)。样例输入10 a

样例输出

aaaaaaaaaa
a a
a a
a a
aaaaaaaaaa
vs中编译的代码如下:

#include<cstdio>
#include<string.h>
using namespace std;
#include<Windows.h>
int main() {
	int row, col;
	char c;
	scanf_s("%d %c", &col, &c);
	if (col % 2 == 1) row = col / 2 + 1;
	else row = col / 2;
	for (int i = 0; i < col; i++) {
		printf("%c", c);
	}
	printf("\n");
	for (int i = 2; i < row; i++) {
		printf("%c", c);
		for (int j = 0; j < col - 2; j++) {
			printf(" ");
		}
		printf("%c\n", c);
	}
	for (int i = 0; i < col; i++) {
		printf("%c", c);
	}
	system("pause");
	return 0;
}

在PAT中运行的效果与结果展示:
在这里插入图片描述
在这里插入图片描述

(2)思路分析

思路
由于行数是列数的一半(四舍五入),因此当列数col是奇数时,行数row就是col/2+1;当列数col是偶数时,行数row就是col/2。通过分析样例的输出可以发现,它由三部分组成,即第1行、第2~ row-1行以及第row行。显然,第1行与第row行都是输出n个a,使用一个for循环就能完成。对第2 ~ row-1行的每行来说,需要先输出一个a,然后输出col-2个空格,最后再输出一个a。
注意点:整数除以2进行四舍五入的操作可以通过判断它是否是奇数来解决,以避免浮点数的介入。

codeup 1928求日期差值

(1)运行代码与结果展示

codeup 1928日期差值题目描述
有两个日期,米两个日期之间的天数,如果两个日期是连续的,则规定它们之间的天数为两天。
输入格式
有多组数据,每组数据有两行,
输出格式
每组数据输出一行,即日期差值。
样例输入
20130101
20130105
样例输出
5
我在vs中编译的代码如下:

#include<cstdio>
#include<string.h>
using namespace std;
#include<windows.h>
int month[13][2] = {
	{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},
	{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}
};
bool isLeap(int year) {
	return(year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
}
int main() {
	int time1, y1, m1, d1;
	int time2, y2, m2, d2;
	while (scanf_s("%d%d", &time1, &time2) != EOF) {
		if (time1 > time2) {
			int temp;
			temp = time1;
			time1 = time2;
			time2 = temp;
		}
		y1 = time1 / 10000, m1 = time1 % 10000 / 100, d1 = time1 % 100;
		y2 = time2 / 10000, m2 = time2 % 10000 / 100, d2 = time2 % 100;
		int ans = 1;
		while (y1 < y2 || m1 < m2 || d1 < d2) {
			d1++;
			if (d1 == month[m1][isLeap(y1)] + 1) {
				m1++;
				d1 = 1;
			}
			if (m1 == 13) {
				y1++;
				m1 = 1;
			}
			ans++;
		}
		printf("%d\n", ans);
	}
	system("pause");
	return 0;
}

运行结果:
在这里插入图片描述

(2)思路分析

思路

不妨假设第一个日期早 于第二个日期(否则交换即可)。
这种求日期之间相差天数的题目有一个很直接的思路,即令日期不断加1天,直到第一个日期等于第一个日期为止,即可统计出答案。具体处理时,如果当加了天之后天效d等于当前月份m所拥有的天数加1,那么就令月份 m加1、同时置天数d为1号(即把日期变为下个月的1号);如果此时月份m变为了13,那么就令年份y加1、同时置月份m为1月(即把日期变为下一年的1月)。

为了方便直接取出每个月的天数,不妨给定一个二 维数组int month[13]2],用来存放每个月的天数,其中第二维为0时表示平年,为1时表示闰年。

注意:如果想要加快速度,只需要先把第一个日期的年份不断加1, 直到与第二个日期的年份相差1为止(想一想为什么不能直接加到等于第二个日期的年份时才停止? ), 期间根据平年或是闰年来累加365天或者366 天即可。之后再进行不断令天数加1的操作

PAT B1022D进制的A+B

(1)运行代码与结果展示

在学习解决这个题之前,我们先了解一下如何将一个P进制数x转变为一个十进制数y,代码如下:

#include<cstdio>
#include<string.h>
using namespace std;
#include<Windows.h>
int main() {
	int x, p ;
	int	y = 0, product = 1;
	scanf_s("%d%d", &x,&p);
	while (x != 0) {
		y = y + (x % 10) * product;
		x = x / 10;
		product = product * p;
	}
	printf("%d", y);
	system("pause");
	return 0;
}

结果展示:
在这里插入图片描述
接着我们再来学习如何将十进制数y转为Q进制数z
代码如下:

#include<cstdio>
#include<string.h>
using namespace std;
#include<Windows.h>
int main() {
	int y, Q ;
	int z[40], num = 0;
	scanf_s("%d%d", &y,&Q);
	do {
		z[num++] = y % Q;
		y=y/Q;
	} while (y != 0);
	for (int i = num - 1; i >= 0; i--) {
		printf("%d", z[i]);
	}
	system("pause");
	return 0;
}

结果展示:
在这里插入图片描述然后我们开始做题
[PAT B1022] D进制的A+B题目描述

输入两个非负十进制整数A和B以及D (进制数),输出A+B的D(1≤10) 进制数。
输入格式
在一行中依次给出三个整数A、 B和D (进制数)。输出格式

A+B的D进制数。输入样例123456 8
输出样例1103
vs中的代码如下;

#include<cstdio>
#include<string.h>
using namespace std;
#include<Windows.h>
int main() {
	int a, b, d;
	scanf_s("%d%d%d", &a, &b, &d);
	int sum = a + b;
	int ans[31], num = 0;
	do {
		ans[num++] = sum % d;
		sum = sum / d;
	} while (sum != 0);
	for (int i = num - 1; i >= 0; i--) {
		printf("%d", ans[i]);
	}
	system("pause");
	return 0;
}

在pat中的运行结果:
在这里插入图片描述

(2)思路分析

思路

先计算A+B (此时为十进制),然后把结果转换为D进制,而十进制转换为D进制的过程可以直接进行“除基取余法”。

codeup 5901回文串

(1)运行代码与结果展示

题目描述 codeup 5901回文串
比如“level"或者 ‘noon”就是回文串。输入格式

一行字符串,长度不超过255。输出格式

如果是“回文串”,输出“YES",否则输出“NO".
样例输入12321

样例输出YES
在vs中的代码如下:

#include<cstdio>
#include<cstring>
using namespace std;
#include<Windows.h>
const int maxn = 256;
bool True, False;
bool judge(char str[]) {
	int len = strlen(str);
	for (int i = 0; i < len / 2; i++) {
		if (str[i] != str[len - 1 - i]) {
			return False;
		}
	}
	return True;
}
int main() {
	char str[maxn];
	while (gets_s(str)) {
		bool flag = judge(str);
		if (flag==True){
			printf("YES\n");
		}
		else {
			printf("NO\n");
		}
	}
	system("pause");
	return 0;
}

结果展示:
在这里插入图片描述

(2)思路分析

思路

假设字符串str的下标从0开始,由于“回文串”是正读和反读都一样的字符串, 因此只需要遍历字符串的前一半(注意:不需要取到i== len/2),如果出现字符str[i]不等于其对称位置str[len- 1-i],就说明这个字符串不是“回文串”;如果前一半的所有字符str[i]都等于对应的对称位置str[len- 1-i],那么说明这个字符串是“回文串”。

PAT B1009说反话

(1)运行代码与结果展示

PAT B1009]说反话题目描述
给定一句英语, 要求编写程序,将句中所有单词按颠倒顺序输出。输入格式
测试输入包含一个测试用例,在一行内给 出总长度不超过80的字符串。字符串由若干峰词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用个空格分开,输入保证句子末尾没有多余的空格。输出格式

每个测试用例的输出占一行, 输出倒序后的句子。
样例输入
Hello World Here I Come
样例输出
Come I Here World Hello
在vs中的代码如下:

#include<cstdio>
#include<cstring>
using namespace std;
#include<iostream>
#include<Windows.h>
int main() {
	char str[90];
	gets(str);
	int len = strlen(str), r = 0, h = 0;
	char ans[90][90];
	for (int i = 0; i < len; i++) {
		if (str[i]!=' ') {
			ans[r][h++] = str[i];
		}
		else {
			ans[r][h] = '\0';
			r++;
			h = 0;
		}
	}
	for (int i = r; i >= 0; r--) {
		printf("%s", ans[i]);
		if (i > 0) printf(" ");
	}
	system("pause");
	return 0;
}

在pat中运行:
在这里插入图片描述
我们发现出错了,原因是是编译错误: error: ‘gets’ was not declared in this scope gets(s)。这个错误是比较意外的,毕竟在vs中是可以顺利编译的,最多是结果有错,而且gets(str)的操作在算法笔记是有详细说明可使用的,搜索后发现gets()方法确实已经不被PAT编译器支持,并且网上也有一些方法改进对一行字符串输入的读取。我这里采用的是cin.getline的操作。我们看看改后的运行结果。
在这里插入图片描述
满分!结果非常好。

(2)思路分析

思路
使用gets函数读入一整行,从左至右枚举每个字符, 以空格为分隔符对单词进行划分并按顺序存放到维字符数组中,最后按单词输入顺序的逆序来输出所有单词。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值