需求:將多個個位數字(或多位數)拼接成一個新整數。如 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 防溢出);二進制處理用位運算。