Har fått en uppgift jag inte förstår mig på riktigt...om ni förklarar _hur_ man kan göra för att lösa problemet så kan jag göra programmeringen själv eftersom jag inte förstått hur man får fram lösningen. men vill ni programmera så varsågod.
Denna uppgift är egentligen en matematisk klurighet, men här är tanken att ni ska lösa den med ett program.
På ett stort runt fat finns mellan 100 och 200 jordgubbar fördelade runt kanten. En liten flicka börjar äta bären på följande sätt: när hon ätit det första låter hon det andra ligga. Därefter äter hon det tredje bäret och låter nästa ligga och så vidare. I ett nafs äter hon varannan jordgubbe hela vägen runt. Flickan är omättlig och fortsätter att äta på detta sätt tills det bara är ett bär kvar - nämligen det bär, hon först hoppade över (d.v.s. det andra bäret) Hur många bär fanns det från början?
Jobbigt att programmera lösningen...
Svaret är väl 129?
jo, har hört att svaret ska bli 129.
och ja, lösningen är nog krånglig o få fram.
har funderat på det där en hel del och ja,
inte har jag kommit fram till nåt vettigt iaf.
nån som vill bidra med lite kod eller hjälp?
dock senast torsdag kväll.
aasahMedlem sedan mars 20034 471 inlägg Jag föreslår att du läser den här tråden. Situationen är ytterligt snarlik, även om språket och frågeställningen är en annan.
Mitt tips är att du frågar din lärare eller handledare/assistent
- beroende av på vilken nivå du befinner dig - om hjälp. Om du inte vet i vilket härad du ska börja för att få ut lösningen kan de säkert tipsa dig under förutsättning att det är meningen att du ska få hjälp om du fastnat....
Löste det.
http://member.webforum.nu/6067/berries.html
Som sang-drax mycket riktigt säger så är det vid 129 bär detta sker, hur tusan kunde du veta det för övrigt?
Jag tror tyvärr inte att jag har tid att förklara koden eller konvertera den till C. Detta är bara min lösning på det, och jag ser helst att du skriver ditt eget program.
ok, tackar ska kolla på din lösning och se om jag förstår den och sedan försöka mig på att skriva en egen lösning i C.
jag skriver helst programmet själv eftersom det är meningen att jag ska göra det, och jag vill gärna lära mig nånting på kuppen. men vill nån förklara lite hur man kan gå till väga så får ni göra det.
nitro2k01 skrev:
Som sang-drax mycket riktigt säger så är det vid 129 bär detta sker, hur tusan kunde du veta det för övrigt?.
Man är väl matematiker :)
Om man går baklänges från den sista jordgubben ser man att antalet jordgubbar som krävs är: 1, 3, 5, osv
Det vill säga att antalet jordgubbar måste kunna skrivas på formen 2^n + 1
Det enda tal x i intervallet 100<=x<=200 på den formen är just x=129.
sang-drax
rätta mig om jag har fel, men du menar alltså att
x = 2^n + 1
och n är antalet varv man käkar jordgubbar. inkluderat sista varvet??
men hur löser man ut det då man inte vet hur många varv eller hur många jordgubbar det ska va från början?
kan du visa hur du löste det matematiskt med lite fler steg och gärna från början. så man förstår hur du kom fram till det.
jag har löst problemet och kodat allt i C själv.
vet inte om det är den lättaste lösningen men det var den som jag fick att fungera efter alla möjliga olika försök.
hur som helst, så ser koden ut så här och kommentarerna förklarar vad saker o ting gör.
#include <stdio.h>
/* Räknar antalet bär kvar */
int sumBar(int c, char bar[])
{
int sum=0, i;
for(i=0;i<c;i++)
{
if(bar[i]=='j')
sum++;
}
return sum;
}
/* Kollar vilket bär som är kvar */
int kvarBar(int c, char bar[])
{
int sum=1, i;
for(i=0;i<c;i++)
{
if(bar[i]=='u')
sum++;
if(bar[i]=='j')
break;
}
return sum;
}
int main(void)
{
int i, c=100, a, sista;
char bar[200];
while(c<201)
{
/* markera som oätna */
for(i=0;i<200;i++)
bar[i] = 'j';
/* Berättar om den ätit nyss eller inte a=1 betyder
att den ska äta nästa gång. */
a=1;
/* äta bär */
for(i=0;i<c;i++)
{
/* Om oäten och inte ätit nyss = ÄT */
if(a==1 && bar[i]=='j'){
bar[i] = 'u';
a = 0;
}
/* Om oäten och ätit nyss = ät INTE */
else if(a==0 && bar[i]=='j'){
a = 1;
}
/* För att gå igenom bären och äta flera gånger
i sätts till -1 eftersom den plussas på innan
nästa varv körs för vi vill att den börjar på 0 */
if(i>(c-2))
i = -1;
/* Kolla hur många oätna bär som finns kvar,
om bara en kvar, skriv ut vilket och bryt */
if(sumBar(c, bar)==1){
sista = kvarBar(c, bar);
printf("Total: %d Sista: %d\n", c, sista);
break;
}
}
/* Öka totala antalet bär till nästa varv */
c++;
}
return 0;
}