飛步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;
}
}