首页 > 代码库 > 从零单排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; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。