2015-06-28 4 views
1

Возможно, он уже был размещен где-то, так как это проблема Эйлера проекта, но у меня нет проблемы с решением конкретной проблемы, хотя у меня есть проблема с кодом, который я написал , так как я не могу найти ошибку.Крупнейший продукт палиндрома из двух трехзначных чисел

Я предполагаю, что я что-то наблюдаю при печати или запоминании ценностей, но я не уверен. В любом случае, вот мой код:

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

int main(){ 
int x = 999, y = 999, z = 0, w = 0, a=0, *largest = a; 
for (x; x > 99; x--){ 
    for (y; y > 99; y--){ 
     z = x*y; 
     while (z != 0){ 
      w = w * 10; 
      w = w + z % 10; 
      z = z/10; 
     } 
     if (x*y == w){ 
      a = w; 
      goto stop; 
     } 
     w = 0; 
    } 
} 
stop: printf("%d\n", largest); 
system("pause"); 
return 0; 
} 

Я знаю, что и самый большой и вещи не нужны, я просто тестирование много меняется все такие вещи, используя указатели и то, что так нет, поэтому нет необходимости платить большое внимание к этой части кода.

+1

Используйте '* крупнейший = & a' –

+0

Было бы чистейший установить' ш = 0; ', прежде чем идти создать обратную величину 'z' , а не делать это в милях в конце цикла. Вы могли бы даже использовать: 'int w = 0; int z = x * y; 'в теле цикла' for', ограничивая область переменных. –

ответ

1

Этот код присваивает наибольшее значение продукта в a, но вы печатаете largest, который является указателем. Ваша программа не нуждается в указателе largest.

Ваш код также не работает, потому что вы

  • не проверяют, если по величине больше, чем предыдущий один
  • не сбрасывают y к 999 во внутреннем цикле.

С учетом указанных выше двух исправлений, это будет выглядеть так:

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

int main(void){ 
int x = 999, y = 999, z = 0, w = 0, a=0; 

for (x; x > 99; x--){ 
    for (y=999; y > 99; y--){ 
     z = x*y; 
     while (z != 0){ 
      w = w * 10; 
      w = w + z % 10; 
      z = z/10; 
     } 
     if (x*y == w && a<x*y){ 
      a = w; 
     } 
     w = 0; 
    } 
} 
printf("%d\n", a); 
return 0; 
} 
+0

Thank вы, я понимаю, что происходит, или, по крайней мере, я думаю, что знаю. По-видимому, переменная y осталась прежней, когда она достигла 100. Что касается самого большого, я знаю, что он был избыточным, просто начал играть, так как я не мог отличить нуль – EternalEnvy

+0

Еще одна вещь, однако, является условием для EternalEnvy

+0

hehe..Вы можете назвать наибольшее, если это ясно. Это можно улучшить, чтобы разбить цикл раньше. Например, '101 * 101' (' 10201') также соответствует вашим критериям. Но это не то, что вы хотите. Я оставлю его вам для дальнейшего улучшения :) –

0

Прежде всего, вы назначаете тип Int к типу INT * в операторе

*largest=a; 

сделать это * крупнейший = & а;

Кроме того при печати использовать оператор * перед тем крупнейшим

stop: printf("%d\n", *largest); 

Наконец, чтобы добавить вашу логику, может быть неисправен, как вы проверяете:

999X999, 999X998, 999X997 и так далее ..... ...

однако 999 * 997 составляет менее 998 * 998, и, следовательно, ваш код может привести к более низкому числу паллиндрома, чем это возможно.

+0

Правильно, я просто оставил самое большое и с тех пор, как я был в отчаянии и пытался все, я поставил их так, как они должны быть. Это будет продолжать возвращать 0. – EternalEnvy

+0

Разве он не должен просто печатать и заканчивать, как только число палиндром? Не уверен, что я получаю то, что вы говорите. – EternalEnvy

+0

Я говорю, что вы проверяете, является ли 999X999 паллиндром. Предположим, что его нет. В противном случае вы проверяете, является ли 998X999 паллиндром или нет. Давайте снова предположим, что это не паллиндром. теперь идет основная часть. Вы проверяете, является ли 999X997 паллиндром или нет. Однако 999X998 дает большее количество, чем 999X997. Таким образом, вы продолжаете проверять меньшие номера, когда было еще больше номера для проверки (998X998). –

1

Как упомянуто rakeb, вы должны использовать: * Крупнейший = &

Кроме того, причина, вы не получаете правильный ответ потому, что ваш, если заявление никогда не верно, так «а» всегда будет оставаться 0.

+0

Я чувствую, что это то, что происходит, дело в том, что я не уверен, почему это так – EternalEnvy

0

посланной код не в чисто компиляции.

Suggest всегда позволяет все предупреждения при компиляции

(для НКУ, как минимум, использовать «-Wall -Wextra -pedantic»)

Закрепить предупреждения, не только пытаются скрыть их.

Затем опубликовать исправленный код, если он по-прежнему отображает неполадку

+0

Не было ни одного из тех, кто в визуальной студии, используя что для компиляции, пока я не получу свой Linux-диск, извините – EternalEnvy

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