webForumDet fria alternativet

matematiskt problem i C

8 svar · 512 visningar · startad av Simkisen

SimkisenMedlem sedan jan. 200357 inlägg
#1

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?

Sang-draxMedlem sedan juli 2002581 inlägg
#2

Jobbigt att programmera lösningen...

Svaret är väl 129?

SimkisenMedlem sedan jan. 200357 inlägg
#3

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
#4

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....

nitro2k01Medlem sedan aug. 20039 342 inlägg
#5

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.

SimkisenMedlem sedan jan. 200357 inlägg
#6

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.

Sang-draxMedlem sedan juli 2002581 inlägg
#7

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.

SimkisenMedlem sedan jan. 200357 inlägg
#8

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.

SimkisenMedlem sedan jan. 200357 inlägg
#9

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;
}
132 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)