HDOJ 1753 明朝A+B



http://acm.hdu.edu.cn/showproblem.php?

pid=1753

大明A+B

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 8296    Accepted Submission(s): 2929

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[0]+=1即可。然后后边直接用;

然后计算整数位的和。也就是大数相加,仅仅是应该注意把字符串中的数存到a[]时。要写成a[j]+=s1[i]-‘0‘,由于要考虑进位

代码后边附几组数据,这些过了应该就能够AC

/*思路清晰,算法仅仅用到了大数,但里边须要注意的地方非常多
先计算小数位的和。由于十分位可能向各位进位,进位时a[0]+=1即可,然后后边直接用;
然后计算整数位的和,也就是大数相加,仅仅是应该注意把字符串中的数存到a[]时。要写成a[j]+=s1[i]-'0',由于要考虑进位
*/
#include<stdio.h>
#include<string.h>
#define MAX 450
int main()
{
	int a[MAX],b[MAX],num_1[MAX],num_2[MAX],i,j,k,n;
	char s1[MAX],s2[MAX];
	while(~scanf("%s %s",s1,s2))
	{
		memset(num_1,0,sizeof(num_1));
		memset(num_2,0,sizeof(num_2));
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		n=strlen(s1);
		for(i=0;i<n;i++)//s1[i]为小数点
		if(s1[i]=='.') break;
		for(k=0,j=n-1;j>i;j--,k++)//s1有k位小数
		num_1[k]=s1[j]-'0';
		int i_1=i,k_1=k,n_1=n;

		n=strlen(s2);
		for(i=0;i<n;i++)//s2[i]为小数点
		if(s2[i]=='.') break;
		for(k=0,j=n-1;j>i;j--,k++)//s2有k位小数
		num_2[k]=s2[j]-'0';
		int i_2=i,k_2=k,n_2=n;
		if(k_1>=k_2)//小数相加,注意十分位进位的情况  //分两这情况(k_1>=k_2)和(k_1<k_2)是由于不确定哪个小数点后的位数大
		{//假设k_1>=k_2,把计算的结果放到num_1[]中
			for(i=k_1-k_2,j=0;i<k_1;i++,j++)
			{
				num_1[i]+=num_2[j];
				if(num_1[i]>=10)
				{
					num_1[i]-=10;
					num_1[i+1]+=1;
				}
				//printf("%d#\n",num_1[i]);
			}
			if(num_1[i]==1)//十分位进到个位
			{
				num_1[i]-=1;
				a[0]+=1;
			}
		}
		else if(k_2>k_1)//假设k_2>k_1,把计算的结果放到num_2中。

{
			for(i=k_2-k_1,j=0;i<k_2;i++,j++)
			{
				num_2[i]+=num_1[j];
				if(num_2[i]>=10)
				{
					num_2[i]-=10;
					num_2[i+1]+=1;
				}

			}
			if(num_2[i]==1)//十分位进到个位
			{
				num_2[i]-=1;
				a[0]+=1;
			}
		}
		//上边小数位相加分两种情况。下边小数位的输出也分两种情况 

		for(j=0,i=i_1-1;i>=0;i--,j++)//这里是a[j]+=s1[i]-'0',由于考虑到小数会给a[0]进位。

a[j]+=s1[i]-'0';            //这里事实上仅仅给a[0]+=s1[o]-'0',其余还是a[j]=s1[i]-'0',仅仅是这样写和把a[0]独分出来效果一样,就这样写了
		for(j=0,i=i_2-1;i>=0;i--,j++)//给b[0]赋值时和a[]一样
		b[j]=s2[i]-'0';
		for(i=0;i<MAX;i++)//计算整数部分。存到a[]中
		{
		      a[i]+=b[i];
			  if(a[i]>=10)
			  {
			       a[i]-=10;
				   a[i+1]+=1;
			  }
	    }
	    for(i=MAX-1;i>0;i--)//输出整数部分
	    if(a[i]!=0) break;
	    for(;i>=0;i--)
	    printf("%d",a[i]);

	    if(k_1>=k_2)//输出小数部分
		{
			for(i=k_1-1;i>=0;i--)//这里的for循环是推断小数点后是否有值,假设没有值,循环进行究竟。最后i是-1
			if(num_1[i]!=0) break;//假设i==-1。则不运行下边if(i!=-1),也就是不输出小数点和小数点后边的0
			for(j=0;j<k_1;j++)//这个for循环的作用是不输出计算得到的小数后边的0,如1.028+1.072。

在for之前结果是2.100,运行完for就把 后边的0去掉,结果为2.1
			if(num_1[j]!=0) break;
			if(i!=-1)//假设小数点后边有值,输出小数点和后边的数
			{
				printf(".");
				for(i=k_1-1;i>=j;i--)
				printf("%d",num_1[i]);
			}
	    }
	    else if(k_1<k_2)//这里的if和上边一样
	    {
	    	for(i=k_2-1;i>=0;i--)
	    	if(num_2[i]!=0) break;
	    	for(j=0;j<k_2;j++)
	    	if(num_2[j]!=0) break;
	    	if(i!=-1)
	    	{
	    		printf(".");
	    		for(i=k_2-1;i>=j;i--)
	    		printf("%d",num_2[i]);
	    	}
	    }
	    printf("\n");

	}
	return 0;
}
/*
0 0
1.2333 1.2667
99999 1
12121213213124342545354545 13312312321312321321.02300000000000000000000000000
1.0001 1.00002
99999.889 0.111
1000.0 10000.0
112233.1 333.9
123450000 777
123400000 777.700
0.000 0.0000
1212121212.1111111 21212121.33300000000000000
*/

