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

猜你喜欢

转载自blog.csdn.net/weixin_38970751/article/details/83412381