新手上路,留个坑等时间宽裕点来填
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//用char保存的数字的加法
void add(char* A,int lenA,char* B,int lenB,char* result);
//按照长度反转的函数,加法函数用到
void len_cover(char* A,int lenA);
//比较大小
int compare(char* A,char* B);
//求最佳加法表达式
void BestAddEx();
int main(){
BestAddEx();
return 0;
}
void BestAddEx(){
char a[51];
char r[51];
int m;
scanf("%d",&m);
scanf("%s",a);
int n = strlen(a);
char matrix[m+1][n+1][51];
int i,j,k;
for(i=0;i<=m;i++){
for(j=0;j<=n;j++){
for(k=0;k<50;k++)
matrix[i][j][k]='9';
matrix[i][j][k]='\0';
}
}
for(j=1;j<=n;j++){
strncpy(matrix[0][j],a,j);
matrix[0][j][j]='\0';
}
for(i=1;i<=m;i++){
for(j=i+1;j<=n;j++){
for(k=1;k<=j-i;k++){
add(matrix[i-1][j-k],strlen(matrix[i-1][j-k]),a+j-k,k,r);
if(compare(matrix[i][j],r)>=0)
strcpy(matrix[i][j],r);
}
}
}
printf("%s\n",matrix[m][n]);
}
void add(char* A,int lenA,char* B,int lenB,char* result){
len_cover(A,lenA); len_cover(B,lenB);
int temp,i,flag=0;
for(i=0;i<lenA&&i<lenB;i++){
temp = (*(A+i)-'0')+(*(B+i)-'0')+flag;
if(temp>=10) flag=1;
else flag=0;
result[i]=temp%10 + '0';
}
while(i<lenA){
temp = (*(A+i)-'0')+flag;
if(temp>=10) flag=1;
else flag=0;
result[i++]=temp%10 + '0';
}
while(i<lenB){
temp = (*(B+i)-'0')+flag;
if(temp>=10) flag=1;
else flag=0;
result[i++]=temp%10 + '0';
}
if(flag==1)
result[i++]=flag+'0';
result[i]='\0';
len_cover(A,lenA); len_cover(B,lenB);
len_cover(result,strlen(result));
}
void len_cover(char* A,int lenA){
int low,higth;
char temp;
low = 0;
higth=lenA-1;
while(low<higth){
temp = *(A+low);
*(A+low++) = *(A+higth);
*(A+higth--)=temp;
}
}
int compare(char* A,char* B){
int lenA,lenB,flag=0;
int temp,i;
lenA=strlen(A);lenB=strlen(B);
len_cover(A,lenA); len_cover(B,lenB);
if(lenA>lenB){
len_cover(A,lenA); len_cover(B,lenB);
return 0;
}
if(lenA<lenB){
len_cover(A,lenA); len_cover(B,lenB);
return -1;
}
for(i=0;i<lenA&&i<lenB;i++){
temp = (A[i]-'0')-(B[i]-'0')-flag;
if(temp<0){
flag=1;
temp+=10;
}
else flag=0;
}
while(i<lenA){
temp = (A[i]-'0')-flag;
if(temp<0){
flag=1;
temp+=10;
}
else flag=0;
}
while(i<lenB){
temp = (B[i]-'0')-flag;
if(temp<0){
flag=1;
temp+=10;
}
else flag=0;
}
len_cover(A,lenA); len_cover(B,lenB);
if(flag==1){;
return -1;
}
return 0;
}