#include <stdio.h>
#include <conio.h>
//#include <string.h>
unsigned int symmetry(char* ll)
{
char* p = ll;
long int i = 0;
long int temper = 0;
unsigned long int nNum = 0;
/*判断输入是否为空,为空返回2*/
if ('\0' == *p)
return 2;
/*将字符串转换为正整数*/
while ('\0' != *p)
{
/*判断字符是否为数字,包含非数字返回3*/
if (*p < '0' || *p > '9')
return 3;
/*判断是否溢出长整型数,溢出返回4*/
if ((nNum > 429496729) || (*p-'0'>= 4294967295-nNum*10)) //主要判断最后一次,即p指向最后一位时
//if ((*p-'0'+nNum*10) > 4294967295),这样写的时候,如果本身溢出的话,前者已经溢出了
return 4;
nNum = *p-'0'+nNum*10; //nNum为unsigned long int 型,不然long int的nNum可能会溢出2147483647
p++;
}
/*将数据逆序组合*/
i= nNum;
while (i)
{
if (i%10 > 4294967295-temper*10) /*判断逆序后是否溢出长整型数,溢出返回5*/
//if ((i%10+temper*10) > 4294967295),这样写的时候,如果本身溢出的话,前者已经溢出了
return 5; /*主要判断最后一次*/
temper = temper*10 + i%10;
i/=10;
}
return(temper == nNum); //是回文返回1,非回文返回0
}
unsigned int main()
{
char l[20];
printf("insert a long value:\n");
scanf("%s",l);
unsigned int b = symmetry(l);
printf("%d",b);
getch();
return b;
}
以上方法中的逆序方法copy别人的,比较好,比较简练,但是稍难理解;
还是认为先判断输入数据位数,根据位数来判断会跟容易些;
有时候难的地方不是对于正确的输入怎么样实现,而是对于各种错误的输入怎么样判断;