一.回文数:
思路一:
负数肯定就不是回文数了,所以负数就直接返回flase,正数的话就一位位分解,然后构成一个
新的整数,然后去判断两者是否相等即可:
bool isPalindrome(int x) {
if (x<0){
return false;
}
int tmp=x;
long long overturn=0;
while(tmp){
overturn+=tmp%10;
tmp/=10;
overturn*=10;
}
overturn/=10;
if(overturn==x){
return true;
}
else
return false;
}
这里要注意两点一点就是类型要用长整形,因为如果输入的数过大,用int 去接受就会造成数据溢
出,第二点就是循环结束后,新的整数要/10,因为循环多循环了一次,就多了个0。
思路二:
利用sprintf函数将这个整形x写入到一个字符串中,然后再利用strlen求长度,从结尾和头去比较即
可。
bool isPalindrome(int x) {
char *str=(char*)malloc(sizeof(x)*64);
if(x<0){
return false;
}
if(x>=0){
sprintf(str,"%d",x);
int len=strlen(str);
for(int i=0;i<len/2;i++){
if(str[i]!=str[len-i-1]){
return false;
}
}
}
return true;
}
这里的小问题就是空间要开的大一点,要不然不够存储就会报错溢出。
二. 罗马数字转整数:
我们学过枚举,就是将一些字符改成数字。
所以我们这里利用枚举将所有的罗马数字变成阿拉伯数字,这样就更加方便,再利用switch case
语句去分析每一个存进字符串的字符然后根据情况再去进入不同的语句也就是不同的情况:
enum luoma{
I=1,
V=5,
X=10,
L=50,
C=100,
D=500,
M=1000
};
int romanToInt(char* s) {
int len = strlen(s);
int idx = 0, sum = 0;
while(idx < len){
switch(s[idx]){
case 'I':
if(s[idx + 1] == 'V'){sum += 4; idx++;}
else if(s[idx + 1] == 'X'){sum += 9; idx++;}
else{sum += I;}
break;
case 'V': sum+= V; break;
case 'X':
if(s[idx + 1] == 'L'){sum += 40; idx++;}
else if(s[idx + 1] == 'C'){sum +=90; idx++;}
else{sum += X;}
break;
case 'L': sum+= L; break;
case 'C':
if(s[idx + 1] == 'D'){sum += 400; idx++;}
else if(s[idx + 1] == 'M'){sum += 900; idx++;}
else{sum += C;}
break;
case 'D': sum+= D; break;
case 'M': sum+= M; break;
default: return -1;
}
idx++;
}
return sum;
}