• 【HDU 1753 大明A+B】 高精度加法


    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1753

    题目大意:  给你两个不超过400位的带小数的整数,求出透明的和,要求小数后面的后缀0不能输出。

    解题思路:

    题目很简单,思路也比较清晰。

    不难,但就是要注意的地方很多。 小数点后面的位数可以直接相加,小数点前面的按末尾相加(和小数点后相加不同)。

    1.注意小数点的进位,如果0位(大于10)还要继续进位,大于10则取余后将tmp2记为1,不大于10则tmp2记为0,小数点前的第一位加tmp2。我就是先进完位再加tmp2错了几次。

    2.输出的时候判断.要不要输出。

    测试样例在代码最后,过了这个基本就能过吧。。

     

      1 #include <iostream> //1753
      2 #include <cstdio>
      3 #include <algorithm>
      4 #include <cstring>
      5 using namespace std;
      6 
      7 char s1[500], s2[500];
      8 int  a[500], a2[500], b[500];
      9 int lena, lenb, tmp1, tmp2, st1, st2, d2;
     10 
     11 void cal()
     12 {
     13     int  i, j, c=0;
     14     st1=0, st2=0;
     15     for(i=0; i<lena; i++)
     16     {
     17         if(s1[i]!='.')  a[i]+=s1[i]-'0';
     18         else {  st1=max(st1,i-1);  break; }
     19     }
     20     if(i==lena) st1=lena-1;
     21     for(j=i+1; j<lena; j++)
     22         b[j-i-1]+=s1[j]-'0';
     23     for(i=0; i<lenb; i++)
     24     {
     25         if(s2[i]!='.')  a2[i]+=s2[i]-'0';
     26         else {  st2=max(st2,i-1); break; }
     27     }
     28     if(i==lenb) st2=lenb-1;
     29     for(j=i+1; j<lenb; j++)
     30         b[j-i-1]+=s2[j]-'0';
     31     if(st1>=st2)  c=1;
     32     if(c==1)
     33     {
     34         for(i=st1, j=st2; j>=0; i--,j--)
     35             a[i]+=a2[j];
     36     }
     37     else
     38     {
     39         for(i=st1, j=st2; i>=0; i--,j--)
     40             a2[j]+=a[i];
     41         for(i=st2; i>=0; i--)
     42             a[i]=a2[i];
     43     }
     44     st1=max(st1,st2);
     45 }
     46 
     47 void add()
     48 {
     49     tmp1=0, tmp2=0;
     50     int i, j;
     51     for(i=499; i>=0; i--)
     52         if(b[i]!=0) break;
     53     for(j=i; j>=0; j--)
     54     {
     55         if(b[j]>=10&&j!=0)
     56         {
     57             b[j-1]+=1;
     58             b[j]%=10;
     59         }
     60         else if(b[j]>=10&&j==0)
     61         {
     62             b[j]%=10;
     63             tmp2=1;
     64         }
     65     }
     66     a[st1]+=tmp2;
     67     for(j=st1; j>=1; j--)
     68     {
     69         if(a[j]>=10)
     70         {
     71             a[j-1]+=1;
     72             a[j]%=10;
     73         }
     74     }
     75 }
     76 
     77 void output()
     78 {
     79     int flag=0, i, j;
     80     for(i=499; i>=0; i--)
     81       if(b[i]!=0)
     82       {
     83           d2=i;  flag=1; break;
     84       }
     85     if(flag)
     86     {
     87         for(i=0; i<=st1; i++)
     88             printf("%d",a[i]);
     89         printf(".");
     90         for(j=0; j<=d2; j++)
     91            printf("%d",b[j]);
     92         puts("");
     93     }
     94     else
     95     {
     96         for(i=0; i<=st1; i++)
     97             printf("%d",a[i]);
     98         puts("");
     99     }
    100 }
    101 
    102 int main()
    103 {
    104     while(~scanf("%s%s",s1,s2))
    105     {
    106         memset(a,0,sizeof(a));
    107         memset(a2,0,sizeof(a2));
    108         memset(b,0,sizeof(b));
    109         lena=strlen(s1);
    110         lenb=strlen(s2);
    111         cal();
    112         add();
    113         output();
    114     }
    115     return 0;
    116 }
    117 
    118 /*
    119 99999.889 0.111
    120 1000.0 10000.0
    121 112233.1 333.9
    122 123450000 777
    123 123400000 777.700
    124 0.000 0.0000
    125 99999 1
    126 1.2333 20.2667
    127 1212121212.1111111 21212121.33300000000000000
    128 */

     

  • 相关阅读:
    document.all用法
    $.ajax同步/异步(async:false/true)
    link 和@import 的区别
    如何对网页的加载进行性能优化
    border-style有哪些值?
    CSS设置DIV居中
    jquery选择器
    jQuery库中获取jQuery对象的方式
    Observer,观察者模式,C++描述
    Iterator,迭代器模式,C++描述
  • 原文地址:https://www.cnblogs.com/kane0526/p/2791271.html
Copyright © 2020-2023  润新知