У меня есть небольшая проблема при назначении результата переменной, это происходит в первый раз для меня сейчас. Я называю Convert() с «AAA» в качестве параметра, вот мой результат:Число, меняющее значение при присвоении переменной?
aaa
**676** *(value from cout)* = 26^(3-1)*1 **675** *(value of the variable)*
+26 = 26^(3-2)*1 700
+1 = 26^(3-3)*1 701
701
А вот код:
string alphabet="abcdefghijklmnopqrstuvwxyz";
unsigned long long Convert(string &str){
unsigned long long wvalue=0;
for(int i=0;i<str.size();++i){
size_t found=alphabet.find(str[i]);
if(found==string::npos)
cout<<"Please enter only lowercase letters of the english alphabet!"<<endl;
unsigned long long add=((found+1)*pow(26,(str.size()-(i+1))));
wvalue+=add;
if(i>0)cout<<"+";
cout<<"\t"<<((found+1)*pow(26,(str.size()-(i+1))))<<" = "<<"26^("<<str.size()<<"-"<<(i+1) <<")*"<<(found+1)<<"\t"<<wvalue<<endl;
}
return wvalue;
}
Скорее всего, я что-то очень очевидное не хватает, но я не могу выясните это.
((found+1)*pow(26,(str.size()-(i+1))))
делает расчет, и это делает, как предполагается, в результате в соиЬ-даного правильно. Но переменная вычитается 1 в первых двух присваиваниях.
Спасибо за ответ. Я все еще не понимаю, почему 26^2 усекается до 25 при преобразовании из double в int, но по крайней мере я знаю, что это значит и может действовать соответствующим образом. –
Я только заметил, что вы хотите иметь самый правый (последний) символ, чтобы иметь наименьшее значение в вашей сумме. Чтобы добиться этого с помощью метода «умножить в каждом шаге», вам нужно итератировать в обратном направлении по строке. Я предлагаю использовать итераторы для этого. Чтобы итератировать в обратном направлении, просто используйте 'string.rbegin()' и 'string.rend()' и увеличивайте итератор на каждом шаге. Пример можно найти здесь (http://www.cplusplus.com/reference/string/string/rend/). – leemes
Для ошибок округления с плавающей точкой [прочитайте эту очень информативную статью] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html#680). Я знаю, что это долго, вам не обязательно все это читать, но особенно раздел об ошибках округления объясняет, что происходит в вашем коде. – leemes