求助
#include <iostream>
#include <cstring>
using namespace std;
double n,sum;
int factorization[100] = {0};
int a[100] = {0};
int b[100] = {0};
int ans = 0;
int index1 = 0;
int tmp1 = -1;
bool flag = false;
int temp = 0;
int testfact(int dat);
int findnear(int dat,int num);
int Factorization(int num)
{
index1 = 0;
for(int i=2;i<=num;i++){
if(num % i == 0){
factorization[index1] = i;
index1++;
}
}
return 0;
}
int sort(int arr[],int len)
{
for(int i=len-1;i>0;i--){
for(int j=0;j<len-1;j++){
if(arr[j] < arr[j+1]){
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
return 0;
}
int main()
{
//1.输入数据
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
//2.木棍总长
for(int i=0;i<n;i++){//9 5 2 1 5 2 1 5 2 1
sum += a[i];
}
//3.因式分解
Factorization(sum);
//4.小木棍排序
sort(a,n);
//5.开始试验
for(int i = 0;i<index1;i++){
if(testfact(factorization[i])==1){
cout<<factorization[i];
return 0;
}
}
return 0;
}
int testfact(int dat){
int tmp,neardat,target;
tmp = n;
target = dat;
//把a复制到b里
for(int i=0;i<n;i++)
b[i]=a[i];
while(tmp>0) {
neardat=findnear(target,tmp);
if(neardat == -1){ //无法拼凑了,就说明这个数不行,返回0
return 0;
}
else if(neardat==target){ //一根根子拼完了,拼下一根
target = dat;
tmp--;
}
else{
target = target - neardat;
tmp--;
}
}
return 1; //所有的棍子都用完了
}
//二分法找最接近的数
int findnear(int dat,int num){
int low,high,tmp,mid;
low = 0;
high = num-1;
if(b[high]>dat) //如果最小的数都比dat大,就没法比下去了
return -1;
while(low < high){
mid = (high + low) / 2;
if(b[mid] > dat && b[mid+1]<=dat){
high = mid+1;
break;
}
else if(b[mid] > dat ){
low= mid;
}
else{
high = mid;
}
}
if(b[high] <= dat){
tmp = b[high];
b[high] = 0;
sort(b,num);
return tmp;
}
else
return -1;
}