阿里笔试7.20

## 第一题
n 由三个互不相等的数相而得,这三个数两两的最大公约数是k,1 <= k <= n <= 10^18。
输入:T组数据,每行给定n和k。
输出:是否存在这样三个数,存在则输出任意一组答案(n = x + y +z),不存在则输出-1。

## 第二题 - 计算幸运数个数
给定一个正整数,计算相邻数之差的绝对值,最后计算得出一位数,为7则是幸运数。
例如: 219,  |2 - 1| = 1, |1 - 9| = 8,  1 和 8 组合成 18, 然后继续计算, | 1 - 8 | = 7,所以219是幸运数。
218,  |2 - 1| = 1, |1 - 8| = 7,  1 和 8 组合成 17, 然后继续计算, | 1 - 7 | = 6,所以219不是幸运数。
输入: T组数据,每行输入L 和 R   (1  <= L <= R <= 10^9)。
输出 : 计算区间内的幸运数个数。
样例输入 :
3
1 10
1 1000
1 100000
样例输出:
1
28
498

我只做出了第一题
import java.util.*;

public class Main {

    static long gcd(long a, long b) {
        return b == 0 ?  a : gcd(b, a % b);
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int t = scanner.nextInt();
        while (t-- > 0) {
            long n = scanner.nextLong();
            long k = scanner.nextLong();
            boolean flag = false;
            if ( n % k != 0) {
                System.out.println(-1);
                continue;
            }
            long p = n / k;

            for (long x = 1; x <= p - 3 && !flag; x++) {
                for (long y = x + 1; y < p - x && !flag; y++) {
                    long z =  (p - x - y);
                    if (z != x && z != y) {
                        long temp1 = gcd(z, x);
                        if (temp1 != 1 ) continue;
                        long temp2 = gcd(z, y);
                        if (temp2 != 1 ) continue;
                        long temp3 = gcd(x, y);
                        if (temp3 != 1 ) continue;
                        System.out.println(x* k+ " " + y * k + " " + z * k);
                        flag = true;
                    }
                }
            }
            if (!flag) System.out.println(-1);
        }
        scanner.close();
    }
}

#笔试题目##内推##阿里巴巴#
全部评论
为什么我在自己电脑上可以通过运行并得到结果,但是在这个网站上就不能算出想要的结果
1
送花
回复
分享
发布于 2020-07-22 11:17
M一下
点赞
送花
回复
分享
发布于 2020-07-20 23:56
秋招专场
校招火热招聘中
官网直投
老哥第一题思路是啥
点赞
送花
回复
分享
发布于 2020-07-21 09:21
阿里提前批开始了吗
点赞
送花
回复
分享
发布于 2020-07-21 10:01
阿里笔试是不是只能用c,c++,或者Java等常见语言,我想问问matlab能不能用?
点赞
送花
回复
分享
发布于 2020-07-23 18:11
楼主第一个题代码能AC吗,我跟这个差不多,但是只过了30%
点赞
送花
回复
分享
发布于 2020-07-23 19:43
我的程序在自己电脑的VS测的是正常的,但是考试的环境测试只有10%,看了楼主程序发现我应该是变量的类型定义错了,我把n、k都定义成int型了。
点赞
送花
回复
分享
发布于 2020-07-24 19:47
第一题,等式两边同乘以最大公约数之后,设三个不相同的数之后最小的数为x,其取值范围为[0,「n/(3*k)],在此范围内循环,内循环开始先确定y={a*x + b}, a为大于1的自然数,b为小于x的自然数,且y的值满足大于x且z大于y且x+y+z = n/k,然后判断y与z是否互质。这个算法利用先验条件避免了三个数字相同但是顺序不同的情况,因为x,y,z是对称的。 第二题,利用逆推的思想,本题纯用数学推导,无任何编程思想。7由(8,1)(2,9),(7,0)(不分前后顺序,即pair(1,8)包括81和18)得到,得到两位数中所有的幸运数字,再根据两位数中的幸运数字逆推出三位数中的幸运数字,比如18,要想得到8必须要有8或者9(for i in [8,9]),8或9可能来自高位可能来自低位(for j in [0, 1])。例如,三位数经过计算相邻数之差的绝对值之后要得到18 ,则个位数或者十位数必须是8或者9才能得到(因为经过邻数之差的绝对值计算之后值总是非严格单调递减的),例如个位是9,则十位必须是1才能得到8,相应的百位必须是2才能得到1,得到一个三位幸运数219。最后得到10^N内所有的幸运数字数组,根据区间最小值确定数量,时间复杂度为O(N),N为区间最大值的最高位数。
点赞
送花
回复
分享
发布于 2020-08-03 23:59

相关推荐

5 23 评论
分享
牛客网
牛客企业服务