Я попытался проверить, является ли число палиндромом с помощью следующего кода:
unsigned short digitsof (unsigned int x)
{
unsigned short n = 0;
while (x)
{
x /= 10;
n++;
}
return n;
}
bool ispalindrome (unsigned int x)
{
unsigned short digits = digitsof (x);
for (unsigned short i = 1; i <= digits / 2; i++)
{
if (x % (unsigned int)pow (10, i) != x % (unsigned int)pow (10, digits - 1 + i))
{
return false;
}
}
return true;
}
Однако следующий код не может проверить палиндромы — false всегда возвращается, даже если число является палиндромом.
Кто-нибудь может указать на ошибку?
(Обратите внимание: мне не интересно превращать его в строку и переворачивать, чтобы увидеть, в чем проблема: скорее, мне интересно знать, где ошибка в приведенном выше коде.)
Проблема заключается в следующем:
x % (unsigned int)pow (10, i)
Давай попробуем:
x =504405
i =3
SO I want 4.
x % 10^3 => 504405 %1000 => 405 NOT 4
Как насчет
x / (unsigned int)pow (10, i -1) % 10
Лично я просто собрал бы строку из числа, а затем обработал бы ее как обычную проверку палиндрома (убедитесь, что каждый символ в первой половине совпадает с length()-index
).
x % (unsigned int)pow (10, i)
это не шестая цифра.
Просто для получения дополнительной информации! Следующие две функции работают для меня:
double digitsof (double x)
{
double n = 0;
while (x > 1)
{
x /= 10;
n++;
}
return n;
}
bool ispalindrome (double x)
{
double digits = digitsof (x);
double temp = x;
for(double i = 1; i <= digits/2; i++)
{
float y = (int)temp % 10;
cout<<y<<endl;
temp = temp/10;
float z = (int)x / (int)pow(10 , digits - i);
cout<<(int)z<<endl;
x = (int)x % (int)pow(10 , digits - i);
if(y != z)
return false;
}
return true;
}
Код для проверки, является ли данный номер палиндромом или нет в JAVA
import java.util.*;
public class HelloWorld{
private static int countDigits(int num) {
int count = 0;
while(num>0) {
count++;
num /= 10;
}
return count;
}
public static boolean isPalin(int num) {
int digs = HelloWorld.countDigits(num);
int divderToFindMSD = 1;
int divderToFindLSD = 1;
for (int i = 0; i< digs -1; i++)
divderToFindMSD *= 10;
int mid = digs/2;
while(mid-- != 0)
{
int msd = (num/divderToFindMSD)%10;
int lsd = (num/divderToFindLSD)%10;
if(msd!=lsd)
return false;
divderToFindMSD /= 10;
divderToFindLSD *= 10;
}
return true;
}
public static void main(String []args) {
boolean isPalin = HelloWorld.isPalin(1221);
System.out.println("Results: " + isPalin);
}
}