我已经给出了一些整数,我必须计算数字中特定数字的频率。 输入例子:
447474
228
6664
81
第一个数字表示列表中整数的个数。在这种情况下,我发现频率是4。我试图将整数更改为数组,但它不工作。
#include<iostream>
#include<cmath>
#include<vector>
using namespace std;
int main() {
int n;
cin>>n;
for (int i=0; i<n; i++)
{
int x;
cin>>x;
int frequency=0;
int t=log10(x);
int arr[t];
for (i=t; i>0; i--)
{
arr[i]=x%10;
x=x/10;
}
for(int i=0; i<t; i++)
{
if(arr[i]==4)
{
frequency++;
}
}
std::cout << frequency << std::endl;
}
return 0;
}
无需创建数组,也无需确定位数。循环直到数字为0。
int digitCount(int n, int d) {
if(n < 0) n = -n;
int count = 0;
for(; n != 0; n /= 10)
if(n % 10 == d) count++;
return count;
}
测试:
cout << digitCount(447474, 4) << endl;
cout << digitCount(-447474, 4) << endl;
输出:
4
4
您的代码使用了非标准c++的vla。参见为什么变长数组不是c++标准的一部分?
log10(x)
不是位数。例如log10(1234) == 3.09131516
,但它是4位数字。此外,在循环的第一次迭代中,您正在访问超出边界的数组:arr[t]
。在大小为t
的数组中有效的索引是0,1,2,...,t-1
。试图访问arr[t]
是未定义的行为。
实际上你不需要任何数组。您可以立即检查它是否为4
并计数,而不是将数字存储在数组中。
更简单的方法是将用户输入读取为std::string
:
#include <string>
#include <algorithm>
#include <iostream>
int main() {
std::string input;
std::cin >> input;
std::cout << std::count(input.begin(),input.end(),'4');
}
也许您应该添加一些检查来验证用户输入实际上是一个有效的数字。但是,同样在读取int
时,您应该验证输入。