PAT (Basic Level) Practice (中文)1021-1025

1021 个位数统计 (15分)

给定一个 k 位整数 N=d​(k−1​​)10^(​k−1)​​+⋯+d​​​10^​1​​+d​0​​ (0≤d​i​​≤9, i=0,⋯,k−1, d​(k−1)​​>0),请编写程序统计每种不同的个位数字出现的次数。例如:给定 N=100311,则有 2 个 0,3 个 1,和 1 个 3。

输入格式:

每个输入包含 1 个测试用例,即一个不超过 1000 位的正整数 N。

输出格式:

对 N 中每一种不同的个位数字,以 D:M 的格式在一行中输出该位数字 D 及其在 N 中出现的次数 M。要求按 D 的升序输出。

输入样例:

100311

输出样例:

0:2
1:3
3:1

 

AC代码 

#include 
#include 
using namespace std;

int main()
{
	string str;
	int nums[10]={0};
	cin>>str;
	for(auto ch : str)
	{
		nums[ch-'0']++;
	}
	
	for(int i=0;i<10;i++)
	{
		if(nums[i] != 0) {
			cout<


 

1022 D进制的A+B (20分)

输入两个非负 10 进制整数 A 和 B (≤2​^30​​−1),输出 A+B 的 D (1

输入格式:

输入在一行中依次给出 3 个整数 A、B 和 D。

输出格式:

输出 A+B 的 D 进制数。

输入样例:

123 456 8

输出样例:

1103

 

AC代码

#include 
using namespace std;

int main()
{
	int A, B, C, D, i=0, nums[31]; //2*2^30-2 转化为 二进制 最多有31位数 
	cin>>A>>B>>D;
	C = A + B;
	do{
		nums[i++] = C % D;
		C = C / D;
	}while(C);
	
	for(int j=i-1; j>=0; j--)
		cout<

1023 组个最小数 (20分)

给定数字 0-9 各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意 0 不能做首位)。例如:给定两个 0,两个 1,三个 5,一个 8,我们得到的最小的数就是 10015558。

现给定数字,请编写程序输出能够组成的最小的数。

输入格式:

输入在一行中给出 10 个非负整数,顺序表示我们拥有数字 0、数字 1、……数字 9 的个数。整数间用一个空格分隔。10 个数字的总个数不超过 50,且至少拥有 1 个非 0 的数字。

输出格式:

在一行中输出能够组成的最小的数。

输入样例:

2 2 0 0 0 3 0 0 1 0

输出样例:

10015558


AC代码 

#include 
using namespace std;

int main()
{
	int nums[10]={0}, i=0, first=1;
	while(cin>>nums[i++]) ;
	
	for(i=0;i<10;i++)
	{
		if(nums[i]!=0 && i!=0) {
			for(int j=0;j


 


 

1024 科学计数法 (20分)

科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][1-9].[0-9]+E[+-][0-9]+,即数字的整数部分只有 1 位,小数部分至少有 1 位,该数字及其指数部分的正负号即使对正数也必定明确给出。

现以科学计数法的格式给出实数 A,请编写程序按普通数字表示法输出 A,并保证所有有效位都被保留。

输入格式:

每个输入包含 1 个测试用例,即一个以科学计数法表示的实数 A。该数字的存储长度不超过 9999 字节,且其指数的绝对值不超过 9999。

输出格式:

对每个测试用例,在一行中按普通数字表示法输出 A,并保证所有有效位都被保留,包括末尾的 0。

输入样例 1:

+1.23400E-03

输出样例 1:

0.00123400

输入样例 2:

-1.2E+10

输出样例 2:

-12000000000


AC代码 

#include 
#include 
#include 
#include 
using namespace std;

int main()
{
	/*str存储输入的字符串,nums存储'E'前面的字符串,index存储指数部分*/ 
	string str, nums, index;
	
	/*flag用来判断正负号*/ 
	/*flag1如果为0 表示正在遍历'E'的前半部分,为1则表示正在遍历'E'的后半部分*/ 
	/*flag2用来表示指数部分的正负*/ 
	int flag, flag1 = 0, first=1, flag2, cnt; 
	getline(cin, str);
	for(int i=0;i= 0) {
		cnt = atoi(index.c_str());
		int len = nums.size();
		for(int i=0;i<=cnt;i++)
		{
			if(len >= i+1)
			cout<

 


1025 反转链表 (25分)

给定一个常数 K 以及一个单链表 L,请编写程序将 L 中每 K 个结点反转。例如:给定 L 为 1→2→3→4→5→6,K 为 3,则输出应该为 3→2→1→6→5→4;如果 K 为 4,则输出应该为 4→3→2→1→5→6,即最后不到 K 个元素不反转。

输入格式:

每个输入包含 1 个测试用例。每个测试用例第 1 行给出第 1 个结点的地址、结点总个数正整数 N (≤10​5​​)、以及正整数 K (≤N),即要求反转的子链结点的个数。结点的地址是 5 位非负整数,NULL 地址用 −1 表示。

接下来有 N 行,每行格式为:

Address Data Next

其中 Address 是结点地址,Data 是该结点保存的整数数据,Next 是下一结点的地址。

输出格式:

对每个测试用例,顺序输出反转后的链表,其上每个结点占一行,格式与输入相同。

输入样例:

00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218

输出样例:

00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1

 

利用数组的下标来表示节点地址来解决此题会很方便,最后一个测试点应该是:比如输入了N个结点的数据,但不是N个结点都可以串起来的,比如有两个结点的next可能是-1(此题表示NULL地址),一个结点的next是可以接上前面的,一个结点则是接不上去的。



AC代码

#include 
#include 
#include 
using namespace std;

/*关键在于val、next数组的下标表示的是节点的地址*/
/*解题时可以不用改变next[address]的值,也就是可以不用改变地址为address的节点的next的指向*/
/*list数组的元素的值为节点的地址,那么就可以用list数组来辅助"翻转"后的输出了*/ 

int main()
{
	int val[100001], next[100001], list[100001];
	int head, N, K, temp, cnt = 0;
	cin>>head>>N>>K;
	for(int i=0; i < N; i++)
	{
		cin >> temp;
		cin >> val[temp];
		cin >> next[temp];
	}
//	for(int i=0; i < N; i++)
//	{
//		list[i] = head;
//		head = next[head];
//	}

	do{
		list[cnt++] = head;
		head = next[head];
	}while(head != -1);
		
	
	for(int i=0; i <= cnt - K; i += K)
	{
		reverse(list+i, list+i+K);
	}
	
	for(int i=0; i < cnt; i++)
	{
		if(i == cnt-1) {
			//cout<

 

你可能感兴趣的:(#,PAT)