等分数字串
时间限制: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;
}
}