Как получить GCD целых чисел аргументов командной строки, введенных пользователем после «./a.out» в любом порядке?

Эта программа возвращает GCD аргументов командной строки, введенных пользователем, ТОЛЬКО от наименьшего до наибольшего. Например:

Пользовательский ввод: './a.out 5 10 15 20 25'

Эта программа возвращает: «GCD аргументов командной строки равен 5»

Однако проблема, с которой я сталкиваюсь, заключается в том, что пользователь, например, вводит:

Пользовательский ввод: './a.out 15 10 5 25 20'

Эта программа возвращает: 15

Может ли кто-нибудь сказать мне, как решить эту проблему?

Вот к чему я стремлюсь:

Если пользовательский ввод: './a.out 15 10 5 25 20'

Эта программа должна вернуть: 5

//Header Files
#include<stdio.h>
#include<string.h>

//Main Method
int main(int argc, char *argv[]){

//Declared variables here and print statements
 int i,x,y,min;
 printf("Number of command line args is %d\n", argc);
 printf("The GCD is:\t");

 //This is the main while loop
 while( x !=0 && y !=0 && y != x){

 if(x<y){
  y=y-x;
 }//End first IF statement
 if(y<x){
  x-x-y;
 }//End second IF statement
 }//End while loop

 //This function returns the converted integral number as an int value
  x=atoi(argv[i]);
  for(i=2;i<argc;i++){
  y=atoi(argv[i]);
   }

   //The following code gets the GCD and prints from the command line
   min = (x>y)?x:y;
  for(i=min;i>=1;--i){
  if(x%i==0 && y%i==0){
  for(i=1;i<argc;i++){
   printf("%s\n", argv[i]);
    break;}//End for loop
    }//End IF statement
   }//End For loop
  }//End of MAIN

person Raoul Duke    schedule 28.03.2015    source источник
comment
Это реальная программа или вы ее перепутали? Вы пропустили его часть?   -  person Manish Kothari    schedule 29.03.2015
comment
Это реальная программа. Вы понимаете, как нужно вводить числа после ./a.out?   -  person Raoul Duke    schedule 29.03.2015
comment
i (и некоторые другие переменные) не инициализируются. В любом случае первый цикл while кажется бесполезным. Но, пожалуйста, сделайте правильный отступ в коде.   -  person wimh    schedule 29.03.2015
comment
Понятно, спасибо за ответ!   -  person Raoul Duke    schedule 29.03.2015
comment
Неважно, как вы вводите числа в качестве аргументов, этот код не даст вам желаемого результата. В вашем коде есть недостатки, я разместил исправленную ошибку ниже в ответе.   -  person Manish Kothari    schedule 29.03.2015
comment
эта строка: 'while( x !=0 && y !=0 && y != x){' использует переменные 'x' и 'y', однако, особенно на первой итерации, эти переменные не инициализируются   -  person user3629249    schedule 29.03.2015
comment
отступ кода после каждой открывающей скобки и удаление отступа при каждой закрывающей скобке сделало бы код намного более ясным/понятным и нам было бы намного проще перепроектировать его, чтобы попытаться определить, что пошло не так. Предлагайте использовать отступ в 4 пробела (и НИКОГДА не используйте табуляцию для форматирования кода).   -  person user3629249    schedule 29.03.2015
comment
код извлекает параметры из командной строки без ПЕРВОГО подтверждения существования таких параметров. Как правило, лучше всего в первую очередь проверить количество параметров с помощью argc, вывести сообщение об ошибке или сообщение об использовании, если этот номер argc не подходит, а затем выйти.   -  person user3629249    schedule 29.03.2015
comment
блок кода, начинающийся со слов: 'while( x !=0 && y !=0 && y != x){' ничего не делает, кроме как настраивает какой-то мусор, который оказался в стеке, где переменные 'x' и 'y ' расположены. т.е. это абсолютно ничего не делает для программы   -  person user3629249    schedule 29.03.2015
comment
этот блок кода: for(i=2;i‹argc;i++){ y=atoi(argv[i]);'' помещает первый параметр (при условии, что он существует) в 'x' и помещает последний параметр в 'y ' все остальные номера потеряны   -  person user3629249    schedule 29.03.2015
comment
что ожидается, если первый или последний параметр равен 0? Что ожидается, если нет параметров? что ожидается, если есть только 1 параметр?   -  person user3629249    schedule 29.03.2015
comment
что ожидается, что первый параметр или последний параметр не кратны друг другу?   -  person user3629249    schedule 29.03.2015
comment
самый внутренний цикл for, ближе к концу кода, никогда не будет выполнять более одного цикла из-за 'break;' утверждение. Это то, чего вы действительно хотите?   -  person user3629249    schedule 29.03.2015
comment
самый внутренний цикл содержит оператор printf(), который использует argv[i], однако «i» может быть любым значением в диапазоне значений входных параметров (а не числом входных параметров), поэтому argv[i] может быть за пределами конец массива argv[]. что приводит к неопределенному поведению и может/приведет к событию сбоя сегмента   -  person user3629249    schedule 29.03.2015


Ответы (2)


Я очистил его, это должно сработать для вас:

Инициализируйте каждую переменную, прежде чем рассматривать ее для расчета в своем коде.

#include<stdio.h>
#include<string.h>

//Main Method
int main(int argc, char *argv[]){

//Declared variables here and print statements
 int i,x,y,gcd;
 printf("Number of command line args is %d\n", argc);
 printf("The GCD is:\t");
 x=atoi(argv[1]);
 for(i=2;i<argc;i++){
    y=atoi(argv[i]);
    while( x !=0 && y !=0 && y != x){
        if(x<y){
            y=y-x;
        }else if(y<x){
            x=x-y;
        }
    }
    gcd=x;
 }
 printf("%d",gcd);
}//End of MAIN
person Manish Kothari    schedule 28.03.2015
comment
Эта программа, которую вы очистили, не работает, потому что теперь она возвращает только 0. - person Raoul Duke; 29.03.2015
comment
Какие у вас входные параметры? - person Manish Kothari; 29.03.2015
comment
./a.out 5 10 15 Программа возвращает: 0 - person Raoul Duke; 29.03.2015
comment
Плохо, я пропустил, что 1-й параметр - это имя файла, я исправил его, попробуйте сейчас. - person Manish Kothari; 29.03.2015
comment
Без проблем. Спасибо за вашу помощь. - person Raoul Duke; 29.03.2015

Если вы хотите сделать с рекурсией.

#include<stdio.h>
#include<string.h>

int GCD(int numbers[], int count)
{
    if (count==1)
        return numbers[0];
    int i, j, min, x, y;
    x = numbers[0];
    y = numbers[1];
    min = (x>y)?x:y;
    for(i=min;i>=1;--i){
        if(x%i==0 && y%i==0){
            int newNumbers[count-1];
            newNumbers[0]=i;
            for (j=1; j<count-1; j++) {
                newNumbers[j] = numbers[j+1];
            }
            return GCD(newNumbers, count-1);
        }
    }
    return 0;
}

int main(int argc, const char * argv[]) {
    //Declared variables here and print statements
    int i;
    printf("Number of command line args is %d\n", argc);
    printf("The GCD is:\t");

    int numbers[argc];

    for(i=1;i<argc;i++){
        numbers[i]=atoi(argv[i]);
    }

    int result = GCD(numbers, argc);
    printf("%d\n", result);

}
person btevfik    schedule 28.03.2015