LINUX.ORG.RU

[c++/C] проблема с палиндромами


0

1

брат учится на экон. факультете. Задали им, зачем-то, написать программу, которая пишет числа, допустим в стандартный вывод, если число и его квадрат оба являются палиндромами. Попросил написать меня. Ну я - легко. А вот застрял.

Я где-то «накосячил» в ф-ции is_palindrome. Посмотрите пожалуйста. Программа должна найти палиндромы до 13 разряда квадрата палиндрома. Для Int это слишком много. Какой тип данных лучше подходит? И как его правильно конвертировать потом в char? Спасибо!

#include <iostream>
#include <stdio.h>
#include <cstdlib>
#include <cmath>
#include <string.h>

 #define LENGHT 2 //2 только для теста пока

bool is_palindrome(char cWord[]);
int lenghtOfString(char cWord[]);

int main(int argc, char *argv[])
{
    int temp = 0;
    char cWord[LENGHT] = {0};
    char cWordW[LENGHT] = {0};
    bool goUntill = true;
    int i = 1;
    while (goUntill){
        sprintf(cWord, "%d", i); //конвертируем число в char
        if (is_palindrome(cWord)){
            temp=i * i;
            printf(" temp: %d \n", temp);
            sprintf(cWordW, "%d", temp);
            if (strlen(cWord) == LENGHT){
                    goUntill = false;
            }
            if (is_palindrome(cWordW)){
                    printf("%d является палиндромом \n", i);
            }
        }
        i++;
    }

    return EXIT_SUCCESS;
}

bool is_palindrome(char cWord[])    
{
    int i = 0;
    int lenght = strlen(cWord);
    for (i = 0; i <= (lenght - 1); i++){
            //Сравниваем первое с последним, второе в предпоследним...
            if(cWord[i] != cWord[((lenght - 1) - 1)]){
                if (cWord[i]+32 != cWord[((lenght-1)-1)] && cWord[i]-32 != cWord[((lenght -1)-i)]){
                        return true;
                }
            }
    }
    return false;
}





Последнее исправление: ciiccii (всего исправлений: 1)

>Какой тип данных лучше подходит?

std::string. Возможно придется самому делать длинное умножение.

elverion
()
Ответ на: комментарий от Boy_from_Jungle

хм, теперь да :) но проблема всё равно в другом месте. Он считает любое число палиндромом.

ciiccii
() автор топика

1. use std::string luke!
2.

bool is_palin.....(std::string str)
{
 int str_length = str.legth;
 bool flag = true;
 for (int i=0; i<str_length/2; i++) {
   if (str[i] != str[str_length-1]) {
     flag = false;
     break;
   }
 }
 return flag;
}

mi_estas
()
Ответ на: комментарий от mi_estas

если библиотека libastral установлена то так

bool is_palis....(SuperPuperAstralString str)
{
   return str.isPalindrome();
}

mi_estas
()

> найти палиндромы до 13 разряда квадрата палиндрома
Это значит, что надо найти все числа-палиндромы, квадраты которых меньше 2^13 и являются палиндромами?

metar ★★★
()
Ответ на: комментарий от morse

Сегодня великий день. Впервые мне прислали пачт из интернета. Рад. Пойду напьюсь сегодня.

mi_estas
()
bool is_palindrome(char cWord[])    
{
  int length = strlen(cWord)-1;
  for (int i = 0; i <= (length/2); ++i)
    {
      if(cWord[i] != cWord[length-i])
	  return false;
    }
  return true;
}

Как-то так...

encyrtid ★★★★★
()
Ответ на: комментарий от Eddy_Em

> ТСу надо гуглить в сторону «длинной» математики.
Та какой еще длинной математики? Там все в long long влазит, даже если ТС имел в виду числа, квадрат которых до 10^13.

metar ★★★
()
Ответ на: комментарий от metar

А ведь и правда. Я, просто, со своими 32-мя битами все никак не привыкну, что без ухищрений бывают числа больше ~2млрд =)

Eddy_Em ☆☆☆☆☆
()
#include <stdio.h> 
#include <cstring> 

bool ispal(char *str);

int main(int argc, char **argv)
{
   long x, sq;
   char x_s[20], sq_s[20];
   scanf("%ld", x);
   sq=x*x;
   sprintf(x_s, "%ld", x);
   sprintf(sq_s, "%ld", sq);
   if(ispal(x_s) && ispal(sq_s))
               printf("%s", "Палендромы");
        else
               printf("%s", "Не палендромы");
   return 0;
}

bool ispal(char *str)
{
   for(int i=0; i<strlen(str)/2; i++)
      if(str[0+i] != str[strlen(str)-1-i])
         return false;
   return true;
}

Эта вот штука точно компилируется и даже, возможно, работает :) Ваша ошибка в том, что не происходит сдвиг по правой границе т.е.

1- левая граница, 2 - правая граница.
Я на примере показываю работу вашей функции, при строке "12321\n"

12321\n
1   2

12321\n
 1  2

12321\n
  1 2
Если я ошибся, не пинайте ногами и не бейте по лицу :D

NaViKotE
()

Есть же класс BigInteger. Используй его, если что.

LongLiveUbuntu ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.