[伯俊/c++]1978号小数点を探す


1978題リンク
質問する
プログラムを書き出して、与えられたN個の数の中で何個が小数であるかを見つけます.
入力
1行目の数字はNです.Nは100以下である.次はN個、数は1000以下の自然数です.
しゅつりょく
与えられた数のうちの少数の数を出力します.

に答える
小数が1より大きい自然数の1と自分の小数だけを取る方法はいろいろありますが、今回は1
1ππππυυυ▼▼▼▼▼▼▼▼▼▼▼▼▼▼\96
2平方根に分ける方法は反復文を2平方根に分けることであり,できれば少数ではないと考える.
詳細については、関連するヒントを参照してください.👉 [アルゴリズム]小数(Prime Number)
ソースコード
1.エラトスのふるいを使う
#include <stdio.h>
#include <iostream>

using namespace std;

int main() {
    
    int n; 		// 숫자의 개수 
    cin >> n;
    
    int num_arr[n];		// 입력 받은 숫자를 저장하는 배열 
    int max_num = 0;	// 입력 받은 수 중 가장 큰 수 
    
    for(int i=0; i<n; i++) {
        cin >> num_arr[i];
        if (max_num < num_arr[i]) max_num = num_arr[i];
    }
    
    // max_num 까지 소수의 여부를 구하기 떄문에 
    //소수 여부를 저장하는 배열 크기를 max_num + 1 로 잡아준다
    bool is_prime_num[max_num+1]; 
    for(int i=0; i<max_num+1; i++) is_prime_num[i] = true; // 배열 true 로 초기화 
    
    is_prime_num[1] = false; // 1은 소수가 아니기 때문에 false
        
    // 에라토스테네스의 체 방식으로 가장 큰 값의 제곱근까지 반복문을 돌리고
    for (int i=2; i*i<=max_num; i++) {
    	// 해당 값의 배수인 값은 배열에 소수로 저장해준다.
        for(int j = i+i; j<=max_num; j+=i) {
            is_prime_num[j] = false;
        }
    }
    
    int prime_count = 0;
    // 숫자의 개수까지 반복문을 돌면서 
    // 소수인지 아닌지 여부를 판단하고 소수 인경우 prime_count 에 ++
    for(int i=0;i<n;i++) {
        if (is_prime_num[num_arr[i]]){
            prime_count++;
        }
    }
    
    cout << prime_count;
    
    return 0;
}
2.平方根の使用
#include <stdio.h>
#include <iostream>

using namespace std;

int main() {
    
    // N = 숫자의 개수 
    // num = 입력받은 숫자 
    // is_not_prime_num_cnt = 소수가 아닌 합성수의 개수
    int N, num, is_not_prime_num_cnt = 0;
    cin >> N;
    
    for(int i=0;i<N;i++) {
        cin >> num;
        
        if (num == 1) {
        	// 1 은 소수가 아니기 때문에 ++
            is_not_prime_num_cnt++;
        } else {
        	// 입력 받은 값의 제곱근까지 돌면서 
            // 소수인지 아닌지를 판단 
            for(int i=2; i*i <= num; i++) {
                if (num % i == 0) {
                    is_not_prime_num_cnt ++;
                    break;
                }
            }
        }
    }
    
    cout << (N-is_not_prime_num_cnt);
    return 0;
}
最初は、複数の値が入力されていたのでテストステロンのふるいで簡単に解けると思ったので、テストステロンのふるいを先に使いましたが、配列をより効果的に使いたいので、思ったよりコードが長く、繰り返し文も多くなりました.🥲
メモリが同じ場合、コード長が短く、可読性の良い2"平方根を使用するのがより良い方法かもしれません.
正解