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

C語言數字拼接:將多個整數組合為新整數的多種方法

     編輯:C 語言問答

C語言實現數字拼接:n=1,m=2 → p=12 的數學與字符串兩種方案

需求:將多個個位數字(或多位數)拼接成一個新整數。如 1 和 2 拼成 12,或 12 和 34 拼成 1234。本文提供數學運算法與字符串法,並討論動態位數情況。

方法一:數學運算法(高效、無庫依賴)

核心公式:result = result * 10^digits(m) + m。需先計算被拼接數的位數。


#include <stdio.h>

// 計算正整數位數
int num_digits(int x) {
    if (x == 0) return 1;
    int d = 0;
    while (x) { x /= 10; d++; }
    return d;
}

// 拼接兩個正整數:a 在前,b 在後
int concat_int(int a, int b) {
    if (b < 0) return 0; // 簡化處理,不支持負數拼接
    int pow10 = 1;
    for (int i = 0; i < num_digits(b); i++) pow10 *= 10;
    return a * pow10 + b;
}

int main() {
    int n = 1, m = 2;
    printf("%d 和 %d 拼接 = %d\n", n, m, concat_int(n, m)); // 12
    
    int a = 12, b = 34;
    printf("%d 和 %d 拼接 = %d\n", a, b, concat_int(a, b)); // 1234
    return 0;
}

方法二:字符串法(直觀、支持任意長度、需防溢出)


#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// 返回動態分配的字符串,調用者需 free
char* concat_str(const char *a, const char *b) {
    size_t len_a = strlen(a), len_b = strlen(b);
    char *res = malloc(len_a + len_b + 1);
    if (!res) return NULL;
    strcpy(res, a);
    strcat(res, b);
    return res;
}

// 整數轉字符串拼接後再轉整數(注意溢出)
int concat_via_str(int a, int b) {
    char buf_a[20], buf_b[20], buf_res[40];
    sprintf(buf_a, "%d", a);
    sprintf(buf_b, "%d", b);
    strcpy(buf_res, buf_a);
    strcat(buf_res, buf_b);
    return atoi(buf_res); // 可能溢出,建議用 strtoll
}

int main() {
    char *s = concat_str("12", "34");
    printf("字符串拼接: %s\n", s); // "1234"
    free(s);
    
    printf("整數拼接: %d\n", concat_via_str(12, 34)); // 1234
    return 0;
}

進階:動態數量的數字拼接(可變參數/數組)


#include <stdio.h>
#include <stdarg.h>

// 拼接可變參數列表的正整數,以 -1 結束
int concat_multiple(int first, ...) {
    va_list ap;
    va_start(ap, first);
    int result = first;
    int val;
    while ((val = va_arg(ap, int)) != -1) {
        int pow10 = 1;
        int tmp = val;
        if (tmp == 0) pow10 = 10;
        else while (tmp) { tmp /= 10; pow10 *= 10; }
        result = result * pow10 + val;
    }
    va_end(ap);
    return result;
}

int main() {
    printf("%d\n", concat_multiple(1, 2, 3, -1));      // 123
    printf("%d\n", concat_multiple(12, 34, 56, -1));   // 123456
    return 0;
}

應用場景:二進制轉換中的位拼接

提到“短除法換二進制記錄 0/1”,實際是收集餘數位。更高效的做法是位運算:


void print_binary(unsigned int n) {
    if (n == 0) { printf("0"); return; }
    char buf[33]; int i = 0;
    while (n) { buf[i++] = (n & 1) + '0'; n >>= 1; }
    while (i--) putchar(buf[i]); // 逆序輸出
}

總結

方法優點缺點適用場景
數學運算高效、無庫依賴、O(1) 空間需手動處理位數、易溢出嵌入式、高性能、固定少量拼接
字符串直觀、支持超長、易調試需動態內存、轉換開銷大通用應用、位數不固定、原型開發
位運算極快、硬件級僅限 2 的冪次基數二進制/十六進制轉換、標志位操作

選擇建議:嵌入式/高性能首選數學法;通用業務邏輯用字符串法(配合 strtoll 防溢出);二進制處理用位運算。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved