1547 - 字符串处理

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 32 MB
读入两个字符串,字符串除了数字还可能包括 '—'、'E'、'e'、'.',相加之后输出结果,如果是浮点型,要求用科学计数法表示(最多包含10个有效数字)。

题目输入

输入包含多组测试数据。

每组输入占两行,每行一个字符串,测试数据保证字符串的构成严格按照题目中的描述。

题目输出

输出两个数字相加的结果,每组输出占一行。

输入/输出样例

输入格式

34.56
2.45e2

输出格式

2.7956e2

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();
	}
}