2015-06-27 2 views
-2

У меня есть простая программа, которая дает неверный вывод, ожидаемый результат - это цифры номера.Ошибка при извлечении цифр из целого числа

#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 (> = 0) и я получаю выход:

enter image description here

+1

[проверьте это] (http://ideone.com/Dw8a22) свой вывод. –

+0

@SouravKanta Почему я получаю неправильный вывод в своих CodeBlocks MingW? Это очень плохая ошибка. – adrian008

+0

Я понятия не имею. Ожидают, что кто-то, кто лучше c, скажет вам. Идеон дает вам правильный выход. –

ответ

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 не должен переполняться Integer. Чтобы найти цифры в цифрах, вам не нужны floor, pow или log10, достаточно только / и %.

+0

Я знаю решение, я хотел решить методом, который я использовал. – adrian008

+0

@ adrian008, какой способ? Посмотрите, что в функции 'printf', что вы делаете, я делаю ту же покупку, используя другую переменную, чтобы увидеть, производят ли они правильные значения или нет. Скажем, '1/0' может привести к краху вашей программы. –

+0

@JonathanLeffler, ошибка, просто скопирована и вставляется, вот почему 't' пришел, опечатка. –

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

Вы также можете написать 'while (t <= floor (log10 (n))), который будет более понятным, а' while (t <= d) 'будет проще. Это не объясняет, почему ОП видит 7 вместо вторых 5. Он объясняет, почему они не видят финала 1, но это официально не является частью вопроса. –

+0

Да, ** while (t <= d) ** намного чище. – artm

1

Чтобы узнать, почему вы получаете 7 вместо 5, вам нужно сделать серьезную диагностическую печать - mayb e используя код примерно так:

#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++), но я не сделал этого изменения.

На Mac под управлением OS X 10.10.3, используя 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.

Смежные вопросы