七个盗贼&钻石谜语C程序

时间:2015-07-05 18:40:41

标签: c puzzle

我最近为以下“七个小偷和钻石”拼图编写了一个C程序:

“有七个小偷,他们从一个钻石商人那里偷钻石,然后在丛林中逃跑。在跑步的时候,夜晚开始,他们决定在丛林中休息当每个人都在睡觉时,两个最好的朋友起床决定在他们自己之间分发钻石并逃跑。所以他们开始分发,但发现一颗钻石是额外的。所以他们决定醒来第三颗并再次分割钻石......他们惊讶地发现他们仍然发现一颗额外的钻石。所以他们决定唤醒第四个。再一颗钻石是剩余的。第五个醒来......还有一个额外的。第六个还有一个额外。现在他们醒来7号,钻石分配均匀。“

虽然逻辑很容易理解,但我的程序似乎非常错误。它似乎只适用于数字3,5和7.

我是一般的编程新手,我觉得我的程序不是很复杂:

#include<stdio.h> 

int main() 
{ 
    int n,i,j,k; 
    int a[30]; 
    printf("Enter the number of thieves\n"); 
    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 = %d\n",i); 
                return; 
            } 
        } 
        i++; 
    } 
} 

如果有人可以帮助我将这些代码发展成更具有特异性的东西,那将是很好的,这样它就可以为'n'的所有值返回输出。此外,任何反馈一般都将受到高度赞赏。

1 个答案:

答案 0 :(得分:3)

你的代码很难遵循,所以我编写了我自己的代码来调试这个和你的程序,虽然模糊和难以理解,对于有效的输入是完全正确的,你只是没有很好地处理所有情况因此你在永远的循环。并非每个输入都适用于此问题,只有素数会为您提供此问题的答案,因此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");

    }
}