Gyakorlati alapok
Hány számjegy avagy mennyi digit?
Az előző, Digit vagy helyiérték? című fejezet kis kényszerű kitérőt tett néhány fontos informatikai fogalom értelmezésére. Ebben a fejezetben néhány rövid Java-kóddal azt vizsgáljuk meg, hogy miképpen számolhatjuk ki egy bekért szám számjegyeit (azaz digitjeinek számát). Többféle algoritmusból is válogathatunk.
A probléma alapjában véve if-else ágak halmazával megoldható; az alábbi algoritmus magja stackoverflow.com oldalról származik:
import java.util.*;
public class Main {
public static void main(String[] args) {
int szamjegy = 0;
Scanner scanner = new Scanner (System.in);
System.out.println ("Kérem, hogy adja meg a vizsgálni kívánt
számot (1 és 1000000000 között)!");
String szamString = scanner.nextLine();
int szam = Integer.parseInt(szamString);
while (szam < 1 || szam > 1000000000) {
System.out.println ("Kérem, hogy csak
pozitív számot adjon meg 1 és 1000000000 között!");
szamString = scanner.nextLine();
szam = Integer.parseInt(szamString);
}
if(szam < 100000){
if(szam < 100){
if(szam < 10)
szamjegy = 1;
else
szamjegy = 2;
}else{
if(szam < 1000)
szamjegy = 3;
else{
if(szam <
10000)
szamjegy = 4;
else
szamjegy = 5;
}
}
}else {
if(szam < 10000000) {
if(szam <
1000000)
szamjegy = 6;
else
szamjegy = 7;
}else {
if(szam <
100000000)
szamjegy = 8;
else {
if (szam < 1000000000)
szamjegy = 9;
else
szamjegy = 10;
}
}
}
System.out.println ("A bevitt szám (" + szam + ") " +
szamjegy + " számjegyű.");
}
}
Végeredmény:
Kérem, hogy adja meg a vizsgálni kívánt számot (1 és
1000000000 között)!
0
Kérem, hogy csak pozitív számot adjon meg 1 és 1000000000 között!
1000000001
Kérem, hogy csak pozitív számot adjon meg 1 és 1000000000 között!
100000
A bevitt szám (100000) 6 számjegyű.
Nagy segítség azonban, ha visszaemlékezünk a Lóg a ritmus! című fejezetben leírtakra. Ha vesszük például a 10-es alapú logaritmusokat 1 és 9 között...
import java.math.*;
public class Main {
public static void main(String[] args) {
double kitevo = 0;
double eredmeny = 10;
for(int i = 1; i <= 9; i++){
kitevo = Math.log10(eredmeny);
System.out.println((int)eredmeny + "
log10 = " + (int)kitevo);
eredmeny *= 10;
}
}
}
Végeredmény:
10 log10 = 1
100 log10 = 2
1000 log10 = 3
10000 log10 = 4
100000 log10 = 5
1000000 log10 = 6
10000000 log10 = 7
100000000 log10 = 8
1000000000 log10 = 9
...akkor listázáskor kísérteties hasonlóságot vehetünk észre a végeredmények és a számjegyek száma között. A felhasználható képlet:
szamjegy = (int)(Math.log10(szam) + 1
import java.util.*;
public class Main {
public static void main(String[] args) {
int szamjegy = 0;
Scanner scanner = new Scanner (System.in);
System.out.println ("Kérem, hogy adja meg a vizsgálni kívánt
számot (1 és 1000000000 között)!");
String szamString = scanner.nextLine();
int szam = Integer.parseInt(szamString);
while (szam < 1 || szam > 1000000000) {
System.out.println ("Kérem, hogy csak
pozitív számot adjon meg 1 és 1000000000 között!");
szamString = scanner.nextLine();
szam = Integer.parseInt(szamString);
}
szamjegy = (int)(Math.log10(szam) + 1);
System.out.println ("A bevitt szám (" + szam + ") " +
szamjegy + " számjegyű.");
}
}
Végeredmény:
Kérem, hogy adja meg a vizsgálni kívánt számot (1 és
1000000000 között)!
0
Kérem, hogy csak pozitív számot adjon meg 1 és 1000000000 között!
1111
A bevitt szám (1111) 4 számjegyű.
Angster Erzsébet - Objektumorientált tervezés és programozás, JAVA, 1. kötet című munkájában (254. oldal) egy érdekes további lehetőséget említ meg. A bekért számot mindig 10-zel osztjuk (azaz roppant elmés módon mindig 1 digittel csökkentjük), ezzel párhuzamosan a számjegy értékét 1-gyel növeljük. Ez a do-while ciklusba foglalt számolás addig tart, amíg a szám nem lesz kisebb 10-nél, ekkor kilépünk a ciklusból, ezáltal a szamjegy változó az aktuális digitmennyiséget fogja tárolni. Nézzük meg alapalgoritmusát...
do{
szam /= 10;
szamjegy++;
}while(szam != 0);
...majd illesszük be a már ismert futtatható Java-kódba:
import java.util.*;
public class Main {
public static void main(String[] args) {
int szamjegy = 0;
Scanner scanner = new Scanner (System.in);
System.out.println ("Kérem, hogy adja meg a vizsgálni kívánt
számot (1 és 1000000000 között)!");
String szamString = scanner.nextLine();
int szam = Integer.parseInt(szamString);
while (szam < 1 || szam > 1000000000) {
System.out.println ("Kérem, hogy csak
pozitív számot adjon meg 1 és 1000000000 között!");
szamString = scanner.nextLine();
szam = Integer.parseInt(szamString);
}
int szam2 = szam;
do{
szam /= 10;
szamjegy++;
}while(szam != 0);
System.out.println ("A bevitt szám (" + szam2 + ") " +
szamjegy + " számjegyű.");
}
}
Végeredmény:
Kérem, hogy adja meg a vizsgálni kívánt számot (1 és
1000000000 között)!
1234567
A bevitt szám (1234567) 7 számjegyű.