从整数中提取数字时出错

时间:2015-06-27 06:24:45

标签: c++ math int

我有一个简单的程序,输出错误,预期的输出是数字的数字。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>


using namespace std;

int main()
{
   int n = 125521;
   int d = floor(log10(n));
   printf("%d Digits\n",d+1);
   int t =0;
   while(floor(log10(n))-t)
   { printf("%d-----%d\n",(n/(int)pow(10,floor(log10(n))-t)%10),t); t++;}
   return 0;
}

这给出了输出

6 Digits
1-----0
2-----1
5-----2
7-----3
2-----4

奇怪的输出。为什么7来?

我知道如何通过其他方式获取数字,但我希望此解决方案能够正常运行。

现在正如答案所示,我摆脱了while循环中的错误(&gt; = 0) 我得到了输出:

enter image description here

3 个答案:

答案 0 :(得分:1)

在此行中放置适当的空格(n/(int)pow(10,floor(log10(n))-t)%10)

floor(log10(n))的多次冗余调用。

while loop 循环小于1的数字。

我不知道为什么你打印t除了数字,说:

1-----0
2-----1
     ^^^
你所说的是

Can't reproduce

你在找这个:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>

using namespace std;

int main() {
    int n = 550052111;
    int d = floor(log10(n));
    printf("%d Digits\n", d + 1);
    int t = 0;
    int power, divition, mod;
    int digitCount[10] = {0};
    while (d +1 - t) {
        power = (int) pow(10, d - t);
        divition = n / power;
        mod = divition % 10;
        digitCount[mod]++;
        t++;
    }

    for (t= 0; t < 10; t++) {
        if(digitCount[t]) {
            printf("%d-----%d\n", t, digitCount[t]);
        }
    }
    return 0;
}

输出:

9 Digits
0-----2
1-----3
2-----1
5-----3

警告:输入n不得溢出整数。要查找数字中的数字计数,您不需要floorpowlog10,只有/%就足够了。

答案 1 :(得分:1)

你的while循环中有一个错误。

while(floor(log10(n))-t)

应该是

while(0 <= floor(log10(n))-t)

您案例中的索引应该从0而不是1开始。

修复该错误,您应该获得正确的输出,如下所示:

6 Digits
1-----0
2-----1
5-----2
5-----3
2-----4
1-----5

答案 2 :(得分:1)

要找出你获得7而不是5的原因,你需要做一些严肃的诊断打印 - 也许使用这样的代码:

#include <cstdio>
#include <cmath>

using namespace std;

int main()
{
    int n = 125521;
    int d = floor(log10(n));
    printf("n = %d: %d Digits\n", n, d + 1);
    int t = 0;
    while (floor(log10(n)) >= t)
    {
        printf("t = %d: n = %d; L = log10(n) = %f; F = floor(L) = %f\n",
                t, n, log10(n), floor(log10(n)));
        printf("       T = F-t = %f;", floor(log10(n)) - t);
        printf(" P = pow(10,T)= %f\n", pow(10, floor(log10(n)) - t));
        printf("       I = (int)P = %d; D = n/I = %d; M = D %% 10 = %d\n",
               (int)pow(10, floor(log10(n)) - t),
               n / (int)pow(10, floor(log10(n)) - t),
               n / (int)pow(10, floor(log10(n)) - t) % 10);
        printf("%d-----%d\n", (n / (int)pow(10, floor(log10(n)) - t) % 10), t);
        t++;
    }
    return 0;
}

我修改了循环条件;旧式的Fortran II算术if条件在C中确实不是很好的风格。它还打印最后一个数字。如果循环写成for (int t = 0; t <= d; t++)会更好,但我没有做出改变。

在运行OS X 10.10.3的Mac上,使用GCC 5.1.0编译64位程序,结果是:

n = 125521: 6 Digits
t = 0: n = 125521; L = log10(n) = 5.098716; F = floor(L) = 5.000000
       T = F-t = 5.000000; P = pow(10,T)= 100000.000000
       I = (int)P = 100000; D = n/I = 1; M = D % 10 = 1
1-----0
t = 1: n = 125521; L = log10(n) = 5.098716; F = floor(L) = 5.000000
       T = F-t = 4.000000; P = pow(10,T)= 10000.000000
       I = (int)P = 10000; D = n/I = 12; M = D % 10 = 2
2-----1
t = 2: n = 125521; L = log10(n) = 5.098716; F = floor(L) = 5.000000
       T = F-t = 3.000000; P = pow(10,T)= 1000.000000
       I = (int)P = 1000; D = n/I = 125; M = D % 10 = 5
5-----2
t = 3: n = 125521; L = log10(n) = 5.098716; F = floor(L) = 5.000000
       T = F-t = 2.000000; P = pow(10,T)= 100.000000
       I = (int)P = 100; D = n/I = 1255; M = D % 10 = 5
5-----3
t = 4: n = 125521; L = log10(n) = 5.098716; F = floor(L) = 5.000000
       T = F-t = 1.000000; P = pow(10,T)= 10.000000
       I = (int)P = 10; D = n/I = 12552; M = D % 10 = 2
2-----4
t = 5: n = 125521; L = log10(n) = 5.098716; F = floor(L) = 5.000000
       T = F-t = 0.000000; P = pow(10,T)= 1.000000
       I = (int)P = 1; D = n/I = 125521; M = D % 10 = 1
1-----5

您应该运行此程序或非常相似的程序并显示中间计算的结果。然后,我们可以开始理解为什么你会看到7而不是5。