nyoj A+B Problem IV【实数a+b】大数

A+B Problem IV

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 3
描述
acmj最近发现在使用计算器计算高精度的大数加法时很不方便,于是他想着能不能写个程序把这个问题给解决了。
输入
包含多组测试数据
每组数据包含两个正数A,B(可能为小数且位数不大于400)
输出
每组输出数据占一行,输出A+B的结果,结果需要是最简的形式。
样例输入
1.9 0.1
0.1 0.9
1.23 2.1
3 4.0
样例输出
2
1
3.33
7

实数a+b,只针对整数的运算........

很久以前就想尝试,今天终于搞出来了..........

恶心的要死,调试了一下午,才把所有要考虑的情况考虑到..........

其实就是字符串处理,主要是要注意各种特殊情况...........


献出几组测试数据:


0.1 0.02
0.1 0.9
1 2.0
1.9 0.1
9 10
1.23 2.1
1000 0.01


写的程序比较繁琐,完全是按自己的理解来做的..........

以后有机会再优化吧........


#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
char a[1005],b[1005],sum[1005];
void mem()
{
	memset(sum,0,sizeof(sum));
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
}
void over(char s[])
{
	int len=strlen(s);
	for(int i=0;i<len/2;++i)
	{
		swap(s[i],s[len-i-1]);
	}
}
int point(char s[])//找小数点的位置 
{
	int len=strlen(s);
	for(int i=0;i<len;++i)
	{
		if(s[i]=='.')
		{
			over(s);
			return len-i-1;
		}
	}
	s[len]='.';s[len+1]='0';
	return point(s);
}
void move(char s[],int x)
{
	int len=strlen(s);
	for(int i=len-1;i>=0;--i)
	{
		s[i+x]=s[i];
	}
	while(x--)
	{
		s[x]='0';
	}
}
void change(char s[])
{
	int len=strlen(s),cnt=0;
	for(int i=0;i<len;++i)
	{
		if(s[i]!='0'&&s[i]!='.')
		{
			break;
		}
		else
		{
			++cnt;
		}
		if(s[i]=='.')
		{
			break;
		}
	}
	for(int i=cnt;i<len;++i)
	{
		s[i-cnt]=s[i];
	}
	s[len-cnt]=0;
	over(s);
}
int main()
{
//	freopen("shuju.txt","r",stdin); 
	while(mem(),~scanf("%s%s",a,b))
	{
		int pa=point(a),pb=point(b);
		if(pa>pb)//对位 
		{
			move(b,pa-pb);
		}
		else
		{
			move(a,pb-pa);
		}
		int cnt=0;
		for(int i=0;a[i]||b[i];++i)//累加 
		{
			if(a[i]!='.')
			{
				sum[i]+=a[i]-(a[i]?'0':0)+b[i]-(b[i]?'0':0);
				//++cnt;
			}
			else
			{
				sum[i]='.';
			}
			++cnt;
		}
		for(int i=0;i<cnt;++i)//进位 
		{
			if(sum[i]!='.')
			{
				if(sum[i+1]!='.')
				{
					sum[i+1]+=sum[i]/10;
					sum[i]%=10;
				}
				else
				{
					sum[i+2]+=sum[i]/10;
					sum[i]%=10;
				}
				sum[i]+='0';
			}
			while(sum[cnt])
			{
				++cnt;
			}
		}
		change(sum);//调整
		printf("%s\n",sum);
	}
	return 0;
}


大神的最优代码,然而并没有看懂....555


 
 
#include <stdio.h>
#include <string.h>
#define MAX 1000
char a[MAX],b[MAX],c[MAX];
int main()
{
	int i,j,k,l,m,n,la,lb,mx;
	char ch;
	memset(a,'0',sizeof(a));
	memset(b,'0',sizeof(b));
	while(~scanf("%s%s",a,b))
	{
		la=strlen(a);
		lb=strlen(b);
		a[la]='0';
		b[lb]='0';
		i=0;
		while((a[i]-'.')&&i<la)
		{
			i++;
		}
		if(i==la)
			a[la]='.';
		j=0;
		while((b[j]-'.')&&j<lb)
		{
			j++;
		}
		if(j==lb)
			b[lb]='.';
		m=(la-i)>(lb-j)?(la-i):(lb-j);
		if(i>=j)
		{
			for(l=mx=i+m,k=0,j=i-j;l>=0;l--)
			{
				if(a[l]=='.')
				{
					c[l]='.';
					continue;
				}
				ch=(l-j)<0?'0':b[l-j];
				c[l]=(a[l]-'0'+ch-'0'+k)%10+'0';
				k=(a[l]-'0'+ch-'0'+k)/10;
			}
		}
		else
		{
			for(l=mx=j+m,k=0,j=j-i;l>=0;l--)
			{
				if(b[l]=='.')
				{
					c[l]='.';
					continue;
				}
				ch=(l-j)<0?'0':a[l-j];
				c[l]=(ch-'0'+b[l]-'0'+k)%10+'0';
				k=(ch-'0'+b[l]-'0'+k)/10;
			}
		}
		if(k>0)
			printf("%d",k);
		while(c[mx]=='0')
			mx--;
		if(c[mx]=='.')
			mx--;
		for(i=0;i<=mx;i++)
			printf("%c",c[i]);
		printf("\n");
		memset(a,'0',sizeof(a));
		memset(b,'0',sizeof(b));
	}
}                


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
x1y2 x2y3 x3y1-x1y3-x2y1-x3y2 是计算三角形面积的公式中的一部分。 在这个公式中,x1、x2、x3分别表示三角形的三个顶点的x坐标,y1、y2、y3分别表示三角形的三个顶点的y坐标。通过计算这个表达式的值,可以得到三角形的面积。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [TetraCluster:使用并行Java 2库的Java并行程序。 该程序在群集并行计算机上运行,​​以从给定的点集中找到...](https://download.csdn.net/download/weixin_42171208/18283141)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [线性代数有个题,求正交变换x=Qy,化二次型f(x1,x2,x3)=8x1x2+8x1x3+8x2x3为标准型求出特征值](https://blog.csdn.net/weixin_39956182/article/details/115882118)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [nyoj-67-三角形面积(S=(1/2)*(x1y2+x2y3+x3y1-x1y3-x2y1-x3y2))](https://blog.csdn.net/weixin_30492601/article/details/99541033)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值