首页 > 代码库 > 从零单排PAT1023,1024

从零单排PAT1023,1024

1023.组个最小数  题目要求:

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

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

输入格式:

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

输出格式:

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

输入样例:
2 2 0 0 0 3 0 0 1 0
输出样例:
10015558
解题思路:这道题目只需要直接将数据存储下来,然后从小到大进行排序,然后进行判断,是否第一个为0,如果为0则与第二小的数进行交换
源代码如下:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
void swap(char *a,char *b)
{
	char temp = *a;
	*a = *b;
	*b = temp;
}
int main()
{
	vector<int> a;
	for(int i=0;i<10;i++)
	{
		int temp;
		cin >> temp;
		a.push_back(temp);
	}
	string b;
	for(int i=0;i<10;i++)
	{
		char temp = i + '0';
		b = b.append(a[i],temp);
	}
	//cout << a.size();
	if(b[0] == '0')  //第一个为0时,直接寻找,用最近的一个数与之交换
	{
		int i = 0;
		while(b[i] == '0')
		{
			i++;
		}
		swap(b[0],b[i]);
	}
	cout << b << endl;
	system("pause");
	return 0;
}


1024.科学计算法  题目要求:

科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][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
解题思路:这道题目看似比较复杂,需要用到正则表达式的。但实际上只是一个简单的解析表达式过程,可以将表达式分成4个部分,第一部分数字正负,第二部分实际数据,第三部分表示是乘以10还是除以10,最后是0的位数。所以分成四部分来解,最后拼凑就是两种情况,一种是小数点往后移动(第三部分为正),另一种是小数点往前移动(第三部分为负),接着需要判断在前面添0还是在后面添0:一共有N位有效位数,10的位数为M,若第三部分为正,取正常的是否添0取决于M-N;若为负,直接在前面添0。最后再进行小数点的添加。
源代码如下:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
	string A;
	cin >> A;
	char fuhao1 = A[0];//记录第一个符号
	string B = "";
	vector<char> b; //用于存储实际有效的位数
	char temp = 0;
	int flag = 0;
	int lenth = A.size();
	for(int i=1;i<lenth;i++)
	{
		if(A[i] != '.')
		{
			if(A[i+1] == 'E')
			{
				flag = i+2;
				b.push_back(A[i]);
				break;
			}
			else
				b.push_back(A[i]);
		}
	}
	char fuhao2 = A[flag]; //记录第二个符号
	int weishu = 0;
	for(int i=flag+1;i<lenth;i++)
	{
		weishu = weishu*10 + (A[i]-'0');
	}
	/*****************完成解析**************/
	int temp1 = weishu - b.size() + 1;
	if(fuhao2 == '+') //为正的情况下
	{
		if(temp1 >= 0)//不需要添加小数点
		{
			for(int i=0;i<b.size();i++)
			{
				B.append(1,b[i]);//原来参数写错了
			}
			B.append(temp1,'0');
		}
		else 
		{
			for(int i=0;i<b.size();i++)
			{
				B.append(1,b[i]);
				if(i == weishu)
					B.append(1,'.');
			}
		}
	}
	else //位数为负的情况下
	{
		if(weishu > 0)
		{
			B.append(1,'0');
			B.append(1,'.');
			B.append(weishu - 1,'0');		
			for(int i=0;i<b.size();i++)
			{
				B.append(1,b[i]);//原来参数写错了
			}
		}
		else  //为0时候,直接输出
		{
			B.append(1,b[0]);
			B.append(1,'.');
			for(int i=1;i<b.size();i++)
			{
				B.append(1,b[i]);//原来参数写错了
			}
		}
	}
	if(fuhao1 == '+')
		cout << B << endl; //不需要直接输出的负号
	else
		cout << fuhao1 << B << endl;//负数,需要输出负号
	system("pause");
 	return 0;
}