• 大明A+B(大数相加)解题报告


    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


    思路:小数整数分开计算,先计算小数(注意后导0和全为0情况,例如1.2000000  1.0)。再计算整数(注意前导0和只有0情况),整数输出部分真的是搞死了,对于极端情况还是欠考虑,不好设置其中的开关条件
    附上借鉴的大佬解法:感谢大佬

    代码:
    #include<stdio.h>
    #include<string.h>
    int main()
    {
    	char a[410],b[410];
    	int a1[410],a2[410],b1[410],b2[410],p1,p2,lena,lenb,i,j,point1,point2;
    	while(scanf("%s%s",a,b)!=EOF)
    	{
    		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);
    		p1=lena;		
    		for(i=0;i<lena;i++){
    			if(a[i]=='.'){
    				p1=i;	//整数长度 
    				break;
    			}
    		}
    		p2=lenb;			
    		for(i=0;i<lenb;i++){
    			if(b[i]=='.'){
    				p2=i;	//整数长度 
    				break;
    			}
    		}
    		for(i=0;i<p1;i++){
    			a1[p1-1-i]=a[i]-'0';		// 整数转移 (倒置) 
    		}
    		for(j=0,i=p1+1;i<lena;i++,j++){
    			a2[j]=a[i]-'0';		//小数转移 
    		}
    		for(i=0;i<p2;i++){
    			b1[p2-1-i]=b[i]-'0';		// 整数转移 (倒置)
    		}
    		for(j=0,i=p2+1;i<lenb;i++,j++){
    			b2[j]=b[i]-'0';		//小数转移 
    		}
    
    		for(i=400;i>0;i--){		//小数相加
    			a2[i]=a2[i]+b2[i];
    			if(a2[i]>=10){
    				a2[i]-=10;
    				a2[i-1]++;
    			}
    		}
    		a2[i]=a2[i]+b2[i];
    		if(a2[i]>=10){
    			a2[i]-=10;
    			a1[0]++;
    		}
    		point1=-1;
    		for(i=400;i>=0;i--){		//小数除去后导0
    			if(a2[i]!=0){
    				point1=i;	//找到小数最末尾不为0的位置 
    				break;			
    			}
    		}
    		lena=p1;lenb=p2;
    		int len=lena>lenb?lena:lenb;	//整数相加 
    		for(i=0;i<len;i++){
    			a1[i]+=b1[i];
    			if(a1[i]>=10){
    				a1[i]-=10;
    				a1[i+1]++;
    			}
    		}
    		point2=0;
    		for(j=i;j>=0;j--){		//判断、除去前导0 
    			if(a1[j]!=0){
    				point2=1;
    			}
    			if(point2){
    				printf("%d",a1[j]);
    			}
    		}
    		if(point2==0){
    			printf("0");
    		}
    		if(point1!=-1){
    			printf(".");
    			for(i=0;i<=point1;i++){
    				printf("%d",a2[i]);
    			}
    		}
    		printf("
    ");
    	}
    	return 0;	
    }

    终于搞腚了



  • 相关阅读:
    设计师用的几个网站
    微信小程序开发框架
    数据模型
    数据库系统
    大话设计模式读书笔记(一)
    关于数据统计时的效率
    orcale同一条语句运行速度差异问题
    使用plspl创建orcale作业
    正则表达式(一)
    oracle游标小试
  • 原文地址:https://www.cnblogs.com/KirinSB/p/9409144.html
Copyright © 2020-2023  润新知