随笔 - 5, 文章 - 0, 评论 - 0, 引用 - 0
数据加载中……

浮点数相加

 1 题目描述 
 2 求2个浮点数相加的和
 3 
 4 题目中输入输出中出现浮点数都有如下的形式:
 5 P1P2Pi.Q1Q2Qj
 6 对于整数部分,P1P2Pi是一个非负整数
 7 对于小数部分,Qj不等于0 
 8 
 9 输入 
10 第1行是测试数据的组数n,每组测试数据占2行,分别是两个加数。每组测试数据之间有一个空行,每行数据不超过100个字符
11 
12 输出 
13 n行,每组测试数据有一行输出是相应的和。输出保证一定是一个小数部分不为0的浮点数 
14 
15 样例输入 
16 2
17 0.111111111111111111111111111111
18 0.111111111111111111111111111111
19 
20 10000000.655555555555555555555555555555
21 1.444444444444444444444444444445
22 
23 样例输出 
24 0.222222222222222222222222222222
25 10000002.1 

算法思路:
     还是用字符串保存大数。
     1. 去掉字符串中间的点号,对点号后面的小数位数补齐(这样就可以方便的按正常算法来从低位到高位计算了)。
     2. 记录小数点的位置。加完以后,再把小数点添回去。
     想的还是太多太乱了。还是要多练,练更多的题。跨专业真蛋疼。。。
  1 #include <cstdio>
  2 #include <cstdlib>
  3 #include <cstring>
  4 const int MAX=110;
  5 char a[MAX], b[MAX], c[MAX];
  6 
  7 void add(char a[],char b[], char back[])
  8 {
  9     int i,j,k,carry,x,y,z,l;
 10     if(strlen(a) > strlen(b))
 11     {
 12         l = strlen(a)+2;
 13     }
 14     else
 15         l = strlen(b)+2;
 16     char *tmp = (char *)malloc(l*sizeof(char));
 17     i=strlen(a)-1;
 18     j=strlen(b)-1;
 19     k=0;
 20     carry = 0;
 21     while( i>=0 || j>=0 )
 22     {
 23         if(i<0)
 24         {
 25             x=0;
 26         }
 27         else
 28         {
 29             x=a[i]-'0';
 30         }
 31         if(j<0)
 32         {
 33             y=0;
 34         }
 35         else
 36         {
 37             y=b[j]-'0';
 38         }
 39         z=x+y+carry;
 40         if(z>9)
 41         {
 42             z%=10;
 43             carry = 1;
 44         }
 45         else
 46             carry = 0;
 47         tmp[k++] = z+'0';
 48         --i;
 49         --j;
 50     }
 51     if(carry)
 52     {
 53         tmp[k++] = '1';
 54     }
 55     tmp[k] = 0;
 56     for(k-=1,i=0; k>=0; --k)
 57         back[i++] = tmp[k];
 58     back[i] = 0;
 59 }
 60 
 61 int dec(char a[], char b[])
 62 {
 63     int i,j,k,L1,L2;
 64     L1=strlen(a);
 65     L2=strlen(b);
 66     for(i=0; i<L1; ++i)
 67     {
 68         if(a[i] == '.')
 69         {
 70             for(k=i; k<L1; ++k)
 71                 a[k]=a[k+1];
 72             --L1;
 73             break;
 74         }
 75     }
 76     for(j=0; j<L2; ++j)
 77     {
 78         if(b[j]=='.')
 79         {
 80             for(k=j; k<L2; ++k)
 81                 b[k]=b[k+1];
 82             --L2;
 83             break;
 84         }
 85     }
 86     k=(L1-i)-(L2-j);
 87     if(i==L1 && j==L2)
 88         return 0;
 89     else if(k>0)
 90     {
 91         while(k!=0)
 92         {
 93             b[L2++]='0';
 94             --k;
 95         }
 96         return L1-i;
 97     }
 98     else
 99     {
100         k*=-1;
101         while(k!=0)
102         {
103             a[L1++]='0';
104             --k;
105         }
106         return L2-j;
107     }
108 }
109 
110 void result(char c[], int n)
111 {
112     int i,length;
113     length=strlen(c);
114     for(i=length;i>length-n; --i)
115     {
116         c[i] = c[i-1];
117     }
118     c[i]='.';
119     for(i=length; i>=length-n; --i)
120     {
121         if(c[i]!='0' && i!=length-n)
122         {
123             break;
124         }
125         else
126         {
127             c[i]=0;
128         }
129     }
130 }
131 
132 int main()
133 {
134     int n,k;
135     scanf("%d", &n);
136     while(n--)
137     {
138         memset(a,0,sizeof(a));
139         memset(b,0,sizeof(b));
140         memset(c,0,sizeof(c));
141         scanf("%s%s",a,b);
142         k=dec(a,b);
143         add(a,b,c);
144         result(c,k);
145         printf("%s\n", c);
146     }
147     return 0;
148 }
149 

posted on 2013-03-11 16:53 gamer67 阅读(578) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理