首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

HDOJ 排序題解:pow 函數類型陷阱與大整數分割排序

     編輯:關於C++

關鍵提示:pow 函數定義在 <math.h> 中,其參數與返回值均為浮點型(double 或 float)。調用時需注意類型轉換,避免精度丟失導致錯誤。

題目大意

輸入一行數字字符串(長度 ≤ 1000),將其中的 '5' 視為分隔符,分割得到若干非負整數(忽略前導零,全零視為 0)。對分割出的整數按升序排序輸出,相鄰數字用空格分隔。

樣例:

輸入:0051231232050775
輸出:0 77 12312320

算法分析

本題核心難點在於:

  1. 字符串分割處理:需正確處理連續的 '5'、首尾的 '5' 以及前導零。
  2. 大整數處理:分割出的整數可能達到 100,000,000,需用 64 位整數或 double 存儲。
  3. pow 函數陷阱:pow(10, n) 返回 double,直接用於整數運算會導致精度誤差,需加 1.0 強制浮點運算或改用整數累乘。

AC 代碼(C++)

#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 輸出格式。
  • 分割邏輯需覆蓋:開頭 '5'、連續 '5'、結尾非 '5' 三種邊界情況。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved