/* * Takes two savestates and creates a patch that turns 'src' into 'dst'. * Both 'src' and 'dst' must be returned from state_manager_raw_alloc(), * with the same 'len', and different 'uniq'. * * 'patch' must be size 'state_manager_raw_maxsize(len)' or more. * Returns the number of bytes actually written to 'patch'. */ static size_t state_manager_raw_compress(const void *src, const void *dst, size_t len, void *patch) { const uint16_t *old16 = (const uint16_t*)src; const uint16_t *new16 = (const uint16_t*)dst; uint16_t *compressed16 = (uint16_t*)patch; size_t num16s = (len + sizeof(uint16_t) - 1) / sizeof(uint16_t); while (num16s) { size_t i, changed; size_t skip = find_change(old16, new16); if (skip >= num16s) break; old16 += skip; new16 += skip; num16s -= skip; if (skip > UINT16_MAX) { if (skip > UINT32_MAX) { /* This will make it scan the entire thing again, * but it only hits on 8GB unchanged data anyways, * and if you're doing that, you've got bigger problems. */ skip = UINT32_MAX; } *compressed16++ = 0; *compressed16++ = skip; *compressed16++ = skip >> 16; continue; } changed = find_same(old16, new16); if (changed > UINT16_MAX) changed = UINT16_MAX; *compressed16++ = changed; *compressed16++ = skip; for (i = 0; i < changed; i++) compressed16[i] = old16[i]; old16 += changed; new16 += changed; num16s -= changed; compressed16 += changed; } compressed16[0] = 0; compressed16[1] = 0; compressed16[2] = 0; return (uint8_t*)(compressed16+3) - (uint8_t*)patch; }
int main() { long array[100]; long n, j; long num, tmp_i, tmp; scanf("%ld", &n); for (j = 0; j < 100; j++) { if (j == 0) tmp_i = n; else tmp_i = array[j - 1]; num = 0; while (tmp_i > 0) { tmp = tmp_i % 10; num += tmp * tmp; tmp_i /= 10; } array[j] = num; if (num == 1 || find_same(array, num, j) == 1) { break; } } if (array[j] == 1) { printf("%ld\n", j+1); } else { printf("-1\n"); } return 0; }