PAT甲级 A1060(我太菜了)
题目详情
(这垃圾题目,题目详情不想贴了 PAT官网甲级A1060就好)
解题思路
我这道题的思路就是菜中之菜。我考虑输入式子有无小数点,有小数点时判断小数点的位置是第一位还是在后面,再判断当前的数字是否满足给定位数,不满足就补0.完成上述操作后我发现了我的算法存在的我一些问题
问题1:非小数点钱的数字多余0 需要再输入的时候进行去除
问题2:临界情况的输入0等情况需要分开考虑
问题3:需要区分0和0.0等一系列数字
把代码改的乱七八糟 终于考虑完了所有情况 AC了
#include<iostream>
#include<string>
#include<vector>
#include<cmath>
#include<memory.h>
#include<string>
#include<algorithm>
#include<iomanip>
#include<map>
#include<stack>
#include<queue>;
using namespace std;
int N;
vector<char> calans;
int calcu(string a, int pos) {
if (pos == -1) {
calans.push_back('0');
calans.push_back('.');
if (a.length() < N) {
for (int i = 0; i < a.length(); i++) {
calans.push_back(a[i]);
}
for (int i = 0; i < N - a.length(); i++) {
calans.push_back('0');
}
}
else {
for (int i = 0; i < N; i++) {
calans.push_back(a[i]);
}
}
return (a.length());
}
else if(pos==1){
calans.push_back('0');
calans.push_back('.');
if (a[0] == '0') {
int beginpos = 0;
for (int i = 2; i < a.length(); i++) {
if (a[i] != '0') {
beginpos=i;
break;
}
}
int leftsize = a.length() - beginpos;
if (leftsize < N) {
for (int i = beginpos; i < a.length(); i++) {
calans.push_back(a[i]);
}
for (int i = 0; i < N - leftsize; i++) {
calans.push_back('0');
}
}
else {
for (int i = beginpos; i < beginpos + N; i++) {
calans.push_back(a[i]);
}
}
return (beginpos - 2)*-1;
}
else {
if (a.length()-1 < N) {
for (int i = 0; i < a.length(); i++) {
if(a[i]!='.')
calans.push_back(a[i]);
}
for (int i = 0; i < N - a.length()+1; i++) {
calans.push_back('0');
}
}
else {
int nos = 0; int pps = 0;
while (true) {
if (a[pps] == '.') {
pps++;
continue;
}
calans.push_back(a[pps]);
pps++;
nos++;
if (nos == N) {
break;
}
}
}
return 1;
}
}
else {
calans.push_back('0');
calans.push_back('.');
if (a.length() - 1 < N) {
for (int i = 0; i < a.length(); i++) {
if (a[i] != '.')
calans.push_back(a[i]);
}
for (int i = 0; i < N - a.length() + 1; i++) {
calans.push_back('0');
}
}
else {
int nos = 0; int pps = 0;
while (true) {
if (a[pps] == '.') {
pps++;
continue;
}
calans.push_back(a[pps]);
pps++;
nos++;
if (nos == N) {
break;
}
}
}
return pos;
}
}
int main(){
cin >> N;
string a; string b;
cin >> a >> b;
int nozeroa; int nozerob;
for (int i = 0; i < a.size(); i++) {//去除小数点以及数字前的前导0
if (a[i] == '0') {
if (i == a.size() - 1) {
break;
}
if (a[i + 1] == '.') {
break;
}
a.erase(a.begin() + i); i = -1;
}
else {
break;
}
}
for (int i = 0; i < b.size(); i++) {
if (b[i] == '0') {
if (i == b.size() - 1) {
break;
}
if (b[i + 1] == '.') {
break;
}
b.erase(b.begin() + i); i = -1;
}
else {
break;
}
}
int judgeb = 0;
for (int i = 0; i < b.length(); i++) {//去除形如0.000的形式
if (b[i] != '0' && b[i] != '.') {
judgeb = 1;
break;
}
}
if (judgeb == 0) {
b = "0";
}
int judgea = 0;
for (int i = 0; i < a.length(); i++) {
if (a[i] != '0' && a[i] != '.') {
judgea = 1;
break;
}
}
if (judgea == 0) {
a = "0";
}
int pointa = -1; int pointb = -1;
for (int i = 0; i < a.length(); i++) {
if (a[i] == '.') {
pointa = i;
break;
}
}
for (int i = 0; i < b.length(); i++) {
if (b[i] == '.') {
pointb = i;
break;
}
}
int indexa= calcu(a, pointa);
vector<char> alist;
for (int i = 0; i < calans.size(); i++) {
alist.push_back(calans[i]);
}
calans.clear();
int indexb = calcu(b, pointb);
if (a == "0") {
indexa = 0;
}
if (b == "0") {
indexb = 0;
}
if (alist == calans&&indexa==indexb ) {
cout << "YES" << " ";
for (int i = 0; i < alist.size(); i++) {
cout << alist[i];
}
cout << "*10^" << indexa <<'\n';
}
else {
cout << "NO" << " ";
for (int i = 0; i < alist.size(); i++) {
cout << alist[i];
}
cout << "*10^" << indexa << " ";
for (int i = 0; i < calans.size(); i++) {
cout << calans[i];
}
cout << "*10^" << indexb << '\n';
}
}