標籤:

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用的有問題

如圖:

http://www.cplusplus.com/reference/cmath/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程序是都必須新建工程嗎?

TAG:C編程語言 | CC |