Поскольку мы не циклически перемещаем оба итератора (num1 и num2) в одно и то же время, первое найденное нами число палиндрома будет самым большим. Нам не нужно проверять, является ли найденный нами палиндром самым большим. Это значительно сокращает время, необходимое для расчета.
package testing.project;
public class PalindromeThreeDigits {
public static void main(String[] args) {
int limit = 99;
int max = 999;
int num1 = max, num2, prod;
while(num1 > limit)
{
num2 = num1;
while(num2 > limit)
{
total = num1 * num2;
StringBuilder sb1 = new StringBuilder(""+prod);
String sb2 = ""+prod;
sb1.reverse();
if( sb2.equals(sb1.toString()) ) { //optimized here
//print and exit
}
num2--;
}
num1--;
}
}//end of main
}//end of class PalindromeThreeDigits
Оба Exception
и dict
реализованы в C.
Я думаю, что можно протестировать это follwing путь:
>>> class C(object): pass
...
>>> '__module__' in C.__dict__
True
>>> '__module__' in dict.__dict__
False
>>> '__module__' in Exception.__dict__
False
С тех пор Exception
и dict
имейте различные идеи того, как хранить их данные внутренне, они не совместимы, и таким образом Вы не можете наследоваться от обоих одновременно.
В более поздних версиях Python необходимо получить Исключение момент, Вы пытаетесь определить класс:
>>> class foo(dict, Exception):
... pass
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Error when calling the metaclass bases
multiple bases have instance lay-out conflict
Какая версия Python?
В 2.5.1, я не могу даже определить класс наследовать от обоих dict
и Exception
:
>>> class foo(dict, Exception):
... pass
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Error when calling the metaclass bases
multiple bases have instance lay-out conflict
При использовании более старой версии возможно, она не делает, эта проверка во время определения типа и конфликт вызывают причуды позже.
В настоящий момент я все еще не знаю, почему, но я обхожу его использование UserDict.UserDict
. Это медленнее, так как это - чистый Python, но я не думаю на этой части приложения, это будет неприятно.
Все еще заинтересованный об ответе так или иначе ;-)
Что случилось с этим?
class ConstraintFailure( Exception ):
def __init__( self, **failures ):
self.failures= failures # already a dict, don't need to do anything
def __getitem__( self, key ):
return self.failures.get(key)
Это - Исключение, и оно содержит другие исключения во внутреннем названном словаре failures
.
Вы могли обновить свою проблему для списка немного некоторая определенная вещь, которую это не может сделать?
try:
raise ConstraintFailure( x=ValueError, y=Exception )
except ConstraintFailure, e:
print e['x']
print e['y']
<type 'exceptions.ValueError'>
<type 'exceptions.Exception'>
Я почти уверен, что с версией 2.4 проблема вызвана исключениями, которые являются классами старого стиля.
$ python2.4
Python 2.4.4 (#1, Feb 19 2009, 09:13:34)
>>> type(dict)
<type 'type'>
>>> type(Exception)
<type 'classobj'>
>>> type(Exception())
<type 'instance'>
$ python2.5
Python 2.5.4 (r254:67916, Feb 17 2009, 23:11:16)
>>> type(Exception)
<type 'type'>
>>> type(Exception())
<type 'exceptions.Exception'>
В обеих версиях, как говорится в сообщении, исключения могут быть классами, экземплярами (классов старого стиля) или строки (не рекомендуется).
Начиная с версии 2.5 иерархия исключений, наконец, основана на новых классах стилей. И экземпляры новых классов стилей, которые наследуются от BaseException, теперь также разрешены. Но в 2.4 множественное наследование от Exception (класс старого стиля) и dict (класс нового стиля) приводит к новому классу стиля, который не допускается как исключение (смешивание старого и нового классов стиля, вероятно, в любом случае плохо).