Семь воров и бриллиантов загадка 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 ответ:
Ваш код очень труден для выполнения, поэтому я написал свой собственный код для отладки этого, и ваша программа, хотя неясная и трудная для выполнения, полностью корректна для допустимых входных данных, вы просто не очень хорошо обрабатываете все случаи, таким образом, вы находитесь в цикле 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"); } }