愿你坚持不懈,努力进步,进阶成自己理想的人

—— 2017.09, 写给3年后的自己

PAT:字符串处理

复数的实部和虚部

通常用一个形如”a+bi”的字符串来表示一个复数,a为复数的实部,b为复数的虚部。现在需要对输入的字符串进行分离,自动识别该复数的实部和虚部,并独立输出。

例如,对于输入的复数字符串“3-4.05i”,输出
complex 3-4.05i
the real part is 3
and the imaginary part is -4.05

注意:
1、 用于表示复数的字符串符合数学上的书写习惯。
2、 每组测试数据仅包括一个用于表示复数的字符串。
3、 输入保证合法。

输入示例:
-4.567+3.987i

输出示例:
complex -4.567+3.987i
the real part is -4.567 
and the imaginary part is 3.987

#include <iostream>
#include <cstring>
using namespace std;
bool isPuredImage(string exp) {
    if(exp.find("i")==exp.npos) return false;
    for(int i=1; i<exp.find("i"); i++) {
        if(exp[i]=='+'||exp[i]=='-') return false;
    }
    return true;
}
int main() {
    string exp;
    while (cin>>exp) {
        double real, image;
        if(exp == "i") {
            real = 0;
            image = 1;
        } else if(exp == "-i") {
            real = 0;
            image = -1;
        } else if(exp.find("i")!=exp.npos) {
            if(isPuredImage(exp)) {
                real = 0;
                sscanf(exp.c_str(), "%lfi", &image);
            } else {
                char temp[20];
                sscanf(exp.c_str(), "%lf%s", &real, temp);
                if(temp[1]=='i') image = temp[0]=='+' ? 1 : -1;
                else {
                    temp[strlen(temp)-1] = 0;
                    image = atof(temp);
                }
            }
        } else {
            real = atof(exp.c_str());
            image = 0;
        }
        
        cout << "complex " << exp << endl;
        cout << "the real part is " << real << endl;
        cout << "and the imaginary part is " << image << endl;
    }
    return 0;
}