超級素數幂
如果一個數字能表示為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;
}
}
難點
- double類型是不穩定的,常會出現3!=3,3=2.99999999;是以的話一定要注意double類型,我們可以主動四舍五入,就想上面加了0.5一樣;
- 開方運算其實很少見,難以想到;
- 質數的驗證 ,從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;
}
}
難點
- 這道題我做題的時候就做出來了,是以不太難,主要是得想到把數字轉換成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());
}
}
難點
- char[]有排序方法;
- Hashset由于不可放入重複元素,是以通過他的長度就可以知道有幾個不一樣的啦;