Forum: Decimaler i C++

Forum huvudsida -> Programmering -> Decimaler i C++

Sidor: 1

Till botten

Larsa 12:46 - 7:e December 2009 | Post #1
Medlem
Inlägg: 3


Skicka PM
Hej!

Jag har letat runt på internet efter svar, och kollat igenom många programmeringsforum, samt checkat med kompisar, men ingen vet svar. Inte det svaret som jag behöver i alla fall.

Problemet är att jag ska skriva ett program som hittar primtal, eller säger ifrån om det är ett primtal eller inte som matas in. Och jag har kommit på en funktion som bör funka för att ta reda på mitt svar om primtal.

Mer om primtal finns här: http://sv.wikipedia.org/wiki/Lista_%C3%B6ver_primtal

Mitt problem nu är dock att jag inte får fram några decimaler i mitt C , utan när jag startar mitt program och skriver in nåt så simpelt som 5/2 så ger programmet mig svaret 2.

FEL FEL FEL!

Svaret ska naturligtvis bli 2,5, och det är just detta som är felet! Någon som vet hur jag ändrar i min kod, eller kan ge konkreta förslag till förslag till förbättring!

Min kod: http://pastebin.com/m23946cd3


Senast redigerad 12:48 - 7:e December 2009


martin310 16:15 - 7:e December 2009 | Post #2
Medlem
Inlägg: 132


Skicka PM
Jag skrev en primletare en gång (den blev ganska seg vid högre tal). Det du ska använda är modulus - %. Den räknar ut resten. Är den lika med noll, så ska programmet ta nästa tal och kolla med det. Om resten inte är noll (!=) så är det inget primtal. Loopa igenom alla tal
  1. for(int at = 2; at < primtal; at++)


Dit problem med dicimalerna är antagligen för att du använder en int, som inte kan hantera decimaler. Använd double eller float.

EDIT: Ser även ett annat fel som jag sa högre upp i texten, men vill belysa: vissa tal som t.ex. 9, är inget primtal, men med din kod så blir den det! Använd for-loopen!

-------------------------

Hjälp jorden med Granola, det är gratis och funkar på både Windows och Linux, och försämrar inte datorns prestandad!



Senast redigerad 16:17 - 7:e December 2009


ozamosi 05:40 - 8:e December 2009 | Post #3
Administratör
Inlägg: 1129


Skicka PM
  1. if (talsvar=0)

Den koden gör inte vad du vill att den ska göra…

    Citat av martin310:
Loopa igenom alla tal
  1. for(int at = 2; at < primtal; at++)


Vill man väsentligen halvera tiden det tar att testa ett tal kan man hårdkoda testningen för 2, och sedan efter det skriva for-loopen som
  1. for (int at = 3; at < primtal; at += 2)

Detta eftersom alla primtal utom 2 är udda nummer, dvs alla tal som går att dela på ett jämnt tal går också att dela på två.

Den Riktigt Stora optimeringen man kan göra är att man börjar med att räkna ut roten ur talet (innan for-loopen!)
  1. int root = sqrt(primtal);

Funktionen sqrt ligger i cmath. int används med flit, eftersom flyttalsmatte är långsammare än heltalsmatte, och vi ändå inte bryr oss om flyttal.

Sedan skriver man for-loopen som
  1. for (int at = 3; at <= root; at += 2)

Här är idén att ingen primtalsfaktor kan vara större än dess kvadratrot, utan att det även finns minst en primtalsfaktor som är mindre än roten ur ett tal (exempel: roten ur 25 är 5. Alla tal större än 5 multiplicerade med varandra ger svar som är större än 25). Mindre eller lika med kommer sig både av att kvadratroten kan vara en primtalsfaktor, och att vi avrundade kvadratroten neråt tidigare så att talet i root kan vara mindre än talets kvadratrot.


(Jag hade för lite att göra i gymnasiet.)

-------------------------
Ljusblå



Larsa 08:00 - 8:e December 2009 | Post #4
Medlem
Inlägg: 3


Skicka PM
Nu har jag ändrat om koden lite, och har i alla fall fått fram decimalerna som jag var ute efter, men eftersom 9/3=4,5 så stämde inte min tanke att hitta primtal.

Vart placerar jag in for koden?

http://pastebin.com/m13356e12




ozamosi 11:27 - 8:e December 2009 | Post #5
Administratör
Inlägg: 1129


Skicka PM
  1. if (x=0)

Gör fortfarande inte vad du villSmiley

Det finns ingen mening med att kolla om kvoten blir 0 eller 1: till exempel 4 / 2 blir 2 — då är det varken ett primtal, eller inte ett primtal! Ett tal är ett primtal om kvoten blir ett heltal, dvs om det saknar rest. Vilket, som martin310 sa, enklast kontrolleras med modulo istället för division.

Det du måste ändra mer är att du nu bara försöker kontrollera om talet är jämnt delbart med b när b = 2.0. Du måste göra samma kontroll för alla andra relevanta värden på b, vilket i sin enklaste form är alla heltal från 2 till a - 1.

-------------------------
Ljusblå



Larsa 11:55 - 8:e December 2009 | Post #6
Medlem
Inlägg: 3


Skicka PM
Som riktig nybörjare, modulo?Smiley




Sidor: 1

Forum huvudsida -> Programmering -> Decimaler i C++
Atom feed

Du får inte posta i den här tråden | Till toppen