Calculator Conundrun UVA 11549

    xiaoxiao2021-03-25  99

    题意: 一个老式计算器,只能显示n(1 <= n <= 9)位,  现给定k(0 <= k <= 1E+n),求其平方,若溢出保留前n位,问一直计算下去能得到的最大值;

    分析 :

    题中隐约告诉我们有循环,显然如果出现两个相同的数,这两个之间便是一个循环

    而一个计算器能显示的数是有限的,所以必然会出现相同的数

    #include <iostream> #include <cstdio> using namespace std; int next(int n, int k) { if(!k) return 0; long long sum = (long long)k * (long long)k; int len = 0; int a[100]; while(sum > 0) { a[len++] = sum % 10; sum /= 10; } if(n > len) n = len; int ans = 0; for(int i = 0; i < n; i++) ans = ans * 10 + a[--len]; return ans; } int main() { int T; scanf("%d", &T); while(T--) { int n, k; scanf("%d%d", &n, &k); int k1 = k, k2 = k; int ans = k; do { k1 = next(n, k1); ans = max(ans, k1); k2 = next(n, k2); ans = max(ans, k2); k2 = next(n, k2); ans = max(ans, k2); } while(k1 != k2); printf("%d\n", ans); } return 0; } 这里用到的是Floyd判圈算法

    k1每次走一步,k2每次走两步,若有环,走的快的一定会追上走的慢的

    首先从上面分析知道,最小环上不可能有相同点,

    在环上跑时,不管k1,k2,位置如何,k2总是相对于k1以一步每次的速度追赶k1,所以k2一定会追上k1;

    转载请注明原文地址: https://ju.6miu.com/read-25425.html

    最新回复(0)