从零单排PAT1023,1024

来源:互联网 发布:卷积神经网络算法源码 编辑:程序博客网 时间:2024/04/29 19:06

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;}elseb.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; //不需要直接输出的负号elsecout << fuhao1 << B << endl;//负数,需要输出负号system("pause"); return 0;}


0 0
原创粉丝点击