| これまで (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'); }
// 以下略
}
}