PTA团体程序设计天梯赛
正整数A+B
解题思路
- 有一个点是,对于第二个字符串我们需要用getline()来读入,是因为第二个字符串中间可能有空格。
- 对于字符判断是否合法,首先我们可以判断负数,对于负数就是第一个符号是否是’-’,之后就是是否有小数点,这个可以用
find()
函数来找。 - 之后判断是否含字母,如果不含,在看字符的数值是否越界了。
代码:
#include<iostream>
#include<string>
using namespace std;
int num1 , num2;
bool flag1 = true ,flag2 = true;
void solve(string a , bool & flag , int & num){
if(a[0] == '-' || a.find('.') != string::npos )cout<<'?' ,flag = false; //负数或者有小数点
else {
for(int i = 0 ; i < (int)a.size() ; ++i)if(a[i] >= 'a' && a[i] <= 'z') {
//有字母
flag = false;
break;
}
if(flag){
// 检测数值是否合法
for(int i = 0 ; i < (int)a.size() ; ++i)
{
num = num * 10 + a[i] - '0';
if(num > 1000){
break;
}
}
if(num == 0 || num > 1000)cout<<'?',flag = false;
if(flag)
cout<<num;
}else
cout<<'?' ;
}
}
int main(){
string a ,b;
cin>>a;
getchar();
getline(cin,b);
solve(a,flag1,num1);
cout<<" + ";
solve(b,flag2,num2);
cout<<" = ";
if(flag1 && flag2)cout<<(num1 + num2) <<endl;
else cout<<"?\n";
return 0;
}
出租
解题思路
这题是然我们将数字去重排序后,输出原数字在去重之后位置的下标。
对于去重我们可以用一个bool数组来记录,第一次出现的放入新的数组。之后按降序排序。之后对于每一个数字取找其对应的小标即可。
代码:
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 11;
int a[N] , b[N];
bool st[N];
char ch;
bool cmp(int a ,int b){
return a > b;
}
int main(){
int k = 0 ;
for(int i = 0 ; i < N ; ++i){
cin>>ch;
a[i] = ch-'0';
if(!st[a[i]]){
b[k++] = a[i];
st[a[i]] = 1;
}
}
sort(b , b+k,cmp);
cout<<"int[] arr = new int[]{";
int f = 0;
for(int i = 0 ; i < k; ++i)
{
if(f)cout<<',';
cout<<b[i] , f++;
}
cout<<"};\n";
cout<<"int[] index = new int[]{";
f = 0;
for(int i = 0 ; i < N ;