PAT(Basic Level) Practice (中文)试题源码及心得(1004~1006)

1004#成绩排名#

这道题还是比较简单的,因为只需要得出成绩最高的和最低的,所以成绩排序用的是冒泡排序,排序中记住最大的和最小的序号,一会输出时会用到。在存入中,我是练习一个个字符存入的,这是比较麻烦的。

总结(对于我这种菜鸟需要注意的是):

(1)存10个数据到数组中,数组的初始化得是【11】;
(2)要充分考虑存入数组的个数,因为百位可能没有;
(3)判断字符是否是空格时,不能用‘\0’,用getchar!=32;
(4)有个测试点的数据是100组;

代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
	char name[101][11] = { 0 };
	char id[101][11] = { 0 };
	char record[101][4] = { 0 };
	int grad[101] = { 0 };
	int  a,i ,j ,temp=0,max=0 ,min=0;
	
	//存储
	//int a= getchar() - 48;
	scanf("%d", &a);
	getchar();
	
	for (i = 0; i < a; i++) 
	{
		for (j = 0; (name[i][j] = getchar()) != 32; j++) {}
		for (j = 0; (id[i][j] = getchar()) != 32; j++) {}
		for (j = 0; (record[i][j] = getchar()) != '\n'; j++) {}
		grad[i] = record[i][0] - 48;
		for (j = 1; (record[i][j]) != '\n'; j++)
		{
			grad[i] = grad[i] * 10 + (record[i][j] - 48);

		}
	}

	//比较
	temp = grad[0];
	for (j = 1; j < a; j++)
	{
		if (grad[j] > temp) 
		{
			temp = grad[j];
			max = j;
		}
	}
	temp = grad[0];
	for (j = 1; j < a; j++)
	{
		if (grad[j] < temp)
		{
			temp = grad[j];
			min = j;  
		}
	}
	
	//输出max
	for (j = 0; name[max][j] != 32; j++)
	{
		printf("%c", name[max][j]);
	}
	putchar(32);
	for (j = 0; id[max][j] != 32; j++)
	{
		printf("%c", id[max][j]);
	}
	putchar(10);


	//输出min
	for (j = 0; name[min][j] != 32; j++)
	{
		printf("%c", name[min][j]);
	}
	putchar(32);
	for (j = 0; id[min][j] != 32; j++)
	{
		printf("%c", id[min][j]);
	}
	putchar(10);
	system("pause");
	return 0;
	
}

1005 #继续(3n+1)猜想#

这道题还是比较复杂的,总体通过率比较低。居然花了一天的时间,主要是调试错误。定义几个全局变量数组,其中shu[][]是经过callatz运算过后数组存储成的二维数组,su[]是输入的数字组成的数组,s[]是最终结果组成的数组,bi[]是经过比较后数经过排序的数组。

首先读取输入的下面数字的总数,一个一个先存入su[]数组,然后把经过callatz函数运算后的数字对应存入shu[][]二维数组。bijiao函数就是判断su[]中的数是否在shu[][]中。如果在,则采用循环溢出方法跳出循环(l = a; r = 999;);如果判断到底都不在,则存入s[]中。最后对s[]中的数进行排序。

菜鸟总结:

(1)在include下定义全局变量
(2)数存入数组时,是整个数存入数组,不是一位数存进去的
(3)!!!三重循环跳出二重循环,把里面的语句设成溢出,可以加上判断条件r!=999
(4)flag记得还原成0
(5)冒泡排序要把最初的temp赋值成1(也就是排序后改成的那个数字)

代码如下:

#include<stdio.h>
#include <string.h>
#include <stdlib.h>
int shu[100][200] = {0};//运算过后组成的二维数组
int su[100] = { 0 };//输入的数 组成的数组
int s[100] = { 0 };//最终结果组成的数组
int bi[100] = { 0 };//比较后的数组
int i ,a , m = 0,h =0,x=0;
void callatz(int b)
{
	if (b == 1)
	{	
		
	}
	else if (b % 2 == 0) {
		b = b / 2;
		shu[i][m]= b; m++;  
		callatz(b);
	}
	else {
		b = (3 * b + 1) / 2;
		shu[i][m] = b; m++;  
		callatz(b);
	}
}
void bijiao()
{
	int l,r;
	for (int k = 0; su[k] != '\0'; k++)
	{
		for ( l = 0; l < a; l++)
		{
			for ( r = 0; (r!=1000)&&(shu[l][r] != '\0'); r++) 
			{
				if (su[k] == shu[l][r]) 
				{
						l = a; r = 999;
				}
			}				
		}
		if (l == a) {
			s[h] = su[k]; h++;
		}
	}
}
void paixu()
{
	int temp2; x = 0;
	for (a = 0; s[a] != '\0'; a++)
	{
		temp2 = 1;
		for (i = 0; s[i] != '\0'; i++)
		{
			if (s[i] > temp2)
			{
				temp2 = s[i];
				x = i;
			}
		}
		bi[a] = temp2;
		s[x] = 1;
	}
}
int main(int argc,char *argv[])
{
	int b,j;
	scanf("%d", &a);
	for (i = 0; i < a; i++) 
	{
		scanf("%d", &b);
		m = 0;
		su[i]= b;
		callatz(b);
	}
	bijiao();
	paixu();
	for (j = 0; bi[j+1] != '\0'; j++)
	{
		printf("%d", bi[j]);
		putchar(32);
	}
	printf("%d", bi[j]);
	return 0;
}

1006#换个格式输出整数#

这道题还是挺简单的,对输入的数字分离出百位十位个位,然后按照相应的要求输出,代码如下:

#include<iostream>
using namespace std;
int main()
{
	int x,bai,shi,ge,i;
	cin >> x;
	bai = (x - (x % 100)) / 100;
	x = x - bai * 100;
	shi = (x - (x % 10)) / 10;
	x = x - shi * 10;
	ge = x;
	for (i = 0; i < bai;i++)
	{
		cout << "B";
	}
	for (i = 0; i < shi; i++)
	{
		cout << "S";
	}
	for (i = 1; i <= ge; i++)
	{
		cout << i;
	}
	return 0;
}

你可能感兴趣的:(PAT(Basic Level) Practice (中文)试题源码及心得(1004~1006))