前几天看了一下C++的运算符重载
部分,当然还包括后面的友元
,感觉就这样干看着不实际写一下没什么印象,说干就干,立马拿前几天AC的一道HOJ水题练手。
在实际写的过程中,感觉到C++引入string
字符串类型变量真是比C的char*
方便了好多,虽然内在的也是指针实现,但是在写代码的过程中,特别是引用某个字符串的时候,使用变量名明显比使用指针简单,而且更不容易出错。
上代码:
//HOJ 1474
//使用运算符重载和友元实现以前的函数的功能
#include <iostream>
#include <string>
using namespace std;
//声明存储斐波那契数的类
class Str{
public:
string data;
//重载的两个后面需要用到的操作符
Str operator+(Str s);
bool operator>(string str);
//声明友元,因为后面有string > Str的操作
friend bool operator>(string str, Str s);
};
//重载+运算符,参数为一个Str类型的对象
Str Str::operator+(Str s){
int len1 = data.length(), len2 = s.data.length(), plus = 0, tmp;
Str result;
result.data = "";
if(len1 > len2){
for(int i = 0; i < len1 - len2; i++)
s.data = "0" + s.data;
}else if(len2 > len1){
for(int i = 0; i < len2 - len1; i++)
data = "0" + data;
len1 = len2;
}
for(int i = len1 - 1; i >= 0; i--){
tmp = plus ? (int)data[i] + (int)s.data[i] - (int)'0' * 2 + 1 : (int)data[i] + (int)s.data[i] - (int)'0' * 2;
if(tmp > 9){
result.data = (char)(tmp - 10 + '0') + result.data;
plus = 1;
}else{
result.data = (char)(tmp + '0') + result.data;
plus = 0;
}
}
if(plus)
result.data = "1" + result.data;
return result;
}
//重载>运算符,参数为一个Str类型的对象
bool Str::operator>(string str){
if(data.length() > str.length()){
return true;
}else if(data.length() < str.length()){
return false;
}else{
for(int i = 0; i < data.length(); i++){
if(data[i] > str[i])
return true;
else if(str[i] > data[i])
return false;
}
}
return true;
}
//友元,注意因为友元不是成员函数,所有用不到作用域操作符::
bool operator>(string str, Str s){
if(str.length() > s.data.length()){
return true;
}else if(str.length() < s.data.length()){
return false;
}else{
for(int i = 0; i < str.length(); i++){
if(str[i] > s.data[i])
return true;
else if(s.data[i] > str[i])
return false;
}
}
return true;
}
int main(){
string a, b;
Str nums[500];
nums[0].data = "1";
nums[1].data = "2";
for(int i = 2; i < 500; i++)
nums[i] = nums[i - 1] + nums[i - 2]; //这里使用的重载的+操作符
while(cin >> a >> b && !(a == "0" && b == "0")){
int count = 0;
for(int i = 0; i < 500; i++){
if(nums[i] > a){ //这里使用的是重载的>操作符
if(b > nums[i]) //这里使用的是友元
count++;
else
break;
}
}
cout << count << endl;
}
}