zoukankan      html  css  js  c++  java
  • Moduli number system

    A number system with moduli is defined by a vector of k moduli, [m1,m2, ···,mk].

    The moduli must be pairwise co-prime, which means that, for any pair of moduli, the only common factor is 1.

    In such a system each number n is represented by a string "-x1--x2-- ... --xk-" of its residues, one for each modulus. The product m1 ... mk must be greater than the given number n which is to be converted in the moduli number system.

    For example, if we use the system [2, 3, 5] the number n = 11 is represented by "-1--2--1-",
    the number n = 23 by "-1--2--3-". If we use the system [8, 7, 5, 3] the number n = 187 becomes "-3--5--2--1-".

    You will be given a number n (n >= 0) and a system S = [m1,m2, ···,mk] and you will return a string "-x1--x2-- ...--xk-" representing the number n in the system S.

    If the moduli are not pairwise co-prime or if the product m1 ... mk is not greater than n, return "Not applicable".

    Examples:

    fromNb2Str(11 [2,3,5]) -> "-1--2--1-"

    fromNb2Str(6, [2, 3, 4]) -> "Not applicable", since 2 and 4 are not coprime

    fromNb2Str(7, [2, 3]) -> "Not applicable" since 2 * 3 < 7

    fromNb2Str 187 [8,7,5,3] -> "-3--5--2--1-"
    fromNb2Str 6 [2, 3, 4] -> "Not applicable", since 2 and 4 are not coprime
    fromNb2Str 7 [2, 3] -> "Not applicable", since 2 * 3 < 7
    public static class Kata
        {
            public static String fromNb2Str(int n, int[] sys)
            {
                string str = "Not applicable";
                bool flag = CoPrimeArray(sys);
                if (flag)
                {
                    IEnumerable<int> list = sys.Select(x => n % x);
                    int result = sys.Aggregate(1, (sum, y) => sum * y);
                    if (result > n)
                    {
                        str = string.Join(string.Empty, list.Select(x => string.Format("-{0}-", x)));
                    }
                }
                return str;
            }
    
            public static bool CoPrimeArray(int[] array)
            {
                bool coPrime = false;
                int max = array.Max();
                int sqrt = Convert.ToInt32(Math.Floor(Math.Sqrt(max)));
                bool[] tempArray = new bool[max + 1];
                tempArray = tempArray.Select(x => x = true).ToArray();
                int prime = 2;//质数,从最小的开始
                IEnumerable<int> dividePrime = array.Where(x => x % prime == 0);//获取能够被质数整除的数字的集合
                while (true)
                {
                    if (dividePrime.Count() > 1)
                    {
                        //这里的判断涉及到了Linq的延迟加载,随着prime的改变,每一次的dividePrime是不同的
                        break;
                    }
                    //被除数/除数=商
                    for (int i = prime; i <= sqrt; i++)
                    {
                        for (int j = i; j * i < max; j++)
                        {
                            //j*i这个位置的数据可以被i整除
                            if (tempArray[j * i])
                            {
                                tempArray[j * i] = false;
                            }
                        }
                    }
                    while (true)
                    {
                        prime++;
                        if (prime == max)
                        {
                            //除数已经达到最大值,说明数组里面的所有数字互质
                            coPrime = true;
                            break;
                        }
                        else
                        {
                            if (tempArray[prime])
                            {
                                //说明没有被前面prime个数字整除过,
                                //假如prime是3的话,并且符合的话,说明3没有被2整除过
                                //假如prime是7的话,并且符合的话,说明7没有被2到6的数字整除过
                                break;
                            }
                        }
                    }
                    if (coPrime)
                    {
                        break;
                    }
                }
                return coPrime;
            }
        }
  • 相关阅读:
    android AutoCompleteTextView 自定义BaseAdapter
    svg矢量图绘制以及转换为Android可用的VectorDrawable资源
    div 自适应高度 自动填充剩余高度
    Android 禁止Viewpager左右滑动功能
    ant安装、环境变量配置及验证
    创建GitHub技术博客全攻略
    简单的Hibernate入门简介
    Java开发Maven环境配置和介绍
    Android 子activity关闭 向父activity传值
    github for windows 桌面版使用方法
  • 原文地址:https://www.cnblogs.com/chucklu/p/4632788.html
Copyright © 2011-2022 走看看