最佳加法表答式

新手上路,留个坑等时间宽裕点来填吐舌头



#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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值