login  Naam:   Wachtwoord: 
Registreer je!
 Forum

csharp het perfecte getal bereeken

Offline jordie91 - 18/06/2009 19:30
Avatar van jordie91Lid ik wil dus dat je bijvoorbeeld hebt 6 en dat kan je dan delen door 1 ,2 ,3 en de som van die drie getallen is dan ook zes

Plaatscode: 136899

8 antwoorden

Gesponsorde links
Offline henver - 18/06/2009 20:07
Avatar van henver HTML gevorderde Ken je de formule om een perfect getal te berekenen?
Offline jordie91 - 18/06/2009 21:19
Avatar van jordie91 Lid nee maar een voorbeeld ervan is

Als voorbeeld:

bool a = isPerfect(6);
bool b = isPerfect(10);

levert op dat de variabele a de waarde true krijgt. De variabele b krijgt de waarde false.
Want 6 is een perfect getal (de som van de gehele delers is 1+2+3 = 6).
Het getal 10 is géén perfect getal ( de som van de gehele delers is 1+2+5 = 8)
Offline henver - 18/06/2009 21:34 (laatste wijziging 18/06/2009 21:37)
Avatar van henver HTML gevorderde Wat ik weet, is dat een perfect getal te schrijven is als (2^(n-1))(2^n-1) waarbij geldt dat n een oneven getal is (met enkele uitzonderingen waaronder 11)

6 is bijvoorbeeld te schrijven als 2^1(2^2-1) (dus n is hier 1)

Het probleem is dat je niet weet hoe je 6 kan schrijven op deze manier.

Misschien biedt een loop een oplossing: je gooit 6 door een loop en kijkt voor $i aantal getallen deelbaar is door elk van dat getal (de rest is dus 0). Wanneer dit het geval is, gooi je dit getal bij in een array en op het einde tel je de waardes uit die array samen en kijk je of de som gelijk is aan het begingetal.

Doordat je gaat loopen, is er uiteraard een beperkt bereik...


@hieronder: je formule klopt niet 
Offline maigel - 18/06/2009 21:34 (laatste wijziging 18/06/2009 21:42)
Avatar van maigel PHP beginner even googlen geeft
2^(k-1) . 2^k -1 als formule voor perfecte getallen met als k een geheel getal, met een beetje wiskundige kennis kan je deze formule in een vergelijking gieten waar je k kan uithalen, dan kan je checken of k een geheel getal is.

edit: klopte idd niet, machten op pc ingeven is nogal lastig 

edit 2: henver, je weet wel hoe je dit kan schrijven als je gebruik maakt van logaritmen kan je 2^(k-1) . 2^k -1 gelijkstellen aan het getal dat ingegeven wordt en dan k bepalen, maar aangezien je dan met veel voorwaarden gaat moeten rekening houden is misschien de oplossing van de loop toch nog beter 
Offline Abbas - 19/06/2009 01:46
Avatar van Abbas Gouden medaille

