这是我用来反转数字的程序。但是当我输入5位数作为输入时,有时候答案是正确的,有时是正面的。
#include<dos.h>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
int main()
{
clrscr();
int a,b,c;
b=0;
printf("Enter the no");
scanf("%d",&a);
c=a;
while(a>0)
{
b=(b*10)+(a%10);
a=a/10;
}
printf("\noriginal no %d",c);
printf("\nreversed no is %d",b);
getch();
return 0;
}
如果输入:12111
输出:11121
整数的限制是从-32768到32767,那么为什么答案是否定的? 我尝试使用很长时间,但我的反转数字为0。
答案 0 :(得分:4)
看起来这是一个16位的DOS程序?所以你的int
只有16位/ 2字节,你的程序溢出它。
你可以尝试检测这种情况何时会发生,和/或使用unsigned
来避免负数或使用long
代替int
来存储更大的值(尽管此程序仍然存在如果你溢出,输出错误的答案。)
总体目标是什么? - 您可以通过反转字符串来实现吗?
答案 1 :(得分:3)
正如Bathsheba所说,sizeof(int)
显然是2,并且考虑到你正在使用的标题,平台是MS-DOS,这意味着你的int
只有16位信息可用。因为第一位是符号位,所以留下15位,2 ^ 15是32768,这意味着你的范围是-32767 .. + 32767。您想要的是unsigned int
和%u
scanf
和printf
。这将允许您使用0..65535。
需要能够处理所有5位数字吗?切换到long
代替(除了分别使用%ld
或%lu
签名或未签名之外,如果您签名或签名无关紧要),您将拥有-2147483648 .. +2147483647(签名)或0..4294967295(无符号),这将为您提供5位数字的足够范围。
如果您在使用long时出现问题且scanf和printf的格式正确,则问题在于您的逻辑,而不是至少读取数字。
答案 2 :(得分:2)
如果限制为32767,则反转22333将产生33322,这大于限制!!!
如果您想使用long
代替int
,那么您还应该使用"%ld"
代替"%d"
。