列表

详情


OR127. 无倍数数

描述

小M得到了n个互不相同的正整数ai,在这n个数中,某个数称为无倍数数当且仅当其他的数都不是它的倍数。请你帮小M找出这n个数中所有的无倍数数,并以升序输出。

输入描述

第一行包含一个整数n。1≤n≤105

第二行包含n个互不相同的正整数Ai。1≤Ai≤107

输出描述

按升序输出所有的无倍数数,以空格分隔。

示例1

输入:

3
8 4 12

输出:

8 12 

原站题解

C 解法, 执行用时: 56ms, 内存消耗: 28608KB, 提交时间: 2022-02-12

#include<stdio.h>
const int maxn = 10000001;
int data[maxn] = {0};
int main()
{
    int n;
    scanf("%d",&n);
    int t;
    for(int i = 0;i < n;i++)
    {
        scanf("%d",&t);
        data[t]++;
    }
    for(int i = 1;i <= maxn / 2;i++)
    {
        if(data[i] == 1)
        {
            int j = 2 * i;
            do
            {
                if(data[j]) {data[i] = 0;break;}
                j += i;
            }while(j < maxn);
        }
    }
    for(int k = 1;k < maxn;k++)
    {
        if(data[k] == 1) printf("%d ",k);
    }
    return 0;
}

C++ 解法, 执行用时: 582ms, 内存消耗: 760KB, 提交时间: 2022-02-11

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main()
{
    int i,j,sz,n;
    while(cin>>n)
    {
        int temp;
        vector<int> data,res;
        for(i=0;i<n;i++)
        {
            cin>>temp;
            if(temp>0)
                data.push_back(temp);
        }
        sz=data.size();
        bool correct;
        for(i=0;i<sz;i++)
        {
            correct=true;
            for(j=0;correct&&(j<sz);j++)
                correct=((j==i)||(data[j]%data[i]));
            if(correct)
                res.push_back(data[i]);
        }
        int rsz=res.size();
        if(rsz)
        {
            sort(res.begin(),res.end());
            cout<<res[0];
            for(i=1;i<rsz;i++)
                cout<<" "<<res[i];
        }
        cout<<endl;
    }
    return 0;
}

上一题