これまで (state) | 今の桁 | 新たな状態 (nstate) | 具体例 |
未満 | 未満 | 未満 | ??012 |
未満 | 同じ | 未満 | ??412 |
未満 | 超過 | 超過 | ??712 |
同じ | 未満 | 未満 | ??015 |
同じ | 同じ | 同じ | ??415 |
同じ | 超過 | 超過 | ??715 |
超過 | 未満 | 未満 | ??099 |
超過 | 同じ | 超過 | ??499 |
超過 | 超過 | 超過 | ??799 |
int cmp(int x, int y) { if(x < y) { return 0; } if(x == y) { return 1; } return 2; } // 中略 for(int state=0; state<3; ++state) { // これまでの状態 // 略 for(int d=0; d<10; ++d) { // 今の桁(十進のとき) int nstate = cmp(d, s[i]-'0'); if(nstate == 1) { nstate = state; } // 以下略 } }
for(int over=0; over<2; ++over) { // これまでの状態 // 略 for(int d=0; d<10; ++d) { // 今の桁(十進のとき) int nover = d > s[i]-'0'; if(d == s[i]-'0') { nover = over; } // 以下略 } }
(これまでの余り * 10 + 今の桁の数字) % 7を新たな余りの状態にします。
(これまでの余り + p10 * 今の桁の数字) % 7で新たな余りを計算できます。
これまで (state) | 今の桁 | 新たな状態 (nstate) | 具体例 |
未満 | 未満 | 未満 | ??012 |
未満 | 同じ | 未満 | ??412 |
未満 | 超過 | 超過 | ??712 |
同じ | 未満 | 未満 | ??015 |
同じ | 同じ | 同じ | ??415 |
同じ | 超過 | 超過 | ??715 |
超過 | 未満 | 未満 | ??099 |
超過 | 同じ | 超過 | ??499 |
超過 | 超過 | 超過 | ??799 |
int cmp(int x, int y) { if(x < y) { return 0; } if(x == y) { return 1; } return 2; } // 中略 for(int state=0; state<3; ++state) { // これまでの状態 // 略 for(int d=0; d<10; ++d) { // 今の桁(十進のとき) int nstate = cmp(d, s[i]-'0'); if(nstate == 1) { nstate = state; } // 以下略 } }
これまで (state) | 今の桁 | 新たな状態 (nstate) | 具体例 |
未満 | 未満 | 未満 | 120?? |
未満 | 同じ | 未満 | 124?? |
未満 | 超過 | 未満 | 127?? |
同じ | 未満 | 未満 | 310?? |
同じ | 同じ | 同じ | 314?? |
同じ | 超過 | 超過 | 317?? |
超過 | 未満 | 超過 | 990?? |
超過 | 同じ | 超過 | 994?? |
超過 | 超過 | 超過 | 997?? |
int cmp(int x, int y) { if(x < y) { return 0; } if(x == y) { return 1; } return 2; } // 中略 for(int state=0; state<3; ++state) { // これまでの状態 // 略 for(int d=0; d<10; ++d) { // 今の桁(十進のとき) int nstate = state; if(nstate == 1) { nstate = cmp(d, s[i]-'0'); } // 以下略 } }