c/c++中簡單加法出現奇怪的錯誤?
下面這段代碼想要把字元串反轉然後變成數字,但是三位數以上時每次結果都少1是怎麼回事?以下是代碼和運行結果。
估計那個 pow() 有問題。 不考慮性能和溢出的話,我會這麼寫:
#include &
int reverse(const char* s) {
return *s ? *s - "0" + reverse(s + 1) * 10 : 0;
}
int main() {
std::cout &<&< reverse("986") &<&< std::endl;
}
你大概用的是很老的編譯器/標準。
舊的pow(x, y)是由exp(y*log(x))實現的,會導致不精確的返回值如99.999999,當你將其轉換為整型值時會向下取整為99,所以會-1(s)【逃
解決方法,改代碼的話上面兩個回答都給出了就不說了,用一個更現代一點的編譯器也能解決你的問題。
pow函數的原因,換一種寫法就行了
^_^ 逆轉字元串後用atoi
int reverse(const char *s, int len)
{
char t[len]={0};
for(int i=0;i&
pow用的有問題
如圖:補充一個尾遞歸的方法int reverse(int acc, const char* s) { return *s ? reverse(acc*10+(*s-『0』), s+1) : acc;}
int str_to_int_reverse(char* str, size_t len)
{
int result = 0, coefficient = 1;
for (size_t i=0; i& { //char s = ; int ith_element = (str[i] - "0"); ith_element *= coefficient; coefficient *= 10; result += ith_element; } return resu<
}
VS下測試了沒問題
你得到了一個99.99999999999,然後`int(99.9999999)=99`
為啥要每次算pow。。難道不應該
```
int p = 1;
int result = 0;
for (int i = 0; i &< length; i++) {
result += p * (start[i] - "0");
p *= 10;
}
```
要是你真想解決這個問題,換編譯器吧;什麼辣雞編譯器我猜是mingw
推薦閱讀:
※如何使用C++11實現跨平台的定時器timer?
※在 Windows 上不用 Win32 API 可以繪製出一個窗口么?
※我用的是visual studio 2010 c語言為什麼學了好長時間還是控制台程序和dos窗口啊?
※為什麼使用virtual關鍵字在C++與C#會出現不同的效果?求解答。
※使用visual studio 2012編寫每一個c程序是都必須新建工程嗎?