方法一:
void printd(int n) {
char s[12];
int sign = 0;
if (n < 0) {
sign = 1;
n = -n;
}
int i = 0;
if (n == -n) {
n = ~n;
s[i++] = n % 10 + '1';
n /= 10;
}
do {
s[i++] = n % 10 + '0';
} while ((n /= 10) != 0);
if (sign == 1) {
s[i++] = '-';
}
s[i] = '\0';
reverse(s);
printf(s);
}
方法二:
1234
打印4前先打印3
打印3前先打印2
打印2前先打印1
打印1234的个位数前先打印123的个位数
打印123的个位数前先打印12的个位数
打印12的个位数前先打印1
打印 n 的个位数前先打印 n/10 的个位数
除非 n < 10
void printd(int n) {
// 打印 n 的个位数前先打印 n/10 的个位数
if (n >= 10) {
printd(n/10);
}
// 打印 n 的个位数
printf("%c", n % 10 + '0');
}
考虑负数:
void printd(int n) {
if (n < 0) {
putchar('-');
n = -n;
// 考虑溢出
if (n == -n) {
n = ~n;
// 先打印前 n-1 位数
printd(n/10);
putchar(n % 10 + '1');
return;
}
}
if (n >= 10) {
printd(n/10);
}
putchar(n % 10 + '0');
}
反转字符串所需函数。
void swap(char s[], int i, int j) {
char c = s[j];
s[j] = s[i];
s[i] = c;
}
// 计算字符个数,不包括 '\0'
int leng(char s[]) {
int i = 0;
while (s[i] != '\0') {i++;}
return i;
}
void reverse(char s[]) {
int length = leng(s);
for (int i = 0; i < length / 2; i++) {
swap(s, i, length-1-i);
}
}