1. 程式人生 > >飛步A輪筆試題2 等分字串

飛步A輪筆試題2 等分字串

 等分數字串

時間限制:10000ms

單點時限:1000ms

記憶體限制:256MB

描述

給定一個只包含0-9的字串S,請你判斷能否將S劃分為兩個或兩個以上連續的子串,使得每一個子串中的數字總和都相等。

輸入

輸入包含多組資料。

第一行包含一個整數N,代表資料組數。  

以下N行,每行包含一個字串S。  

對於50%的資料,2 ≤ |S| ≤ 100  

對於100%的資料,1 ≤ N ≤ 5, 2 ≤ |S| ≤ 100000

輸出

對於每組資料,輸出一行,內容是YES或者NO,代表是否存在題目要求的劃分方案。

樣例輸入

3  
1248  
2680 
54174760

樣例輸出

NO  
YES
YES

比賽已經結束,去題庫提交。

//   考察點: 二分查詢 判斷質因子
import java.util.Arrays;
//import java.awt.Checkbox;
import java.util.Scanner;

//import org.omg.CORBA.PUBLIC_MEMBER;

//import org.omg.CORBA.PUBLIC_MEMBER;

public class problem2 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner in = new Scanner(System.in);
        int N = Integer.parseInt(in.nextLine());
        
        for(int i = 0; i < N ; i ++)
        {
            System.out.println(Checkbox(in.nextLine().trim()));
        }
        
    }
       public static String Checkbox(String line)
       {
          int length = line.length();
           int [] sums = new int[length];
           int sum =0;
           for(int i = 0; i < length; i ++)
           {
               sum += line.charAt(i)-'0';
               sums[i] = sum;
           }
           for(int n = 2; n <= length; n ++) {
               if(isprime(n) && sum % n == 0)// 可以被平均分配
             {
                   int avg = sum / n;
               int ct =0;
               for(int start = 0 , target = avg ; start < length; ct++ )
               {
                   int index = Arrays.binarySearch(sums, start,length,target);
                   if(index < 0)
                   {
                       break;
                   }
                   start = index + 1;
                   target += avg; 
               }
               if(ct == n)
               {
                   return "YES";
               }
             }      
           }
            return "NO";
               
       }
          public static boolean isprime(int n)
          {
              if(n < 2)
              {
                  return false;
              }
              if(n == 2) {
                  return true;
              }
              for(int i = 2; i <= n; i ++) {
                  if(n % i == 0) {
                      return false;
                  }
              }
              return true;
          }
}