我最近为以下“七个小偷和钻石”拼图编写了一个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'的所有值返回输出。此外,任何反馈一般都将受到高度赞赏。
答案 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");
}
}