/* quando trova un divisore k di n, conta anche divisore n/k * Quindi e' sufficiente eseguire le divisioni fino a sqrt(n) * Il caso in cui n sia un quadrato perfetto deve essere considerato a parte, * poiche' quando k=sqrt(n) i divisori k e n/k coincidono. * Per un motivo simile anche il caso n=1 deve essere considerato separatamente */ import java.util.Scanner; public class ContaDivisoriVeloce { public static void main(String[] args) { long n; long divisore; int contaDiv; Scanner lettore = new Scanner(System.in); System.out.print("Digita un naturale: "); n = lettore.nextLong(); if(n==1) contaDiv = 1; else { divisore = 1; contaDiv = 0; while(divisore < Math.sqrt(n)) { if(n%divisore == 0) contaDiv = contaDiv + 2; divisore++; } int radiceTroncata = (int) Math.sqrt(n); if(n == radiceTroncata * radiceTroncata) // n e' un quadrato perfetto, cioe' la radice e' intera contaDiv++; } System.out.println(n+" ha "+contaDiv+" divisori (compresi 1 e "+n+")"); } }