zoukankan      html  css  js  c++  java
  • 高精度算法-带小数大数相加

    晚上写了两个小时,想出了AC的一种方法

    写的有点复杂

    附原题:

    问题 A: 大小数相加(字符串+指针)

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 310  解决: 166
    [提交][状态][讨论版]

    题目描述

    给你两个正的小数A和B,你的任务是计算出A+B的值。

    输入

    本题目包含多组测试数据,请处理到文件结束。
    每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。

    输出

    请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。

    样例输入

    1.1 2.9

    1.1111111111 2.3444323343

    1 1.1

    样例输出

    4

    3.4555434454

    2.1

     

    附代码:

      1 #include<stdio.h>
      2 #include<string.h>
      3 int main()
      4 {
      5     void fun(char a[],char b[]);
      6     void func(char aa[]);
      7     void funb(char ab[]);
      8     char a[200],b[200];
      9     char aa[100],ab[100],ba[100],bb[100];
     10     char res[200];
     11     int i,j,len,ui;
     12     while(scanf("%s%s",a,b)!=EOF)
     13     {
     14         len=strlen(a);
     15         for(i=0;i<len;i++)
     16             if(a[i]=='.')
     17                 break;
     18 
     19         if(i==len)
     20         {
     21             strcpy(aa,a);
     22             aa[i]='';
     23             ab[0]='0';
     24             ab[1]='';
     25         }
     26         else
     27         {
     28             strncpy(aa,a,i++);
     29             aa[i-1]='';
     30             strncpy(ab,a+i,len-i);
     31             ab[len-i]='';
     32         }
     33 
     34         len=strlen(b);
     35         for(i=0;i<len;i++)
     36             if(b[i]=='.')
     37                 break;
     38 
     39         if(i==len)
     40         {
     41             strcpy(ba,b);
     42             ba[i]='';
     43             bb[0]='0';
     44             bb[1]='';
     45         }
     46         else
     47         {
     48             strncpy(ba,b,i++);
     49             ba[i-1]='';
     50             strncpy(bb,b+i,len-i);
     51             bb[len-i]='';
     52         }
     53 
     54         ui=strlen(ab);
     55         if(strlen(bb)>ui)
     56             ui=strlen(bb);
     57 
     58         fun(ab,bb);//将计算结果存在ab数组中
     59            // printf("ab=%s
    ",ab);
     60         fun(aa,ba);//将计算结果存在aa数组中
     61           // printf("aa=%s
    ",aa);
     62         i=strlen(ab);j=strlen(aa);
     63         if(strlen(ab)!=ui)
     64         {
     65             if(aa[j-1]=='9')
     66                 {
     67                     func(aa);
     68                 }
     69             else
     70                 aa[j-1]++;
     71            // printf("aa=%s
    ",aa);
     72             strncpy(res,aa,strlen(aa));
     73             res[strlen(aa)]='.';
     74             funb(ab);
     75             strncpy(res+strlen(aa)+1,ab,i-1);
     76             res[strlen(aa)+i]='';
     77             // printf("res=%s
    ",res);
     78         }
     79         else
     80         {
     81             strncpy(res,aa,j);
     82             res[j]='.';
     83             strncpy(res+j+1,ab,i);
     84             res[i+j+1]='';
     85             //printf("%s
    ",res);
     86         }
     87         len=strlen(res);
     88        // printf("len=%d
    ",len);
     89         for(i=0;i<len;i++)
     90             if(res[i]=='.')
     91                 break;
     92         ui=len;
     93         for(j=len-1;j>=i;j--)
     94         {
     95             if(res[j]=='0')
     96                 ui--;
     97             else
     98                 break;
     99         }
    100         len=ui;
    101 
    102         if(res[len-1]=='.')
    103             len--;
    104         res[len]='';
    105         printf("%s
    ",res);
    106     }
    107     return 0;
    108 }
    109 void fun(char a[],char b[])
    110 {
    111     char c[150],tmp;
    112     int i,j,x,y,z,jinw=0,ci=0;
    113     i=strlen(a)-1;
    114     j=strlen(b)-1;
    115     while( i>=0 || j>=0 )
    116     {
    117         if(i<0) //当a数组被加完时
    118             x=0;
    119         else
    120             x=a[i]-'0';
    121         if(j<0) //当b数组被加完时
    122             y=0;
    123         else
    124             y=b[j]-'0';
    125 
    126         z=x+y;
    127         if(jinw) //如果有进位
    128             z++;
    129         if(z>9) //考虑当前数累加是否会导致下次计算进位
    130         {
    131             jinw=1;
    132             z-=10;
    133         }
    134         else
    135             jinw=0;
    136         c[ci++]=z+'0';
    137         i--;
    138         j--;
    139     }
    140     if(jinw) //考虑最后一位是否还有进位
    141         c[ci++]='1';
    142     c[ci]=''; //为C数组添加终止符
    143     for(i=0;i<ci/2;i++)
    144     {
    145         tmp=c[i];c[i]=c[ci-i-1];c[ci-i-1]=tmp;
    146     }
    147     strncpy(a,c,ci);
    148     a[ci]='';
    149     return ;
    150 }
    151 void func(char aa[])
    152 {
    153     char c[50],tmp;
    154     int i,x,z,jinw=1,ci=0;
    155     i=strlen(aa)-1;
    156     while( i>=0 )
    157     {
    158         x=aa[i]-'0';
    159 
    160         z=x;
    161         if(jinw) //如果有进位
    162             z++;
    163         if(z>9) //考虑当前数累加是否会导致下次计算进位
    164         {
    165             jinw=1;
    166             z-=10;
    167         }
    168         else
    169             jinw=0;
    170         c[ci++]=z+'0';
    171         i--;
    172     }
    173     if(jinw) //考虑最后一位是否还有进位
    174         c[ci++]='1';
    175     c[ci]=''; //为C数组添加终止符
    176     for(i=0;i<ci/2;i++)
    177     {
    178         tmp=c[i];c[i]=c[ci-i-1];c[ci-i-1]=tmp;
    179     }
    180     strcpy(aa,c);
    181     aa[ci]='';
    182     return ;
    183 }
    184 void funb(char ab[])
    185 {
    186     int i,len;
    187     len=strlen(ab);
    188     for(i=0;i<len-1;i++)
    189         ab[i]=ab[i+1];
    190     ab[len-1]='';
    191     return ;
    192 }
  • 相关阅读:
    按钮字体颜色的设置
    异常
    数据存储
    SQLiteOpenHelper
    MVC
    在单线程模型中 Message、Handler、Message Queue、Looper 之间的关系
    ListView 的优化方案
    fragment生命周期及优点
    ANR
    Android系统架构
  • 原文地址:https://www.cnblogs.com/wushuaiyi/p/3474892.html
Copyright © 2011-2022 走看看