Crew .NET
Beetje logica en nadenken en je komt er wel.  Volgens de definitie op Wikipedia voor een (even) perfect getal is de som van alle gehele delers van een getal x, gelijk aan de som van alle delers van dat getal. Ik heb even een WinForm projectje gemaakt om te testen. Op de code van numerieke invoer en dergelijke hoef je niet per se te letten. Het gaat hem om de functie onderaan (IsPerfect()):

  1. int x;
  2.  
  3. private void btnGo_Click(object sender, EventArgs e)
  4. {
  5. if (IsValidInput(txtInput.Text))
  6. {
  7. if (IsPerfect(x))
  8. MessageBox.Show(x.ToString() + " is Perfect!");
  9. else
  10. MessageBox.Show(x.ToString() + " is niet perfect.");
  11. }
  12.  
  13. //Als je de bovenstaande code in dit event in commentaar zet
  14. //En de code hieronder test krijg je de eerste 4 perfecte getallen
  15. //Let wel, 0 zit er nu bij hoewel het niet echt juist is.. ;)
  16. //for(int q = 0; q < 10000; q++)
  17. // if(IsPerfect(q))
  18. // MessageBox.Show(q.ToString() + " is perfect!");
  19. }
  20.  
  21. private bool IsValidInput(string Input)
  22. {
  23. if (String.IsNullOrEmpty(Input))
  24. {
  25. MessageBox.Show("Getal invullen.");
  26. return false;
  27. }
  28. if (!Information.IsNumeric(txtInput.Text))
  29. {
  30. MessageBox.Show("Invoer moet getal zijn.");
  31. return false;
  32. }
  33. x = Convert.ToInt32(txtInput.Text);
  34. if (IsPriem(x))
  35. {
  36. MessageBox.Show("Getal mag geen priemgetal zijn.");
  37. return false;
  38. }
  39. return true;
  40. }
  41.  
  42. private bool IsPriem(int Input)
  43. {
  44. for (int i = 2; i < Input; i++)
  45. if (Input % i == 0)
  46. return false;
  47. return true;
  48. }
  49.  
  50. //Om de functie hieronder gaat het dus:
  51. private bool IsPerfect(int Input)
  52. {
  53. int value = 0;
  54. for (int j = 1; j <= Input; j++)
  55. if (Input % j == 0)
  56. value += j;
  57. if(value / 2 == Input)
  58. return true;
  59. return false;
  60. }
Offline jordie91 - 19/06/2009 09:43
Avatar van jordie91 Lid nu heb ik dit aleen krijg ik het niet werkende

methode werkt aleen hij kan hem niet tonen

Plaatscode: 136902
Offline Ontani - 19/06/2009 09:52
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
som is toch uw resultaat, nummer heb je toch allang ingegeven...

Console.WriteLine("voer hier een getal in en dan kijk ik of het perfect is {0}", nummer);

moet dat niet zijn:

Console.WriteLine("Is getal {0} perfect of niet? {1}", nummer, som);
Offline Abbas - 19/06/2009 11:29
Avatar van Abbas Gouden medaille

Crew .NET
Hieronder dan de code voor een Console Application! Bij mij werkt het volledig perfect

  1. class Program
  2. {
  3. private static int x;
  4.  
  5. static void Main(string[] args)
  6. {
  7. Console.Write("Geef een getal in: ");
  8. while (!IsValidInput(Console.ReadLine()))
  9. Console.Write("Geef een getal in: ");
  10. if (IsPerfect(x))
  11. Console.WriteLine("{0} is een perfect getal!", x);
  12. else
  13. Console.WriteLine("{0} is een gewoon getal!", x);
  14.  
  15. //De loop om het niet met invoer te moeten testen dat het werkt
  16. //Ik heb hier ook !IsPriem() bijgezet omdat dit naar grotere
  17. //getallen rekenwerk uitspaart als het een priemgetal is
  18. //========================================
  19. //for (int q = 0; q < 10000; q++)
  20. // if (!IsPriem(q) && IsPerfect(q))
  21. // Console.WriteLine(q.ToString() + " is perfect!");
  22. Console.ReadKey();
  23. }
  24.  
  25. private static bool IsValidInput(string Input)
  26. {
  27. if (String.IsNullOrEmpty(Input))
  28. {
  29. Console.WriteLine("Getal invullen.");
  30. return false;
  31. }
  32. if (!Information.IsNumeric(Input))
  33. {
  34. Console.WriteLine("Invoer moet getal zijn.");
  35. return false;
  36. }
  37. x = Convert.ToInt32(Input);
  38. if (IsPriem(x))
  39. {
  40. Console.WriteLine("Getal mag geen priemgetal zijn.");
  41. return false;
  42. }
  43. return true;
  44. }
  45.  
  46. private static bool IsPriem(int Input)
  47. {
  48. for (int i = 2; i < Input; i++)
  49. if (Input % i == 0)
  50. return false;
  51. return true;
  52. }
  53.  
  54. private static bool IsPerfect(int Input)
  55. {
  56. int value = 0;
  57. for (int j = 1; j <= Input; j++)
  58. if (Input % j == 0)
  59. value += j;
  60. if (value / 2 == Input)
  61. return true;
  62. return false;
  63. }
  64. }
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.217s