Семь воров и бриллиантов загадка C программа


Недавно я написал программу на языке Си для следующей головоломки "семь воров и бриллиантов":

"Есть семь воров, они крадут алмазы у торговца алмазами и убегают в джунгли. Во время бега наступает ночь, и они решают отдохнуть в джунглях, когда все спят, двое из лучших друзей встают и решают распределить алмазы между собой и убежать. Поэтому они начинают распространять, но обнаруживают, что один алмаз был лишним. Поэтому они решают разбудить 3-го и разделите алмазы еще раз .....только к их удивлению они все еще находят один лишний бриллиант. Поэтому они решают разбудить четвертого. И снова один бриллиант-лишний. 5-й проснулся...... еще один лишний. 6-й еще один лишний. Теперь они просыпаются 7-м и алмазы распределяются поровну." Хотя логика довольно проста для понимания, моя программа кажется довольно глючной. Кажется, что он работает только для чисел 3, 5 и 7.

Я новичок в программировании в целом, и я чувствую, что моя программа не очень сложный:

#include<stdio.h> 

int main() 
{ 
    int n,i,j,k; 
    int a[30]; 
    printf("Enter the number of thievesn"); 
    scanf("%d",&n); 
    i=n+1; 
    while(1) 
    { 
        j=2; 
        k=0; 
        while(j<n) 
        { 
            if(i%j == 1 && i%n==0) 
            { 
                a[k]=1; 
            } 
            else 
            { 
                a[k]=0; 
            } 
            if(k==n-2) 
            { 
                k=0; 
            } 
            j++; 
            k++; 
        } 
        for(j=0;j<n-1;j++) 
        { 
            if(a[j]==0) 
            { 
                break; 
            } 
            else if(j==n-3 && a[j] == 1) 
            { 
                printf("The number of diamonds = %dn",i); 
                return; 
            } 
        } 
        i++; 
    } 
} 

Было бы здорово, если бы кто-нибудь помог мне разработать этот код в нечто более неспецифическое, чтобы он мог возвращать выходные данные для всех значений 'n'. кроме того, любая обратная связь в целом была бы высоко оценена.

1 3

1 ответ:

Ваш код очень труден для выполнения, поэтому я написал свой собственный код для отладки этого, и ваша программа, хотя неясная и трудная для выполнения, полностью корректна для допустимых входных данных, вы просто не очень хорошо обрабатываете все случаи, таким образом, вы находитесь в цикле while навсегда. Не все входные данные будут работать для этой задачи только простые числа дадут вам ответ на эту задачу, поэтому входные данные, такие как 2, 4 и 6, не будут работать, поэтому их нужно обрабатывать.

Вот тест, сравнивающий ваши результаты с тест, который я написал для допустимых входных данных.

#Of Theives   Your Code    Test Code
    3            3            3
    5            25           25
    7            301          301
    11           25201        25201
    13           83161        83161

Вы можете написать быструю функцию для проверки этого ухода, например:

int isPrime(int tmp)
{
    int i;
    for(i = 2; i <= tmp/2; i++)
    {
        if(tmp % i == 0)
            return 0;
    }
    return 1;
}

Тогда вы можете проверить допустимые входные данные, число которых больше 1 (потому что тогда не было бы достаточно тифов, чтобы история произошла) и простое число так:

#include<stdio.h> 

int isPrime(int tmp)
{
    int i;
    for(i = 2; i <= tmp/2; i++)
    {
        if(tmp % i == 0)
            return 0;
    }
    return 1;
}



int main() 
{ 
    int n,i,j,k; 
    int a[30]; 
    printf("Enter the number of thieves that is prime and greater than 1\n"); 
    scanf("%d",&n); 
    i=n+1;
    if(isPrime(n) && n > 1)
    {
        while(1) 
        { 
            j=2; 
            k=0; 
            while(j<n) 
            { 
                if(i%j == 1 && i%n==0) 
                { 
                    a[k]=1; 
                } 
                else 
                { 
                    a[k]=0; 
                } 
                if(k==n-2) 
                { 
                    k=0; 
                } 
                j++; 
                k++; 
            } 
            for(j=0;j<n-1;j++) 
            { 
                if(a[j]==0) 
                { 
                    break; 
                } 
                else if(j==n-3 && a[j] == 1) 
                { 
                    printf("The number of diamonds = %d\n",i); 
                    return; 
                } 
            } 
            i++; 
        } 
    }
    else
    {
    printf("Input Invalid.\n"); 
    }
} 

Код, который я написал, чтобы проверить загадку:

#include<stdio.h>


int isPrime(int tmp)
{
    int i;
    for(i = 2; i <= tmp/2; i++)
    {
        if(tmp % i == 0)
            return 0;
    }
    return 1;
}

long gcd(long a, long b) {
  if (b == 0) {
    return a;
  }
  else {
    return gcd(b, a % b);
  }
}

int main()
{
    int thieves, i;
    long diamonds, lcm = 1;
    printf("Enter the number of thieves that is prime and greater than 1:\n");
    scanf("%d",&thieves);

    if(isPrime(thieves) && thieves > 1)
    {
        for(i = 2;i < thieves;i++)
        {
                lcm = (lcm*i)/gcd(i,lcm);
        }

        i = 1;
        dimonds = lcm*i + 1;
        while(dimonds % thieves != 0)
        {
            dimonds = lcm*++i + 1;
        }
        printf("There are a minimum of diamonds is: %d\n",diamonds);
    }
    else 
    {
        printf("Input inv\n");

    }
}