關鍵提示:pow 函數定義在 <math.h> 中,其參數與返回值均為浮點型(double 或 float)。調用時需注意類型轉換,避免精度丟失導致錯誤。
輸入一行數字字符串(長度 ≤ 1000),將其中的 '5' 視為分隔符,分割得到若干非負整數(忽略前導零,全零視為 0)。對分割出的整數按升序排序輸出,相鄰數字用空格分隔。
樣例:
輸入:0051231232050775 輸出:0 77 12312320
本題核心難點在於:
double 存儲。pow(10, n) 返回 double,直接用於整數運算會導致精度誤差,需加 1.0 強制浮點運算或改用整數累乘。#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int main() {
char str[1100];
double b[1100]; // 存儲分割出的數字
while (scanf("%s", str) != EOF) {
int L = strlen(str);
memset(b, 0, sizeof(b));
int t = 0; // 當前數字索引
int j = 0; // 當前數字的位數計數
int a[1100]; // 暫存當前數字的各位數字
for (int i = 0; i < L; ++i) {
if (str[i] == '5') {
if (i == 0 || str[i-1] == '5') continue; // 跳過首個或連續的 '5'
// 將暫存的數字位組合成完整數值
for (int k = 0; k < j; ++k) {
b[t] += a[k] * pow(10.0, (j - 1 - k) * 1.0);
}
j = 0;
memset(a, 0, sizeof(a));
++t;
continue;
}
a[j++] = str[i] - '0';
// 處理字符串結尾非 '5' 的情況
if (i == L - 1) {
for (int k = 0; k < j; ++k) {
b[t] += a[k] * pow(10.0, (j - 1 - k) * 1.0);
}
++t;
}
}
sort(b, b + t);
// 輸出:%.0lf 保證不輸出小數部分
printf("%.0lf", b[0]);
for (int i = 1; i < t; ++i) printf(" %.0lf", b[i]);
printf("\n");
}
return 0;
}
pow(10.0, exp) 中 10.0 強制雙精度運算,避免整數參數隱式轉換導致的精度問題。double 陣列存儲大整數,配合 %.0lf 輸出格式。