码迷,mamicode.com
首页 > 其他好文 > 详细

ACM 大数相加

时间:2015-07-15 19:02:36      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:

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

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

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

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

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

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 大数相加

标签:

原文地址:http://www.cnblogs.com/threezj/p/4648897.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!