未知整数长度下反转数字时保留前导零的C语言实现问询
如何反转整数并保留末尾的零(反转后作为前导零)?
原有的C程序用整数运算反转数字时,会自动“忽略”输入末尾的零——毕竟int类型本身就不存储前导零,反转3000得到的整数是3,打印出来自然就是3而不是0003。要解决这个问题,有两种靠谱的实现思路,我给你详细讲讲:
方法一:将输入当作字符串处理(最直观)
既然要保留所有数字字符,直接把输入读取成字符串,然后反转输出就行。这种方法绕开了整数类型的限制,能完美保留所有零:
#include <stdio.h> #include <string.h> int main(void) { char num[20]; // 定义足够长度的数组存储输入的数字字符串 printf("Enter an integer: "); scanf("%s", num); printf("Reversed Number = "); // 从字符串最后一位开始向前遍历打印 for (int i = strlen(num) - 1; i >= 0; i--) { printf("%c", num[i]); } printf("\n"); return 0; }
测试输入3000的话,程序会直接输出0003,完全符合需求。
方法二:整数运算+统计末尾零的数量
如果必须用整数运算的方式处理,可以先统计输入数字末尾的零的个数,反转剩下的非零部分后,再把统计好的零补在前面:
#include <stdio.h> int main(void) { int n, temp, reversedNumber = 0, remainder, zeroCount = 0; printf("Enter an integer: "); scanf("%d", &n); temp = n; // 用临时变量处理,避免修改原输入值 // 第一步:统计输入数字末尾的零的数量 while (temp != 0 && temp % 10 == 0) { zeroCount++; temp /= 10; } // 第二步:反转去掉末尾零后的数字 while (temp != 0) { remainder = temp % 10; reversedNumber = reversedNumber * 10 + remainder; temp /= 10; } // 第三步:先打印所有统计到的零,再打印反转后的数字 printf("Reversed Number = "); for (int i = 0; i < zeroCount; i++) { printf("0"); } printf("%d\n", reversedNumber); return 0; }
这个方法的逻辑是:先把输入里的末尾零“剥离”出来计数,反转剩下的有效数字,最后把零补在反转结果的前面,同样能得到0003的输出。
两种方法里,字符串处理的方式更简单易懂,还能避免整数溢出的问题(比如输入特别长的数字时,字符串能处理更多位数);整数运算的方式则适合必须用数值类型处理的场景。
内容的提问来源于stack exchange,提问作者Dominic Motuka
相关产品推荐
相关产品推荐

