ゾロ目って、すべての桁が同じ数字ってことですよね? 10で割り続けながら1の位を調べる、というのを考えたんですが LASTNUM=N MOD 10 N=N DIV 10 ZORO=1 WHILE N>0 IF LASTNUM!=N MOD 10 THEN ZORO=0:BREAK N=N DIV 10 WEND
DEF ZOROME(N%) IF N%<0 THEN RETURN 0 '←負数を除外 VAR M$=STR$(N%),P=LEN(M$),A$=LEFT$(M$,1),I IF P<2 THEN RETURN 0 '←1桁の数字なら除外 FOR I=1 TO P-1 IF A$!=MID$(M$,I,1) THEN BREAK NEXT RETURN I>P-1 END
KETA=LEN(FORMAT$("%D",N)) IF N MOD VAL("1"*KETA)==0 THEN RSLT=1 ELSE RSLT=0
対数時間とか使ってないけど(対数時間とは?)
ツララ2020/3/7 13:39◆ArUdBYOYME1V
ああ、そうか ゾロ目ってことは桁数が揃っていれば1が連続した数の倍数だから
DEF ZOROME(N) VAR P IF N<=0||INSTR(STR$(N),”.”)>=0 THEN RETURN 0 P=LOG(N,10) IF P<1 THEN RETURN 0 ELSE P=(P OR 0)+1 RETURN INSTR(STR$(N/VAL(“1”*P)),”.”)<0 END
IF N<100 THEN RETURN !(N MOD 11) '11で割り切れたら1 IF N<1000 THEN RETURN !(N MOD 111) IF N<10000 THEN RETURN !(N MOD 1111) ... というのは? IF判定最大8回+MODの計算1回で済みそうですがどうでしょうか
(←対数時間っていうのがNの桁数の対数を指してるということにやっと気づいた人) じゃあ桁数を二分探索で求めたらどうでしょう。 IF N<=1E5 THEN IF N<=1E3 THEN IF N<=1E2 THEN RETURN !(N MOD 11) ELSE RETURN !(N MOD 111) ELSE IF N<=1E4 THEN RETURN !(N MOD 1111) ELSE RETURN !(N MOD 11111) ENDIF ELSE IF N<=1E7 THEN IF N<=1E6 THEN RETURN !(N MOD 111111) ELSE RETURN !(N MOD 1111111) ELSE IF N<=1E8 THEN RETURN !(N MOD 11111111) ELSE IF N<=1E9 THEN RETURN !(N MOD 111111111) RETURN !(N MOD 1111111111) ENDIF ENDIF 最大IF4回+MOD1回です