【HDU】1753 大明A+B

论坛 期权论坛 脚本     
匿名技术用户   2020-12-22 20:01   16   0

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

题目:

Problem Description

话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。

现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。

Input

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

Output

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

Sample Input

1.1 2.9

1.1111111111 2.3444323343

1 1.1

Sample Output

4

3.4555434454

2.1

分析:

大数计算问题。我的方法是将之存入数组。因为A、B均为正小数。所以又分有整数小数部分,可通过strstr()函数先找到小数点位置,分开整数小数部分。因为小数位数不同,不便运算,所以将数组元素先初始化为0。存数时,先将整数部分倒序存储。因为这样便于解决运算中最终的进位问题;小数部分直接按序存,最终进位加至整数部分。计算思路模拟手算,一位一位算。

另外注意考虑了小数情况,还要考虑到只是整数相加的情况。输出时也注意何时输出小数点等,还有小数中末尾的0要去掉。可以在输出之前先判断小数部分的位数,从后往前,遇到非零则跳出,从而找到小数部分的最终长度。

总体步骤:

1.初始化数组(全设为0);

2.存数:找到小数点位置,存储A、B整数部分小数部分;

3.计算小数:先小数部分从后往前一位位加,记录小数位数(末尾多余的0不计,记录化简后的位数);

4.计算整数:再整数部分加和;

5.输出结果:最终输出整数部分,有小数部分则输出;

代码:

#include <stdio.h>
#include <string.h>
int main()
{
 char a[403], b[403];
 int a1[403],a2[403],b1[403],b2[403];
 int pa,pb,lena,lenb,lena1,lena2;
 int i;
 while(~scanf("%s%s",a,b))
 {
  memset(a1,0,sizeof(a1));
  memset(a2,0,sizeof(a2));
  memset(b1,0,sizeof(b1));
  memset(b2,0,sizeof(b2));
  lena=strlen(a);
  lenb=strlen(b);
  if (strstr(a,".")) pa = strstr(a,".")-a;//找到小数点位置下标
  else pa = lena;
  if (strstr(b,"."))pb = strstr(b,".")-b;
  else pb = lenb;

  for (i=0; i<pa; i++)
   a1[pa-1-i] = a[i]-'0';
  for (i=0; i<pb; i++)
   b1[pb-1-i] = b[i]-'0';
   //将a、b的整数部分存入a1、b1(个位为第0个数组元素)
  for (i=0; i<lena-pa-1; i++)
   a2[i] = a[pa+i+1]-'0';
  for (i=0; i<lenb-pb-1; i++)
   b2[i] = b[pb+i+1]-'0';
   //将a、b的小数部分存入a2、b2
  
  for (i=400; i>0; i--)//小数相加,存在数组a2中
  {
   a2[i] += b2[i];
   a2[i-1] = a2[i-1] + a2[i]/10;//将进位加至前一位
   a2[i] %= 10;
  }
  a2[i] += b2[i];//计算小数点后一位的加和
  a1[0] = a1[0] + a2[i]/10;//将进位加至个位
  a2[i] %= 10;

  lena2 = -1;//记录小数位数,位数为lena2+1
  for (i=400; i >=0; i--)
  {
   if (a2[i]){ lena2 = i+1;break;}
  }
  
  lena1 = pa>pb ? pa : pb;
  for (i=0; i<lena1; i++)//整数相加
  {
   a1[i] += b1[i];
   a1[i+1] = a1[i+1] + a1[i]/10;
   a1[i] %= 10;
  }
  //printf("lena1=%d\n",lena1);
  if (a1[lena1])printf("%d",a1[lena1]);//输出整数进位
  for (i=lena1-1; i>=0;i--)//输出整数
   //因为AB均正小数,所以整数位数只会多或不变,不会少
  {
   printf("%d",a1[i]);
  }
  if (lena2 != -1)
  {
   printf(".");
   for (i=0; i<lena2; i++)
   {
    printf("%d",a2[i]);
   }
  }
  printf("\n");
    }
    return 0;
}

据说java的写法要比这C的简单很多,等以后研究学习到了,再来更新java的代码。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP