/*Dette programmet kan finne ut om et tall er et primtall.
Du kan gjøre hva du vil med programmet og kildekoden, men
bruk det på eget ansvar. Hvis du endrer funksjonaliteten i
programmet, vær da vennlig å fjern denne notisen. Hvis du
derimot bare justerer, utvider eller forbedrer programmet,
la denne notisen stå, og tilføy om du vil din egen under.
*/

#include <stdio.h>
#include <stdlib.h>

int main(int parametere, char *parameter[1]){

unsigned long long int tall;

if(parametere > 1){
  tall=strtoull(parameter[1], NULL, 10);
  if(tall==0){
    printf("Primtall 2.0 - et program som primtallsfaktoriserer tall fra standard inn.\n\n");
    printf("Bruk:\tprimtall PARAMETER\neller\tprimtall\n\n");
    printf("\tBytt ut PARAMETER med et positivt heltall for normal bruk.\n");
    printf("\tUten parametere vil Primtall spørre etter tallet.\n");
    printf("\tEt parameter som er 0 eller ikke består av tall\n");
    printf("\tgir denne hjelpeteksten. Bare ett parameter teller.\n\n");
    printf("Når Primtall finner en faktor, deles tallet på faktoren. Faktoren havner\n");
    printf("i venstre kolonne, mens det korresponderende svaret havner i høyre kolonne\n");
    printf("under 'Delsvar'. Deretter deles delsvaret på neste faktor osv.\nFaktorene er primtall.\n");
  return 0;
  }
  printf("Oppfattet:\t%lld", tall);
}
else{
  printf("Skriv et heltall: ");
  scanf("%lld", &tall);
  printf("Oppfattet:\t  %lld", tall);
}

unsigned short int delelig=0;

if(tall>3){

  unsigned long int del=2;		//del må kunne bli minst like høy som kvadratroten av "tall", ellers blir do-while aldri fornøyd!
  unsigned short int n=2;
  long double svar;			//Disse 2 variablene må kunne bli like høye som "tall", ellers
  unsigned long long int helsvar;	//vil programmet tro at høye primtall er delelige på 2.

  printf("\n\nFaktorer:\tDelsvar:\n");

  do{
    svar=(long double)tall/del;
    helsvar=svar;
    if(svar==helsvar){
      printf("%ld\t\t%lld\n", del, helsvar);
      delelig++;
      tall=helsvar;
    }
    else{
      if(del<5){
	del++;
      }
      else{
	del=del+n;
	if(n<3){
	  n=4;
	}
	else{
	  n=2;
	}
      }
    }
  }while(del<svar);

}

if(tall<2){
  printf("\n%lld regnes ikke som et primtall.\n", tall);
}
else{
  if(delelig>0){
    delelig++;
    printf("%lld\t\t1\n\n%d faktorer\n", tall, delelig);
  }
  else{
    printf("\n%lld er et primtall!\n", tall);
  }
}

return 0;
}

