1.PAT(乙级)2020年秋季考试自测-60'
2.反思
第一题本质是大整数运算,这道题没有很快写出来的原因是1.没有记住整型的范围,快速识别大整型运算(整型,长整型十的十次方,long long20次方.2. 对字符串加法的代码不够熟练。
//字符串的加法
string addStrings(string num1, string num2) {
string str_return;
int carry=0,i=num1.size()-1,j=num2.size()-1;
while(carry!=0||i>=0||j>=0){
int temp=carry;
if(i>=0) temp+=num1[i--]-'0';
if(j>=0) temp+=num2[j--]-'0';
carry=temp/10;
str_return=to_string(temp%10)+str_return;
}return str_return;
}
//字符串的减法,去零加负相减,代码易错点忘记写【i--,j--】,x.substr(i,len-i)就可以了
string addStrings(string num1, string num2) {
int negative=0;
if(num1.size()<num2.size()||(num1.size()==num2.size()&&num2>num1)){
swap(num1,num2); negative=1;
}
string str_return;
int _carry=0,i=num1.size()-1,j=num2.size()-1;
while(_carry!=0||i>=0||j>=0){
int temp=_carry;
if(i>=0&&j>=0){
temp+=num1[i--]-num2[j--];
}else if(i>=0) temp+=num1[i--]-'0';
else if(j>=0) temp+=num2[j--]-'0';
if(temp<0) {_carry=-1; temp+=10;}
else _carry=0;
str_return=to_string(temp%10)+str_return;
}
int index=0;
while(index<str_return.size()-1&&str_return[index]=='0'){index++;}
str_return=str_return.substr(index,str_return.size()-index);
if(negative==1) str_return='-'+str_return;
return str_return;
}
字符串的乘法
//版本一,优化vector版.
string multiply(string num1, string num2) {
int m=num1.size()-1,n=num2.size()-1;
vector<int>v(m+n+2,0);
for(int i=m;i>-1;i--){
for(int j=n;j>-1;j--){
int temp=v[i+j+1]+(num1[i]-'0')*(num2[j]-'0');
v[i+j]+=temp/10;
v[i+j+1]=temp%10;
for(int p:v) {cout<<p;}
cout<<endl;
}
}
int index=0;
while(v[index]==0) {index++;}
v.assign(v.begin()+index,v.end());
string str_return;
for(char p:v){
str_return+=p+'0';
}
return str_return;
}
//版本二,相乘相加模拟版。
class Solution {
public:
string addStrings(string num1, string num2) {
string str_return;
int carry=0,i=num1.size()-1,j=num2.size()-1;
while(carry!=0||i>=0||j>=0){
int temp=carry;
if(i>=0) temp+=num1[i--]-'0';
if(j>=0) temp+=num2[j--]-'0';
carry=temp/10;
str_return=to_string(temp%10)+str_return;
}return str_return;
}
string multiStrings(string num1, char num2) {
string str_return="";
int carry=0,i=num1.size()-1;
while(carry!=0||i>=0){
int temp=carry;
if(i>=0) temp+=(num1[i--]-'0')*(num2-'0');
carry=temp/10;
str_return=to_string(temp%10)+str_return;
}return str_return;
}
string multiply(string num1, string num2) {
string str_plus="0",str_return="0";
for(int i=num2.size()-1;i>-1;i--){
string str_temp=multiStrings(num1,num2[i]);
int index=i;
while(num2.size()-index!=1) {str_temp+='0'; index++;}
str_return=addStrings(str_return,str_temp);
}
int index=0;
while(index<str_return.size()-1&&str_return[index]=='0'){index++;}
str_return=str_return.substr(index,str_return.size()-index);
return str_return;
}
};
第三题:1.substr运用2.stringstream3.s.find!=-1;
其他二四五没有什么好说的