ACM 大数相加

大数问题 基本都可以归结到大数相加上来

做大数问题  要返璞归真 回到小学里做加法

把数字读入到字符串数组中  每个位数一 一相加  主要考虑进位问题 

如果整数的话 左边用零补齐

小数的话要左右分开补齐零  小数的零要补右边

HDOJ题目在1002 1753

下面给代码  整数相加

#include <stdio.h>

#include <string.h>

#define SIZE 1000

void convert(char a[],char newa[])

{

    memset(newa,'0',SIZE);

    strcpy(newa+SIZE-strlen(a),a);

}

void calcul(char newa[],char newb[],char res[])

{

    memset(res,'0',SIZE+1);

    int c=0,i;

    char temp;

    for(i=SIZE-1;i>=0;i--)

    {

        temp=newa[i]+newb[i]-'0'+c;

        if(temp>'9')

        {   temp=temp-10  ; c=1;   }

        else

            c=0;

        res[i+1]=temp;

    }

    res[SIZE+1]='\0';

}

void printres(char a[],char b[],char res[])

{

    printf("%s + %s = ",a,b);



    int i;

    for(i=0;i<SIZE+2;i++)

    {

        if(res[i]!='0')

        {    puts(res+i);break;}

    }



}

int main()

{

   int n,i;

   scanf("%d",&n);

   char a[SIZE+1],b[SIZE+1];

   char newa[SIZE+1],newb[SIZE+1],res[SIZE+2];



   for(i=0;i<n;i++)

   {

       scanf("%s %s",a,b);

       convert(a,newa);

       convert(b,newb);

       calcul(newa,newb,res);

       printf("Case %d:\n",i+1);

       printres(a,b,res);

       if(i<n-1)

        printf("\n");

   }

}

 

小数相加 可能我写的比较繁琐

  1 #include "stdio.h"

  2 #include "string.h"

  3 #define N 400 

  4 void convert(char ch[],char new1[])

  5 {

  6     char temp[N+2];

  7     char ch1[2*N+1];

  8     int flag=0;

  9     strcpy(ch1,ch);

 10     int pos=0,i;

 11     memset(temp,'0',N+1);

 12     memset(new1,'0',2*N+1);

 13     for(pos=0;pos<strlen(ch);pos++)

 14     {

 15         if(ch[pos]=='.')

 16         {

 17             flag=1;

 18             break;

 19         }    

 20     }

 21     if(flag==0)

 22     {

 23         strcat(ch1,".0")    ;

 24     }

 25     ch[pos]='\0';

 26     strcpy(new1+N-strlen(ch),ch);

 27     ch[pos]='.'; 

 28     for(pos,i=0;pos<strlen(ch1);pos++,i++)

 29     {

 30         temp[i]=ch1[pos];

 31 

 32     }

 33     temp[N+1]='\0';

 34 

 35     strcat(new1,temp);

 36 }

 37 void calcul(char newa[],char newb[],char res[])

 38 {

 39     memset(res,'0',N*2+2);

 40     int c=0,i;

 41     char temp;

 42     for(i=N*2;i>=0;i--)

 43     {

 44         if(newa[i]!='0'||newb[i]!='0'||c==1)

 45         {

 46             temp=newa[i]+newb[i]-'0'+c;

 47             if(newa[i]=='.')

 48                  {  res[i+1]='.'; continue;  }

 49 

 50             if(temp>'9')

 51                 {   temp=temp-10  ; c=1;   }

 52             else

 53                 c=0;

 54             res[i+1]=temp;

 55         }        

 56     }

 57     for(i=N*2+1;i>=0;i--)

 58     {

 59            if(res[i]!='0')

 60            break; 

 61        }

 62     res[i+1]='\0';     

 63     

 64 }

 65 void printres(char a[],char b[],char res[])

 66 {

 67     int i,pos,flag=0;

 68     for(i=0;i<N*2+1;i++)

 69     {

 70         if(res[i]=='.' )

 71         {    break;}

 72     }

 73     pos=i;

 74     res[pos]='\0';

 75     for(i=0;i<strlen(res);i++)

 76     {

 77         if(res[i]!='0' )

 78         {  flag=1; printf("%s",res+i); break;}

 79     }

 80        if(flag==0)    

 81            printf("0");

 82     res[pos]='.';

 83     if(res[pos+1]!='\0') 

 84         printf("%s",res+pos);

 85     printf("\n");

 86 }

 87 main()

 88 {

 89     char a[2*N+1],b[2*N+1];

 90     char newa[2*N+1],newb[2*N+1],res[2*N+2];

 91     memset(a,'0',2*N);

 92     memset(b,'0',2*N);

 93     while(scanf("%s %s",a,b)!=EOF)

 94     {

 95         convert(a,newa);

 96         convert(b,newb);

 97         calcul(newa,newb,res);

 98         if(res[0]!='\0')

 99                printres(a,b,res);

100            else 

101             printf("0\n");

102     }

103 }

 

你可能感兴趣的:(ACM)