#P1797. 第2题-小美算复数
          
                        
                                    
                      
        
              - 
          
          
                      1000ms
            
          
                      Tried: 104
            Accepted: 35
            Difficulty: 4
            
          
          
          
                       所属公司 : 
                              美团
                                
            
                        
              时间 :2024年4月6日
                              
                      
          
 
- 
                        算法标签>字符串          
 
第2题-小美算复数
题解
观察可以发现,如果是实数,那么 i 前面的系数一定是 0,或者不存在 i
因此我们,将所有的 +0i 和 -0i  替换成 "",然后判断每个子串是否包含 i 即可。
AC代码
python
n = int(input())
nums = input().split()
res = 0
for num in nums:
    num = num.replace("+0i", "").replace("-0i", "")
    if 'i' not in num:
        res += 1
print(res)
java
import java.util.*;
// 注意类名必须为Main
class Main {
    static int n;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        // int b = sc.nextInt();
        int res = 0;
        for(int i=0;i<n;i++){
            String s = sc.next();
            int len = s.length();
            if(s.charAt(len-1) != 'i'){
                res++;
                continue;
            }
            if(s.charAt(len-2) == '0' && (s.charAt(len-3) == '+' || s.charAt(len-3) == '-')){
                res++;
            }
        }
        System.out.println(res);
    }
}
c++
#include "iostream"
#include <string>
#include <regex>
#include <complex>
#include <vector>
using namespace std;
complex<double> pareComplex(const string &str) {
    double real = 0, imag = 0;
    int plus_pos = str.find('+', 1);
    int minus_pos = str.find('-', 1);
    int i_post = str.find('i');
    if (plus_pos == -1 && minus_pos == -1) {
        // -7 或者是 7i 这种类型
        if (i_post != -1) {
            // 表示存在
            // 去掉 i
            imag = stod(str.substr(0, i_post));
        } else {
            // 只有实部
            real = stod(str);
        }
    } else {
        // 表示既有实部又有虚部
        if (plus_pos == -1 && minus_pos != -1) {
            real = stod(str.substr(0, minus_pos));
            string temp = str.substr(minus_pos, i_post - 1);
            if (temp == "-") {
                imag = -1;
            } else if (temp == "+") {
                imag = 1;
            } else {
                imag = stod(temp);
            }
        } else if (plus_pos != -1 && minus_pos == -1) {
            real = stod(str.substr(0, plus_pos));
            imag = stod(str.substr(plus_pos + 1));
        }
    }
    // cout <<  real << "   " <<  imag<< endl;
    return complex<double>(real, imag);
}
int main() {
    int n;
    string temp;
    cin >> n;
    vector<complex<double>> vectorMy(n);
    for (int i = 0; i < n; i++) {
        cin >> temp;
        // 分割
        vectorMy[i] = pareComplex(temp);
    }
   
    int count = 0;
    for(int i =0; i < n; i++){
        complex<double> item = vectorMy[i];
        if(item.imag() == 0){
            count++;
        }
    }
    cout << count << endl;
    return 0;
}
        题目描述
小美拿到了一个由复数组成的数组,她想知道其中有多少个实数?
实数:有理数和无理数的总称。其中无理数是无限不循环小数,有理数包括整数和分数。
输入描述
第一行输入一个正整数,代表数组的大小。
第二行输入n个复数,代表小美拿到的数组。
1≤n≤105
后台数据保证复数为a或者a+bi的形式,其中a和b为绝对值不超过109的整数。
输出描述
一个整数,代表实数的数量。
样例
输入
4
-5 5-i 6+3i -4+0i
输出
2