版权声明:本文博主原创文章。博客,未经同意不得转载。

时间: 2024-11-05 16:03:28

HDOJ 1753 明朝A+B的相关文章

HDOJ 1753 大明A+B

JAVA大数.... 大明A+B Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7763    Accepted Submission(s): 2748 Problem Description 话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫"大明". 这时他已经不是那个只会做100以内加法的那个&quo

hdoj 1753 大明A+B 高精度/java

大明A+B Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 9273    Accepted Submission(s): 3318 Problem Description 话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”.这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加

【HDOJ】1753 大明A+B

注意数据格式,可以是整数,并且注意输出最简化浮点数. 1 #include <stdio.h> 2 #include <string.h> 3 4 #define MAXNUM 420 5 6 char a[MAXNUM], b[MAXNUM], c[MAXNUM], d[MAXNUM]; 7 int lena, lenb; 8 int posa, posb; 9 10 int addf(int bega, int begb, int *carry); 11 int addi(in

【HDOJ】4328 Cut the cake

将原问题转化为求完全由1组成的最大子矩阵.挺经典的通过dp将n^3转化为n^2. 1 /* 4328 */ 2 #include <iostream> 3 #include <sstream> 4 #include <string> 5 #include <map> 6 #include <queue> 7 #include <set> 8 #include <stack> 9 #include <vector>

POJ Xiangqi 4001 &amp;&amp; HDOJ 4121 Xiangqi

题目链接(POJ):http://poj.org/problem?id=4001 题目链接(HDOJ):http://acm.hdu.edu.cn/showproblem.php?pid=4121 Xiangqi Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1108   Accepted: 299 Description Xiangqi is one of the most popular two-player boa

【HDOJ】4956 Poor Hanamichi

基本数学题一道,看错位数,当成大数减做了,而且还把方向看反了.所求为最接近l的值. 1 #include <cstdio> 2 3 int f(__int64 x) { 4 int i, sum; 5 6 i = sum = 0; 7 while (x) { 8 if (i & 1) 9 sum -= x%10; 10 else 11 sum += x%10; 12 ++i; 13 x/=10; 14 } 15 return sum; 16 } 17 18 int main() { 1

HDOJ 4901 The Romantic Hero

DP....扫两遍组合起来 The Romantic Hero Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 547    Accepted Submission(s): 217 Problem Description There is an old country and the king fell in love with a

【HDOJ】1099 Lottery

题意超难懂,实则一道概率论的题目.求P(n).P(n) = n*(1+1/2+1/3+1/4+...+1/n).结果如果可以除尽则表示为整数,否则表示为假分数. 1 #include <cstdio> 2 #include <cstring> 3 4 #define MAXN 25 5 6 __int64 buf[MAXN]; 7 8 __int64 gcd(__int64 a, __int64 b) { 9 if (b == 0) return a; 10 else return

【HDOJ】2844 Coins

完全背包. 1 #include <stdio.h> 2 #include <string.h> 3 4 int a[105], c[105]; 5 int n, m; 6 int dp[100005]; 7 8 int mymax(int a, int b) { 9 return a>b ? a:b; 10 } 11 12 void CompletePack(int c) { 13 int i; 14 15 for (i=c; i<=m; ++i) 16 dp[i]