我有一个简单的程序,输出错误,预期的输出是数字的数字。
#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) 我得到了输出:
答案 0 :(得分:1)
在此行中放置适当的空格(n/(int)pow(10,floor(log10(n))-t)%10)
。
floor(log10(n))
的多次冗余调用。
while loop
循环小于1
的数字。
我不知道为什么你打印t
除了数字,说:
1-----0
2-----1
^^^
你所说的是
你在找这个:
#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
不得溢出整数。要查找数字中的数字计数,您不需要floor
,pow
或log10
,只有/
和%
就足够了。
答案 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。