1 条题解

  • 0
    @ 2025-4-7 21:19:28

    C++ :

    #include<iostream>
    #include<stdlib.h>
    using namespace std;
    char s2[32], s1[32];
    long long a1, a2;
    int e1, e2;
    int main(){
    	int i, f, s;
    	long long t;
    	while (cin >> s1 >> s2)
    	{
    		a1 = a2 = 0;
    		for (s = f = e1 = i = 0; s1[i]; i++)
    		{
    			if (s1[i] == '-')s = 1;
    			else if (s1[i] == '.')f = 1;
    			else if (s1[i] == 'e' || s1[i] == 'E')
    			{
    				e1 += atoi(s1 + i + 1);
    				break;
    			}
    			else a1 = a1 * 10 + s1[i] - '0', e1 -= f;
    		}
    		if (s)a1 = -a1;
    		for (s = f = e2 = i = 0; s2[i]; i++)
    		{
    			if (s2[i] == '-')s = 1;
    			else if (s2[i] == '.')f = 1;
    			else if (s2[i] == 'e' || s2[i] == 'E')
    			{
    				e2+=atoi(s2 + i + 1);
    				break;
    			}
    			else a2 = a2 * 10 + s2[i] - '0', e2 -= f;
    		}
    		if (s)a2 = -a2;
    		if (e1<e2)for (; e1<e2; e2--)a2 *= 10;
    		else if (e1>e2)for (; e1>e2; e1--)a1 *= 10;
    		a1 += a2;
    		if (!a1){
    			cout << 0 << endl;
    			continue;
    		}
    		while (e1<0 && a1 % 10 == 0)a1 /= 10, e1++;
    		if (e1 >= 0){
    			printf("%lld", a1);
    			for (i = 0; i<e1; i++)putchar('0');
    			cout << endl; continue;
    		}
    		if (a1<0)a1 = -a1, s = 1; else s = 0;
    		for (t = 1, f = 0; t <= a1; t *= 10, f++);
    		if (t>1)t /= 10, f--;
    		if (s)putchar('-'); int m = 0;
    		while (a1){
    			if(m>0)printf("%lld", a1 / t); 
    			else { printf("%lld.", a1 / t); m++; }
    			if (a1>=t){
    				a1 = a1 - a1 / t*t;
    			}t /= 10;
    		}
    		printf("e%d\n", e1 + f);
    	}
    	return 0;
    }
    

    Java :

    import java.math.BigDecimal;
    import java.util.Scanner;
    
    public class Main {
    
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);
    		while (sc.hasNext()) {
    			BigDecimal A = new BigDecimal(sc.next());
    			BigDecimal B = new BigDecimal(sc.next());
    			BigDecimal C = A.add(B);
    			if (C.compareTo(BigDecimal.ZERO) == 0) {
    				System.out.println(0);
    			} else if (C.setScale(0, BigDecimal.ROUND_HALF_UP).subtract(C).compareTo(BigDecimal.ZERO) == 0) {
    				System.out.println(C.toPlainString());
    			} else {
    				String num = C.toPlainString();
    				while(num.substring(num.length()-1).equals("0")) {
    					num=num.substring(0,num.length()-1);
    				}
    				int index = num.indexOf(".");
    				if (C.compareTo(BigDecimal.ZERO) < 0) {
    					if (C.compareTo(new BigDecimal("-1")) > 0) {
    						int exp = -1;
    						System.out.printf("-%s.%se%d\n", num.substring(3, 4), num.replace(".", "").substring(3), exp);
    					} else {
    						int exp = index - 2;
    						System.out.printf("-%s.%se%d\n", num.substring(1, 2), num.replace(".", "").substring(2), exp);
    					}
    				} else {
    					if (C.compareTo(new BigDecimal("1")) < 0) {
    						int key = 0;
    						for (int i = index + 1; i < num.length(); i++) {
    							if (num.charAt(i) != '0') {
    								key = i;
    								break;
    							}
    						}
    						int exp = index - key;
    						System.out.printf("%s.%se%d\n", num.substring(key, key + 1),
    								num.replace(".", "").substring(key), exp);
    					} else {
    						int exp = index - 1;
    						System.out.printf("%s.%se%d\n", num.substring(0, 1), num.replace(".", "").substring(1), exp);
    					}
    				}
    			}
    		}
    		sc.close();
    	}
    }
    
    
    • 1

    信息

    ID
    1148
    时间
    1000ms
    内存
    32MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者