Comment puis-je supprimer le premier chiffre d'un entier?
Mon entrée est un entier (par exemple i = 123456789).
Je veux ensuite supprimer le premier chiffre, de sorte que je égal 23456789.
Voici une façon de le faire:
String
int
Code:
public static void main(String[] args)
{
int x = 123456789;
String x_str = Integer.toString(x);
int new_x = Integer.parseInt(x_str.substring(1));
System.out.println(new_x);
}
Sortie:
23456789
Remarque: Ceci peut être effectué sur une seule ligne avec
int x = 123456789;
int new_x = Integer.parseInt(Integer.toString(x).substring(1));
Modifier:
Pour gérer les cas négatifs, vérifiez si nombre est positif ou entier:
int new_x = Integer.parseInt(x > 0 ?
Integer.toString(x).substring(1) : Integer.toString(x).substring(2));
essaye ça
n = n % (int) Math.pow(10, (int) Math.log10(n));
Si vous voulez éviter la conversion de chaîne, vous pouvez trouver le chiffre le plus élevé et le soustraire.
public static void main(String[] args) {
int x = 123456789;
System.out.println("x = " + x);
int hi = x, n = 0;
while (hi > 9) {
hi /= 10;
++n;
}
for (int i = 0; i < n; i++) hi *= 10;
x -= hi;
System.out.println("x with high digit removed = " + x);
}
Approche alternative:
int stripLeading(int i) {
if(i > 0) {
return i - (int)Math.pow(10, (int)Math.log10(i));
} else if(i > 0) {
return i + (int)Math.pow(10, (int)Math.log(-i+1));
} else {
return 0;
}
}
Je pense me souvenir de la version sans cordes de cette… bien que je sois totalement d'accord avec @Christian quant à la façon dont je le ferais…
NOTE: comme @Darren Gilroy l'a souligné, il faut considérer les négatifs et les zéros spocialement, ce que ma fonction ne permet pas de faire.
Bien sûr, %
est une meilleure solution également.
public static void main (String [] argv)
{
final int x = 123456789;
int newX = x;
/* How many digits are there? */
final double originalLog = Math.floor (Math.log10 (x));
/* Let's subtract 10 to that power until the number is smaller */
final int getRidOf = (int)Math.pow (10, originalLog);
while (originalLog == Math.floor (Math.log10 (newX)))
{ newX -= getRidOf; }
System.out.println (newX);
}
Mauvaise tentative de profilage:
Boucler la fonction ci-dessus sans la println
pour 20 000 000 000 répétitions dans une boucle for
:
real 0m9.943s
user 0m9.890s
sys 0m0.028s
De même avec la version beaucoup plus facile à comprendre et parfaitement fonctionnelle de Christian, mais pour seulement 200 000 000 de répétitions (parce que je suis paresseux et fatigué d'attendre):
real 0m18.581s
user 0m17.972s
sys 0m0.574s
On pourrait donc soutenir que la construction des objets String le ralentit probablement d'environ 200 ×, mais il ne s'agit pas d'une configuration de profilage vraiment précise.
Voici la solution purement numérique en une ligne:
i %= (int) Math.pow(10, (int) Math.log10(i));
Si vous souhaitez utiliser des méthodes plus simples sans utiliser String
, voici ma conclusion simple:
int
par 10^n
. n
est le nombre de chiffres.Par exemple
int i = 123456789;
int n = getDigitCount(i);
int r = Math.abs(i / (int)Math.pow(10,n)); //r stores result.
Et vous auriez besoin de cette méthode:
int getDigitCount(int num)
{
int c = 0;
while(num > 0){
num/=10;
c++;
}
return c;
}