Java でループを作成し、数学的に変数 (たとえば 100 万) を取り、以下のプログラムと表に示す手順でそれを減らしたいと考えています。
package com.sbs.test.maths;
import org.testng.annotations.Test;
public class Maths {
@Test
public void test() {
int i = 1000000;
System.out.println( i );
while( i > 1 ) {
i = reduce( i );
System.out.println( i );
}
}
private int reduce( int value ) {
if ( value > 1 && value <= 10 ) value -= 1;
else if ( value > 10 && value <= 100 ) value -= 10;
else if ( value > 100 && value <= 1000 ) value -= 100;
else if ( value > 1000 && value <= 10000 ) value -= 1000;
else if ( value > 10000 && value <= 100000 ) value -= 10000;
else if ( value > 100000 && value <= 1000000 ) value -= 100000;
else if ( value > 1000000 && value <= 10000000 ) value -= 1000000;
else if ( value > 10000000 && value <= 100000000 ) value -= 10000000;
return value;
}
}
すなわち
value reduce-by result
1000000 - 100000 = 900000
900000 - 100000 = 800000
...
200000 - 100000 = 100000
100000 - 10000 = 90000
90000 - 10000 = 80000
...
20000 - 10000 = 10000
10000 - 1000 = 9000
9000 - 1000 = 8000
...
2000 - 1000 = 1000
1000 - 100 = 900
900 - 100 = 800
...
200 - 100 = 100
100 - 10 = 90
90 - 10 = 80
これは、数値が 100、1000、10000、100000 以上かどうかを検出するための厄介な if カスケードなしで実行できますか?
Java でほぼ動作するようになったJavaScript の例を見つけましたが、すべてのバリエーションで動作するわけではありませんでした。以下のプログラムを実行しましたが、ご覧のとおり、リダクションの最後にゼロを失う必要があるポイントでスタックします。
System.out.println( "----------------------------------------------" );
for ( int i = 1000000; i > 0; i -= (int) Math.pow( 10, Math.floor( Math.log( i ) / Math.log(10) ) ) ) {
System.out.println( i );
}
出力:
1000000
900000
800000
700000
600000
500000
400000
300000
200000
100000
残念ながら、数学は私の得意分野ではないので、これに関する助けは大歓迎です。
ありがとう!