蓝桥杯算法提高——实数相加

Description
  计算两个实数相加的结果。
  输入的实数满足如下要求: (1)  小数点前的整数部分最多100位,(2) 小数点后的小数部分最多100位.

Input
输入描述:
  两行字符串,每行都是一个合法的实数。合法的意思是指:  整数部分的值如果大于零,则最高位数字必定大于零. 如果整数部分的值为零,则整数部分只有一个零. 小数部分尾部可以有任意多的零. 可以没有小数部分,  此时也没有小数点. 如果有小数点, 则至少需要有一位小数部分, 且允许是零.
输入样例:

Output
输出描述:
  相加结果。注意: 小数部分末尾如果有连续的0, 则它们都是有效数字,  不能舍去. 如果是两个整数相加, 则结果仍为整数而没有小数部分.
输出样例:

对于整数部分,采取逆置字符串的方式;
对于小数部分,不可以逆置字符串,因为逆置字符串之后,小数部分实现了低位对齐相加,这样与小数部分的加法规则不符。因此,正序保存小数部分,倒序相加,对个位的进位保存在数组的第一个元素位置即可。
https://blog.nowcoder.net/n/d053cdd04f4e46b4965c76700f9445ee

import java.util.Scanner;

public class 实数相加 {
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner s=new Scanner(System.in);
		String ss1=s.next();
		char[]s1=ss1.toCharArray();
		String ss2=s.next();
		char[]s2=ss2.toCharArray();
		int len1=ss1.length();
		int len2=ss2.length();
		//把第一个加数的整数部分分割出来,并逆置保存
		int tmp[]=new int[101];
		int num1=0;
	    for(int i=0;i<len1;i++){
	        if(s1[i]=='.') break;
	        tmp[++num1]=s1[i]-'0';//临时数组,正序保存了整数部分
	    }
	    int zheng_a[]=new int[101];
	    for(int i=1;i<=num1;i++) {
	    	zheng_a[num1-i+1]=tmp[i];
	    }
	    
	  //把第二个加数的整数部分分割出来,并逆置保存
	    int num2=0;
	    for(int i=0;i<len2;i++){
	        if(s2[i]=='.') break;
	        tmp[++num2]=s2[i]-'0';
	    }
	    int zheng_b[]=new int[101];
	    for(int i=1;i<=num2;i++)
	        zheng_b[num2-i+1]=tmp[i];
	    
	  //第一个数小数部分的保存
	    int xiao_a[]=new int[101];
	    int num3=0;
	    for(int i=num1+1;i<len1;i++)
	        xiao_a[++num3]=s1[i]-'0';
	    //第二个数小数部分的保存
	    int xiao_b[]=new int[101];
	    int num4=0;
	    for(int i=num2+1;i<len2;i++)
	        xiao_b[++num4]=s2[i]-'0';
	    
	  //小数部分相加   
	    int maxx1=Math.max(num3,num4); 
	    int xiao_c[]=new int[maxx1+1];
	    for(int i=maxx1;i>=1;i--){
	        xiao_c[i]+=xiao_a[i]+xiao_b[i];
	        xiao_c[i-1]=xiao_c[i]/10;
	        xiao_c[i]%=10;
	    }
	    
	  //整数部分相加
	    int maxx2=Math.max(num1,num2);
	    int zheng_c[]=new int[maxx2+2];
	    zheng_c[1]=xiao_c[0];//先保存上小数部分的进位
	    
	    for(int i=1;i<=maxx2;i++){
	        zheng_c[i]+=zheng_a[i]+zheng_b[i];
	        zheng_c[i+1]=zheng_c[i]/10;
	        zheng_c[i]%=10;
	    }
	    
	    if(zheng_c[maxx2+1]!=0) maxx2++;//勿忘
	    
	  //输出整数部分
	    for(int i=maxx2;i>=1;i--)
	        System.out.print(zheng_c[i]);
	 
	    if(maxx1!=0){//判断是否存在小数部分,不存在就不进行输出,存在时先输出小数点再输出小数部分
	        System.out.print('.');
	        for(int i=1;i<=maxx1;i++)
	            System.out.print(xiao_c[i]);
	    }
	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值