Простые числа с argc и argv

#c

#c

Вопрос:

У меня есть задание в Codejudge, для которого я пишу программу командной строки, которая считывает разделенный пробелом список целых чисел из командной строки и печатает упорядоченный подсписок, состоящий из входных простых чисел.

Я пробовал много раз, но, похоже, у меня не получается, это входной аргумент:

 9308 2034 9466 283 7949 1153 7241 5341 4693 6910 6852 5540 8015 9305 5697 1395 4727 9159 8661 1367 6096 2911 4797 8025 2593 5460 5767 5543 2429 8371 6024 2343 285 8657 9869 5388 5295 6279 3084 9573 6980 2362 1565 5134 5185 1991 7142 3699 5937 4151 3044 2468 8005 1603 662 2989 752 6971 3152 3681 9743 653 4542 719 2081 5772 9179 4034 5904 5494 1653 251 130 6646 2835 2260 8998 7464 112 2179 6592 8502 7381 5990 6681 8237 1331 537 2048 3342 9353 7883 1041 621 1022 4569 1421 9592 877 657 7097 2828 6242 2216 387 4605 8017 2784 4509 5818 7959 1612 491 6381 6530 5773 2220 2802 6478 7401 9084 1845 8805 8192 9806 6940 6578 9132 3144 8793 4854 1087 3238 8622 419 346 2598 1194 5766 4626 4740 6191 8639 7948 9833 3117 232 5839 8726 4863 4532 3498 6717 4874 3496 2951 5750 6982 1779 9614 9519 5980 3245 2698 6771 
  

и т.д.

   #include <cmath>
#include <iostream>
#include <vector>
#include <algorithm>
int main(int argc, char* argv[]) {
    std::vector<int> input;
    std::vector<int> output;
    for (int a = 0; a < argc; a  ) {
        input.push_back(std::atoi(argv[a]));
    }
    int count = 0;
    for (int i = 0; i < input.size(); i  ) {
        if (input.at(i) % 2 != 0 amp;amp; (input.at(i) % 3 != 0 || input.at(i) / 3 == 1) amp;amp; (input.at(i) % 5 != 0 || input.at(i) / 5 == 1) /*amp;amp; input.at(i)*input.at(i)% input.at(i)!=0*/) {
            output.push_back(input.at(i));
            count  ;
        }
    }
    sort(output.begin(), output.end());
    for (int i = 0; i < count; i  ) {
        std::cout << output[i] << " ";
    }
}
  

ожидаемый результат:

 1 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229 233 239 241 
  

фактический результат:

 1 3 5 7 11 13 17 19 23 29 31 37 41 43 47 49 53 59 61 67 71 73 77 79 83 89 91 97 101 103 107 109 113 119 121 127 131 133 137 139 143 149 151 157 161 163 167 169 173 179 181 187 191 193 197 199 203 209 211 217 221 223 227 229 233 239 241
  

есть разница между ожидаемым и фактическим.

имейте в виду, что вектор случайных чисел находится в случайном порядке, а не от наименьшего к наибольшему, и все они

Комментарии:

1. Похоже, вам может понадобиться научиться использовать отладчик для пошагового выполнения вашего кода. С хорошим отладчиком вы можете выполнить свою программу построчно и посмотреть, где она отличается от того, что вы ожидаете. Это незаменимый инструмент, если вы собираетесь заниматься каким-либо программированием. Дальнейшее чтение: Как отлаживать небольшие программы и руководство по отладке

2. Черт возьми, вам действительно следует использовать два цикла для проверки простых чисел (или использовать функцию). Единственный цикл для повторения списка, а другой — для проверки всех возможных факторов.

3. Что такое входные данные?

4. и у меня здесь мало времени — это ваша проблема, не наша. Сообщения, в которых говорится «Мне нужно это к завтрашнему дню» или «У меня мало времени», создают впечатление, что ваш вопрос заслуживает приоритета над другими. Если ответ будет дан сегодня, завтра, на следующей неделе или в следующем году, так оно и будет.

5. Вот что; Я сделал, но результат стал хуже,

Ответ №1:

 for (int a = 0; a < argc; a  ) {
    input.push_back(std::atoi(argv[a]));
}
  

должно быть

 for (int a = 1; a < argc; a  ) {
    input.push_back(std::atoi(argv[a]));
}
  

Первый аргумент argv[0] — это имя программы.

Комментарии:

1. это не настоящая проблема здесь, настоящая проблема заключается в том, когда список nr. является квадратным числом.

2. @ZainAhmed Я думаю, что ваш тест на простоту просто неверен. Все просто.

3. Нет, это моя часть всего аргумента:9308 2034 9466 283 7949 1153 7241 5341 4693 6910 6852 5540 8015 9305 5697 1395 4727 9159 8661 1367 6096 2911 4797 8025 2593 5460 5767 5543 2429 8371 6024 2343 285 8657 9869 5388 5295 6279 3084 9573 6980 2362 1565 5134 5185 1991 7142 3699 5937 4151 3044 2468 8005 1603 662 2989 752 6971 3152 3681 9743 653 4542 719 2081 5772 9179 4034 5904 5494 1653 251 130 6646 2835 2260 8998 7464 112 2179 6592 8502 7381 5990 6681 8237 1331 537 2048 3342 9353 7883 1041 621 1022 4569 1421 9592 877 657 7097 2828 6242 2216 387 4605 8017 2784 4509 5818 7959 1612 491 6381

4. @ZainAhmed Я не понимаю, что ты имеешь в виду. Ваша программа не работает, потому что ваш тест на простые числа неверен. Вы могли бы проверить это достаточно легко, не пропуская весь ввод через свою программу.

5. первый тест имеет этот вектор: 12 32 34 12 123 31 12 13 8 7 123 89 и ожидаемый результат: 7 13 31 89, который мой код действительно решил, а второй аргумент равен 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34, и извлечение простых чисел из этого вектора тоже решается, но моя проблема здесь связана с нечетными квадратными числами, такими как 49 (7×7) 121 (11×11) и т.д.