Một ngày khác, giáo viên hóa học của tôi đã giải thích cho chúng tôi về ký hiệu khoa học (sử dụng một số nhỏ và nhân nó với lũy thừa mười để thể hiện số lượng lớn dễ dàng hơn), điều đó đưa tôi trở lại vài năm trước khi tôi biết nó lần đầu tiên. Sau khi học những điều cơ bản, chúng tôi đã thực hiện một loạt các câu hỏi toán học điển hình, một số câu hỏi như sau:
Trình bày các ký hiệu khoa học sau:
a) 50000000
b) 120000000000000
c) 90000000000000000000000000000000000000
d) pi ^ e ^ i ^ j ^ k ^ std :: vector
...
z) 200
...
Và tôi nghĩ, "Cái gì? Chúng tôi đã nói rằng ký hiệu khoa học đã được sử dụng để làm cho việc viết số lượng lớn hiệu quả hơn, nhưng một số trường hợp không hiệu quả hơn chút nào!"
Xem xét số
300
và đại diện của nó trong ký hiệu khoa học:
3x10^2
Cái gì, phiên bản có ký hiệu khoa học thực sự chiếm nhiều không gian hơn? Chúng ta không thể có điều đó bây giờ được không? (Không gian màn hình là quý giá.)
Chúng tôi có thể tự xác định xem có hiệu quả hơn không gian để viết một số trong ký hiệu khoa học hay không, hoặc ...
Bài tập
Chương trình hoặc chức năng của bạn sẽ lấy đầu vào một số dương n
kích thước tùy ý (tối đa với những gì ngôn ngữ của bạn hỗ trợ) và xuất ra phiên bản số được ký hiệu khoa học của số đó.
Tuy nhiên, nếu số gốc n
, sau khi loại bỏ các số 0 ở cuối và vị trí thập phân theo sau, sẽ lấy ít hơn hoặc cùng số lượng ký tự để hiển thị so với phiên bản được ký hiệu khoa học của nó, n
thay vào đó , bạn phải xuất số gốc đó.
Mã của bạn cần phải càng ngắn càng tốt bởi vì đầu ra cũng phải càng ngắn càng tốt.
Thông số kỹ thuật
Ký hiệu khoa học hiệu quả được định nghĩa như sau:
bx10^e
b
là số đầu vào được chia một cách thích hợp cho lũy thừa 10 sao cho 1 <= b < 10
. Số này phải xóa tất cả các số 0 (và dấu thập phân nếu cần), nhưng phải có độ chính xác của số gốc (tất nhiên là tối đa giới hạn dấu thập phân trong ngôn ngữ của bạn). Tức là 90000
trở thành 9
, 13.500
trở thành 1.35
, 0.000675
trở nên 6.75
vv Nếu số này kết thúc lên có chứa chữ số thập phân hơn ngôn ngữ của bạn có thể xử lý, nó nên được làm tròn với số lượng tối đa của chữ số thập phân.
e
là số mũ mà mười được tăng lên sao cho n = b x 10^e
(hãy nhớ rằng con số này cần phải âm nếu n
nhỏ hơn 1). Số này không được có bất kỳ số 0 ở cuối hoặc vị trí thập phân nào (chủ yếu vì nếu đó không phải là số nguyên thì có gì đó không ổn ...).
Các ký tự x10^
phải giữ nguyên như trong chuỗi giữa b
và e
.
Các trường hợp thử nghiệm
Input -> output
1 -> 1
20 -> 20
3000000 -> 3x10^6
400000 -> 400000
0.008093 -> 0.008093
0.007835000000000 -> 0.007835
0.000003000000 -> 3x10^-6
0.00000065 -> 6.5x10^-7
0 -> 0
Chấm điểm
Đây là mã golf , vì vậy mã ngắn nhất tính bằng byte thắng.
Các quy tắc khác và làm rõ
- Các số không theo dõi (và / hoặc vị trí thập phân kéo dài) không được tính vào số ký tự của số đầu vào ban đầu
n
. Hãy ghi nhớ điều đó cho các trường hợp như test case 6 - Bạn có thể giả sử rằng nếu số đầu vào nhỏ hơn 1, nó sẽ luôn bắt đầu bằng 0 thay cho chữ số đó (như trong các trường hợp thử nghiệm 5-8).
- Số đầu vào sẽ không bao giờ âm
- Được xây dựng để làm cho thách thức này sơ hở và sơ hở tiêu chuẩn không được phép
- Một dòng mới ở đầu ra là OK
EDIT
Cảm ơn user81655 vì đã chỉ ra các trường hợp thử nghiệm 7 và 8 có quyền hạn không chính xác là mười. Bây giờ tôi đã sửa chúng để đảm bảo mã của bạn đánh giá chúng chính xác.
e
: 9000 -> 9e3
(gần 9.000 !)
x10^
. Và nó sẽ là một chút làm lại cho câu hỏi, mà tôi không nghĩ là nó phù hợp bây giờ nó đã được đăng
pi^e^i^j^k^std::vector
sẽ là gì?