2014-09-04 3 views
-1

Я пытаюсь решить задачу 4-Project Euler, и я застрял. Поэтому мне нужно немного помочь с моим кодом. Вот проблема, которую я пытаюсь решить:Palindrom checker, неправильный вывод

Палиндромное число читается одинаково в обоих направлениях. Самый большой палиндром, полученный из продукта двух двузначных чисел, составляет 9009 = 91 × 99.

Найти самый большой палиндром из продукта двух трехзначных чисел.

Код:

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

int is_palindrom(int number, int revrse) { 
    char str1[6]; 
    char str2[6]; 

    sprintf(str1, "%d", number); 
    sprintf(str2, "%d", revrse); 

    return strcmp(str1, str2); 
} 

int main(void) { 
    int number, revrse; 
    int i, j, temp; 
    int maks; 

    for(i=999;i>99;i--) 
     for(j=999;j>99;j--) { 
      temp = number = i*j; 
      while (temp != 0) { 
       revrse = revrse * 10; 
       revrse = revrse + temp%10; 
       temp = temp/10; 
      } 
      if(is_palindrom(number, revrse)==0 && number > maks) 
       maks = number; 
     } 
    printf("%d",maks); 
    return 0; 
} 
+0

Просьба уточнить вашу конкретную проблему или добавить дополнительные сведения, чтобы точно указать, что вам нужно. Как это написано в настоящее время, трудно точно сказать, что вы просите. См. Страницу [Как спросить] (http://stackoverflow.com/help/how-to-ask), чтобы помочь прояснить этот вопрос. – usr2564301

+0

'char str1 [7]; char str2 [7];' ... 'int maks = 0;' ... 'revrse = 0; while (temp! = 0) {' – BLUEPIXY

ответ

1

Чтобы получить обратную форму вашего номера правильно, вам нужно сначала установить начальное значение для revrse из 0 для каждой итерации вашего цикла, в противном случае поведение не определено. Это также помогает установить начальное значение для maks для сравнения. Наконец, зачем использовать функцию для проверки палиндромов, когда вы можете просто проверить равенство между вашим номером и его обратным?

int main() 
{ 
    int number; 
    int i,j,temp; 
    int maks = -1; 
    int revrse; 

    for(i=999;i>99;i--) { 
     for(j=999;j>99;j--) { 
      number = i*j; 
      revrse = 0; 
      temp=number; 
      while (temp != 0){ 
       revrse = revrse * 10; 
       revrse = revrse + temp%10; 
       temp = temp/10; 
      } 
      if(number == revrse) { 
       if(number > maks) { 
        maks = number; 
       } 
      } 
     } 
    } 
    printf("%d",maks); 
    return 0; 
} 
+0

Спасибо за помощь. Я был настолько смущен, почему он не работал должным образом, что я пропустил интим. те 2 ints. – korxz

5

revrse вар не инициализированы, так что мусор в нем. Помните, что всегда начинайте переменную!

2

Дополняя ответ от @kleszcz, revrse всегда должны быть инициализированы перед началом цикла while, в противном случае, он будет держать предыдущее значение (и мусор в первой итерации, как он разумно указывал).

Другая проблема заключается в том, что вам не нужна функция is_palindrome. Вы можете проверить это напрямую, если числа равны.

Смежные вопросы