1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | #include <iostream> #include <limits.h> #include <memory.h> const int GROUPING = 4; //1-4 (4 is the fastest but the lookup table takes 40kB) const int BUFFER_SIZE = 16; const int DIVISOR = 10*(GROUPING>1?10:1)*(GROUPING>2?10:1)*(GROUPING>3?10:1); char digits[DIVISOR*GROUPING]; void init_digits() { char* p = digits; for(int i=0; i<DIVISOR; i++) { int tmp = i; for(int i2=GROUPING-1; i2>=0; i2--) { *(p+i2) = '0'+tmp%10; tmp /= 10; } p += GROUPING; } } int fooinit = (init_digits(),0); std::string itostr(int val) { char buf[BUFFER_SIZE]; char *it = &buf[BUFFER_SIZE-GROUPING]; if(val>=0) { int div = val/DIVISOR; while(div) { memcpy(it, &digits[GROUPING*(val-div*DIVISOR)], GROUPING); val = div; it -= GROUPING; div = val/DIVISOR; } memcpy(it, &digits[GROUPING*val], GROUPING); if(GROUPING==4) { if(val<1000) { it++; if(val<100) { it++; if(val<10) it++; } } } else if(GROUPING==3) { if(val<100) { it++; if(val<10) it++; }} else if(GROUPING==2) { if(val<10) it++; } } else { int div = val/DIVISOR; while(div) { memcpy(it, &digits[-GROUPING*(val-div*DIVISOR)], GROUPING); val = div; it -= GROUPING; div = val/DIVISOR; } memcpy(it, &digits[-GROUPING*val], GROUPING); if(GROUPING==4) { if(val>-1000) { it++; if(val>-100) it++; } } else if(GROUPING==3) { if(val>-100) it++; } else if(GROUPING==2) { } if(GROUPING==1 || val<=-10) it--; *it = '-'; } return std::string(it,&buf[BUFFER_SIZE]-it); } std::string itostr(unsigned int val) { char buf[BUFFER_SIZE]; char *it = &buf[BUFFER_SIZE-GROUPING]; int div = val/DIVISOR; while(div) { memcpy(it, &digits[GROUPING*(val-div*DIVISOR)], GROUPING); val = div; it -= GROUPING; div = val/DIVISOR; } memcpy(it, &digits[GROUPING*val], GROUPING); if(GROUPING==4) { if(val<1000) { it++; if(val<100) { it++; if(val<10) it++; } } } else if(GROUPING==3) { if(val<100) { it++; if(val<10) it++; }} else if(GROUPING==2) { if(val<10) it++; } return std::string(it,&buf[BUFFER_SIZE]-it); } int main(void) { int i = 0; i += itostr(INT_MIN).size(); i += itostr(INT_MAX).size(); i += itostr(unsigned(INT_MAX) + 1U).size(); i += itostr(unsigned(~0)).size(); char c = CHAR_MIN; do { i += itostr(c).size(); i += itostr((11111111 * c)).size(); if (c >= CHAR_MAX) break; c++; } while (1); while (i < 100000000) i += itostr(i).size(); std::cout << i << std::endl; return i; } |
CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGxpbWl0cy5oPgojaW5jbHVkZSA8bWVtb3J5Lmg+CgoKY29uc3QgaW50IEdST1VQSU5HID0gNDsgLy8xLTQgKDQgaXMgdGhlIGZhc3Rlc3QgYnV0IHRoZSBsb29rdXAgdGFibGUgdGFrZXMgNDBrQikKY29uc3QgaW50IEJVRkZFUl9TSVpFID0gMTY7CmNvbnN0IGludCBESVZJU09SID0gMTAqKEdST1VQSU5HPjE/MTA6MSkqKEdST1VQSU5HPjI/MTA6MSkqKEdST1VQSU5HPjM/MTA6MSk7CgpjaGFyIGRpZ2l0c1tESVZJU09SKkdST1VQSU5HXTsKdm9pZCBpbml0X2RpZ2l0cygpCnsKCWNoYXIqIHAgPSBkaWdpdHM7Cglmb3IoaW50IGk9MDsgaTxESVZJU09SOyBpKyspIHsKCQlpbnQgdG1wID0gaTsKCQlmb3IoaW50IGkyPUdST1VQSU5HLTE7IGkyPj0wOyBpMi0tKSB7CgkJCSoocCtpMikgPSAnMCcrdG1wJTEwOwoJCQl0bXAgLz0gMTA7CgkJfQoJCXAgKz0gR1JPVVBJTkc7Cgl9Cn0KaW50IGZvb2luaXQgPSAoaW5pdF9kaWdpdHMoKSwwKTsKCnN0ZDo6c3RyaW5nIGl0b3N0cihpbnQgdmFsKQp7CgljaGFyIGJ1ZltCVUZGRVJfU0laRV07CgljaGFyICppdCA9ICZidWZbQlVGRkVSX1NJWkUtR1JPVVBJTkddOwoKCWlmKHZhbD49MCkgewoJCWludCBkaXYgPSB2YWwvRElWSVNPUjsKCQl3aGlsZShkaXYpIHsKCQkJbWVtY3B5KGl0LCAmZGlnaXRzW0dST1VQSU5HKih2YWwtZGl2KkRJVklTT1IpXSwgR1JPVVBJTkcpOwoJCQl2YWwgPSBkaXY7CgkJCWl0IC09IEdST1VQSU5HOwoJCQlkaXYgPSB2YWwvRElWSVNPUjsKCQl9CgkJbWVtY3B5KGl0LCAmZGlnaXRzW0dST1VQSU5HKnZhbF0sIEdST1VQSU5HKTsKCgkJaWYoR1JPVVBJTkc9PTQpCgkJCXsgaWYodmFsPDEwMDApIHsgaXQrKzsgaWYodmFsPDEwMCkgeyBpdCsrOyBpZih2YWw8MTApIGl0Kys7CX0gfSB9CgkJZWxzZSBpZihHUk9VUElORz09MykKCQkJeyBpZih2YWw8MTAwKSB7IGl0Kys7IGlmKHZhbDwxMCkgaXQrKzsJfX0KCQllbHNlIGlmKEdST1VQSU5HPT0yKQoJCQl7IGlmKHZhbDwxMCkgaXQrKzsgfQoKCX0gZWxzZSB7CgkJaW50IGRpdiA9IHZhbC9ESVZJU09SOwoJCXdoaWxlKGRpdikgewoJCQltZW1jcHkoaXQsICZkaWdpdHNbLUdST1VQSU5HKih2YWwtZGl2KkRJVklTT1IpXSwgR1JPVVBJTkcpOwoJCQl2YWwgPSBkaXY7CgkJCWl0IC09IEdST1VQSU5HOwoJCQlkaXYgPSB2YWwvRElWSVNPUjsKCQl9CgkJbWVtY3B5KGl0LCAmZGlnaXRzWy1HUk9VUElORyp2YWxdLCBHUk9VUElORyk7CgoJCWlmKEdST1VQSU5HPT00KQoJCQl7IGlmKHZhbD4tMTAwMCkgeyBpdCsrOyBpZih2YWw+LTEwMCkgaXQrKzsgfSB9CgkJZWxzZSBpZihHUk9VUElORz09MykKCQkJeyBpZih2YWw+LTEwMCkgaXQrKzsgfQoJCWVsc2UgaWYoR1JPVVBJTkc9PTIpCgkJCXsgfQoKCQlpZihHUk9VUElORz09MSB8fCB2YWw8PS0xMCkKCQkJaXQtLTsKCgkJKml0ID0gJy0nOwoJfQoKCXJldHVybiBzdGQ6OnN0cmluZyhpdCwmYnVmW0JVRkZFUl9TSVpFXS1pdCk7Cn0KIApzdGQ6OnN0cmluZyBpdG9zdHIodW5zaWduZWQgaW50IHZhbCkKewoJY2hhciBidWZbQlVGRkVSX1NJWkVdOwoJY2hhciAqaXQgPSAmYnVmW0JVRkZFUl9TSVpFLUdST1VQSU5HXTsKCglpbnQgZGl2ID0gdmFsL0RJVklTT1I7Cgl3aGlsZShkaXYpIHsKCQltZW1jcHkoaXQsICZkaWdpdHNbR1JPVVBJTkcqKHZhbC1kaXYqRElWSVNPUildLCBHUk9VUElORyk7CgkJdmFsID0gZGl2OwoJCWl0IC09IEdST1VQSU5HOwoJCWRpdiA9IHZhbC9ESVZJU09SOwoJfQoJbWVtY3B5KGl0LCAmZGlnaXRzW0dST1VQSU5HKnZhbF0sIEdST1VQSU5HKTsKCglpZihHUk9VUElORz09NCkKCQl7IGlmKHZhbDwxMDAwKSB7IGl0Kys7IGlmKHZhbDwxMDApIHsgaXQrKzsgaWYodmFsPDEwKSBpdCsrOwl9IH0gfQoJZWxzZSBpZihHUk9VUElORz09MykKCQl7IGlmKHZhbDwxMDApIHsgaXQrKzsgaWYodmFsPDEwKSBpdCsrOwl9fQoJZWxzZSBpZihHUk9VUElORz09MikKCQl7IGlmKHZhbDwxMCkgaXQrKzsgfQoKCXJldHVybiBzdGQ6OnN0cmluZyhpdCwmYnVmW0JVRkZFUl9TSVpFXS1pdCk7Cn0KCiAKaW50IG1haW4odm9pZCkKewogICAgaW50IGkgPSAwOwogICAgaSArPSBpdG9zdHIoSU5UX01JTikuc2l6ZSgpOwogICAgaSArPSBpdG9zdHIoSU5UX01BWCkuc2l6ZSgpOwogCiAgICBpICs9IGl0b3N0cih1bnNpZ25lZChJTlRfTUFYKSArIDFVKS5zaXplKCk7CiAgICBpICs9IGl0b3N0cih1bnNpZ25lZCh+MCkpLnNpemUoKTsgCiAKICAgIGNoYXIgYyA9IENIQVJfTUlOOwogICAgZG8gewogICAgICAgIGkgKz0gaXRvc3RyKGMpLnNpemUoKTsKICAgICAgICAgICAgICAgIGkgKz0gaXRvc3RyKCgxMTExMTExMSAqIGMpKS5zaXplKCk7CiAKICAgICAgICAgICAgICAgIGlmIChjID49IENIQVJfTUFYKSBicmVhazsKIAogICAgICAgIGMrKzsKICAgIH0gd2hpbGUgKDEpOwogCiAgICB3aGlsZSAoaSA8IDEwMDAwMDAwMCkKICAgICAgICBpICs9IGl0b3N0cihpKS5zaXplKCk7CiAKICAgIHN0ZDo6Y291dCA8PCBpIDw8IHN0ZDo6ZW5kbDsKIAogICAgcmV0dXJuIGk7Cn0KCgoK
-
upload with new input
-
result: Success time: 1.66s memory: 2896 kB returned value: 5
100000005


