• 5-Java-C(位平方和)


    题目描述:

    把一个整数的每个数位都平方后求和,又得到一个整数,我们称这个整数为:位平方和。

    对新得到的整数仍然可以继续这一运算过程。

    比如,给定整数为4,则一系列的运算结果为:

    16,37,58,89,....

    本题的要求是,已知一个整数x,求第n步的运算结果。

    数据格式要求:

    输入,两个整数x n,中间以空格分开。表示求x的第n步位平方和。其中,x,n都大于0,且小于100000。
    输出,一个整数,表示所求结果。

    例如,
    输入:
    4 3
    则程序应该输出:
    58

    再例如,
    输入:
    1314 10
    则程序应该输出:
    20

    资源约定:
    峰值内存消耗(含虚拟机) < 256M
    CPU消耗  < 1000ms


    请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

    所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
    注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
    注意:主类的名字必须是:Main,否则按无效代码处理。

    正确算法:

    这道题目其实就是第七届蓝桥杯中的平方怪圈,所以这道题有个规律-->不管开始取的是什么数字,最终如果不是落入1,就是落入同一个循环圈。

    这道题目如果用普通方法写,似乎不会超时。我这里写了一个优化的方法。

    import java.util.Scanner;
    
    public class Main {
        /**
         * 优化
         */
        public static void f(int x, int n) {
            //循环圈
            int arr[] = { 37, 58, 89, 145, 42, 20, 4, 16 };
            while (n-- > 0) {
                if (x == 1) {
                    System.out.println(1);
                    return;
                }
                if (x == 37) {
                    int index = (n + 1) % 8;
                    System.out.println(index);
                    System.out.println(arr[index]);
                    return;
                }
                int sum = 0;
                while (x != 0) {
                    sum += Math.pow(x % 10, 2);
                    x /= 10;
                }
                x = sum;
    
            }
            //如果在第n步时还没有找到循环圈,那么就会到达这里
            System.out.println(x);
        }
    
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            while (input.hasNext()) {
                int x = input.nextInt();
                int n = input.nextInt();
                int tmp = x;
                for (int i = 0; i < n; i++) {
                    int sum = 0;
                    while (x != 0) {
                        sum += Math.pow(x % 10, 2);
                        x /= 10;
                    }
                    x = sum;
                                System.out.println("x="+x);
                }
                System.out.println(x);
                //测试两种方法得到的答案是否一样
                System.out.println("----");
                f(tmp, n);
            }
        }
    }


  • 相关阅读:
    Centos 设置默认路由得优先级
    openstack-NUMA排错记录
    openstack -新建project
    As3 常用日期工具
    As3 计算两个日期之间的天数差
    解决Asp.net Mvc返回JsonResult中DateTime类型数据格式的问题
    网盘+SVN
    SQL 并发-转
    工作目录
    Cookie
  • 原文地址:https://www.cnblogs.com/syjp/p/10360520.html
Copyright © 2020-2023  润新知