天天看點

牛客網筆試題3道超級素數幂平衡數字元串分類

超級素數幂

如果一個數字能表示為p^q(^表示幂運算)且p為一個素數,q為大于1的正整數就稱這個數叫做超級素數幂。現在給出一個正整數n,如果n是一個超級素數幂需要找出對應的p,q。

思路

直接進行循環開方運算;如果x恰好可以滿足開方和乘方運算即可;

代碼

public class IsSuperPrime {
    public  static  void  main(String []arg)
    {
        Scanner scanner = new Scanner(System.in);
        long  number= scanner.nextLong();
        boolean IsSuperPrime = false;

        long datamax = (long)Math.pow(,);
        if ((number>=)&&(number<=datamax))
        {
            int q = ;
            double p;
            do {
                p = (int) (Math.pow(number,(/q))+);
                if (number == Math.pow(p,q))
                {
                    IsSuperPrime = isPrime(p);
                    if (IsSuperPrime)
                    {
                        System.out.println((int)p+" "+(int)q);
                        break;
                    }
                }
                q++;
            }while (p>=);
            if (!IsSuperPrime)
            {
                System.out.println("No");
            }
            else
            {

            }
        }
    }
    public  static  boolean isPrime(double i)
    {
        boolean isPrime = true;
        for (int k = ; k <=Math.sqrt(i);k++)
        {
            if (i%k==)
            {
                isPrime = false;
                break;
            }
        }
        return  isPrime;
    }
}
           

難點

  1. double類型是不穩定的,常會出現3!=3,3=2.99999999;是以的話一定要注意double類型,我們可以主動四舍五入,就想上面加了0.5一樣;
  2. 開方運算其實很少見,難以想到;
  3. 質數的驗證 ,從2到sqrt(自己);如果有任意整除,就不是質數

平衡數

牛牛在研究他自己獨創的平衡數,平衡數的定義是:将一個數分成左右兩部分,分别成為兩個新的數。

左右部分必須滿足以下兩點:

1,左邊和右邊至少存在一位。

2,左邊的數每一位相乘如果等于右邊的數每一位相乘,則這個數稱為平衡數。

例如:1221這個數,分成12和21的話,1*2=2*1,則稱1221為平衡數,再例如:1236這個數,可以分成123和1*2*3=6,是以1236也是平衡數。而1234無論怎樣分也不滿足平衡數。

思路

簡單想想我們需要把數字拆分為單個的,是以就把他拆成char[]數組,這樣就每一位都是一個數;然後在進行左右各自乘機的運算;

public class First {
    public  static  void  main(String []arg)
    {
        boolean a;
        Scanner in = new Scanner(System.in);
        while (in.hasNextInt()) {
            a=solution(in.nextInt());
            if (a)
                System.out.println("YES");
            else
                System.out.println("NO");
        }
    }
    static public boolean  solution(int a)
    {
        boolean result=false;
        if (a<)
            return  false;
        int digit = (int) Math.log10(a);             //位數
        Integer a1 = a;                              //對象化a
        char []c = a1.toString().toCharArray();      //char[]數組化

        /*
        從左邊取j位數,右邊取剩下的,
        然後作比較
         */
        for (int j=;j<digit;j++) {
            int x = ;
            for (int i = ; i <=j; i++) {       //計算左邊部分的乘積,位數越高,char[]位置就越低
                x *= (c[i] - );
            }

            int y = ;
            for (int i = digit; i > j; i--) {   //計算右邊部分的乘積
                y *= (c[i] - );
            }
            if (x == y) {                       //相等的話,說明有這麼一種情況左右相等了;
                result = true;
                break;
            }
        }
        return result;
    }
}
           

難點

  1. 這道題我做題的時候就做出來了,是以不太難,主要是得想到把數字轉換成char[];

字元串分類

牛牛有N個字元串,他想将這些字元串分類,他認為兩個字元串A和B屬于同一類需要滿足以下條件:

A中交換任意位置的兩個字元,最終可以得到B,交換的次數不限。比如:abc與bca就是同一類字元串。

現在牛牛想知道這N個字元串可以分成幾類。

思路

看到題,我的第一反應是每個字元的個數相等,然後就開始各種寫;超級麻煩;因為我不知道char[]數組是可以排序的 sort方法可以将其排序;我也不知道Hashset可以檢測重複(隻是沒用過而已);

代碼

public class Two1 {
    public  static  void  main(String [] arg)
    {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        HashSet<String> set = new HashSet<String>();
        while (n!=)
        {
            char[] array = scanner.next().toCharArray();
            Arrays.sort(array);
            set.add(String.valueOf(array));
            n--;
        }
        System.out.println(set.size());
    }
}
           

難點

  1. char[]有排序方法;
  2. Hashset由于不可放入重複元素,是以通過他的長度就可以知道有幾個不一樣的啦;