- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在做一个名为PowerBall数字彩票统计的作业。 PowerBall号码已创建到一个文本文件中。在我解释我的问题之前,一个强力球有5个数字,范围从1-69,第6个数字是BAll,它是1-26之间的数字。我在程序中所做的第一件事是创建一个数组以传递文件中的所有值,然后我将一个数组中的5个幂分离,将另一个球中的BALL分离。现在的问题是,我一直在试图找出如何在持有幂的数组以及持有球的数组中找到前10个公共(public)数字。
为了解决这个问题,我使用了频率函数,并尝试比较数组中每个值的频率,但是最终获得了每个频率以随机顺序出现的次数。我曾想过使用排序算法,但是由于我试图显示数字及其频率,所以它不起作用,而排序算法只会帮助我显示频率而不是顺序显示数字和频率。
供参考,我使用的值是:
39 12 21 23 67 6
33 43 60 59 15 4
25 16 32 49 19 4
54 50 21 64 68 4
44 62 20 37 16 12
66 52 50 24 25 5
10 53 50 63 14 21
67 30 34 16 53 21
69 36 45 47 18 14
45 5 59 55 50 14
#include <iostream>
#include <cctype>
#include <fstream>
#include <cstring>
using namespace std;
//Function prototype.
void powerValues(int [10][6], int [10], int [10][5]);
int frequency26(int [10], int);
int frequency69(int [][5], int);
int main()
{
int num[10][6];
int powerBall26[10];
int powerBall69[10][5];
//Function to store values from file in corresponding variable.
powerValues(num, powerBall26, powerBall69);
//Trying to find most frequent numbers to list top 10 common ones.
for(int i = 1; i <= 69; i++)
{
for(int j = 0; j < 1; j++)
{
if(frequency69(powerBall69, i) > frequency69(powerBall69, 1))
{
cout << i << " " << frequency69(powerBall69, i) << endl;
}
}
}
return 0;
}
//This function grabs numbers from file to save numbers separately into two arrays.
//One array for powers(1-69) and other one for the powerBall(1-26).
void powerValues(int num[10][6], int powerBall26[10], int powerBall69[10][5])
{
ifstream inFile;
inFile.open("lotteryNumbers.txt");
//Passing values from file into temp array.
for(int i = 0; i < 10; i++)
{
for(int k = 0; k < 6; k++)
{
inFile >> num[i][k];
}
}
//This loop stores the 6th power(AKA PowerBall) in array.
for(int i = 0; i < 10; i++)
{
powerBall26[i] = num[i][5];
}
//This loop stores the first 5 powers in array.
for(int i = 0; i < 10; i++)
{
for(int j = 0; j < 5; j++)
{
powerBall69[i][j] = num[i][j];
}
}
inFile.close();
}
//Calculates frequency of a number(1-26) in powerBall26.
int frequency26(int powerBall26[10], int value)
{
int freq = 0;
for(int i = 0; i < 10; i++)
{
if(powerBall26[i] == value)
freq++;
}
return freq;
}
//Calculates frequency of a number(1-69) in powerBall69.
int frequency69(int powerBall69[][5], int value)
{
int freq = 0;
for(int i = 0; i < 10; i++)
{
for(int j = 0; j < 5; j++)
{
if(powerBall69[i][j] == value)
freq++;
}
}
return freq;
}
最佳答案
如果您仍在设法获取彩票号码和强力球的前10个最频繁的号码,然后继续从Sam的评论开始,则可以使用简单的struct
(或pair
等)来协调彩票号码1 -69及其在您输入中的出现频率(与强力球相同)。您甚至可以为此使用每行2个int
的2D数组,但是使用结构可能提供更具可读性的实现,因为它允许您使用成员名称(例如num
和count
),而不是索引0
或1
。
您只需要做一个简单的struct
,即可通过一种方式映射每个数字的频率,以便以后进行排序以保留频率及其与之关联的数字之间的关系。
struct freq {
int num, count; /* struct capturing number & count */
};
array
的容器成员函数可用,例如开始和结束迭代器,交换等,以及允许将数组与
algorithm
一起使用只需通过传递
.begin()
和
.end()
迭代器以及一个compare表达式,就可以创建
std::sort库。
array
可以执行以下操作:
#define NMAX 69 /* if you need a constant, #define one (or more) */
#define BMAX 26
...
std::array<freq, NMAX> nfreq; /* array of struct for number frequency */
std::array<freq, BMAX> bfreq; /* array of struct for ball frequency */
.num
成员,并将每个
.count
成员设置为零(对于球频率数组则设置为1-26),例如
for (int i = 0; i < NMAX; i++) /* initialize number freq array */
nfreq[i].num = i + 1, nfreq[i].count = 0;
for (int i = 0; i < BMAX; i++) /* initialize ball freq array */
bfreq[i].num = i + 1, bfreq[i].count = 0;
.num
成员初始化为
i + 1
而不是
i
,以适应您的索引将为0-68的事实,而您需要将存储的数字设为1-69。)
nfreq
中的计数,并使用每行中的最后一个数字对强力球频率数组
bfreq
(球频率)执行相同的操作。例如:
std::ifstream f (argv[1]); /* open filename given by 1st argument */
/* validations omitted */
while (getline (f, s)) { /* read each line/fill freq arrays */
std::stringstream ss (s); /* create stringstream from line */
size_t i = 0; /* initialize counter zero */
int tmp; /* tmp value to hold int read */
while (i < NVAL && ss >> tmp) /* read up to NVAL numbers */
nfreq[tmp - 1].count++, i++; /* increment nfreq count */
if (i < NVAL) { /* validate all number values read */
std::cerr << "error: less than " << NVAL << "values read.\n";
return 1;
}
if (!(ss >> tmp)) { /* validate ball value read */
std::cerr << "error: no powerball value read.\n";
return 1;
}
bfreq[tmp - 1].count++; /* increment ball freq count */
}
nfreq
成员对数组
bfreq
和
.count
的每个数组进行降序排序,然后输出每个数组的前十名(或者直到
.count
为
0
为止)。使用
std::sort所需要做的就是编写一个表达式来比较每个数组的元素,然后将其与每个数组的开始和结束迭代器一起传递给
std::sort
,其余的将由它完成。该表达式可以是上面链接中提供的示例中所示的标准比较,也可以使用自己的简短自定义函数(或与
std::sort
调用内联的lamba函数)。
.count
(降序)排序,然后如果
.count
与
.num
等于(降序)排序。完全由您决定,例如
/* compare freq by count and if equal by num (descending) */
bool compare (const freq &a, const freq &b)
{
if (a.count != b.count)
return a.count > b.count;
else
return a.num > b.num;
}
array
,因此将begin和end迭代器与compare函数一起传递给
std::sort
就像这样简单:
std::sort (nfreq.begin(), nfreq.end(), compare);
bfreq
做同样的操作)
#include <iostream>
#include <iomanip>
#include <fstream>
#include <sstream>
#include <string>
#include <array>
#include <algorithm>
#define NVAL 5 /* if you need a constant, #define one (or more) */
#define NMAX 69
#define BMAX 26
#define NTOP 10
struct freq {
int num, count; /* struct capturing number & count */
};
/* compare freq by count and if equal by num (descending) */
bool compare (const freq &a, const freq &b)
{
if (a.count != b.count)
return a.count > b.count;
else
return a.num > b.num;
}
int main (int argc, char **argv) {
if (argc < 2) { /* validate 1-argument available for filename */
std::cerr << "error: insufficnent input\nusage: " << argv[0]
<< " filename\n";
return 1;
}
std::string s;
std::array<freq, NMAX> nfreq; /* array of struct for number frequency */
std::array<freq, BMAX> bfreq; /* array of struct for ball frequency */
for (int i = 0; i < NMAX; i++) /* initialize number freq array */
nfreq[i].num = i + 1, nfreq[i].count = 0;
for (int i = 0; i < BMAX; i++) /* initialize ball freq array */
bfreq[i].num = i + 1, bfreq[i].count = 0;
std::ifstream f (argv[1]); /* open filename given by 1st argument */
if (!f.good()) { /* validate file open for reading */
std::cerr << "error: file open failed '" << argv[1] << "'.\n";
return 1;
}
while (getline (f, s)) { /* read each line/fill freq arrays */
std::stringstream ss (s); /* create stringstream from line */
size_t i = 0; /* initialize counter zero */
int tmp; /* tmp value to hold int read */
while (i < NVAL && ss >> tmp) /* read up to NVAL numbers */
nfreq[tmp - 1].count++, i++; /* increment nfreq count */
if (i < NVAL) { /* validate all number values read */
std::cerr << "error: less than " << NVAL << "values read.\n";
return 1;
}
if (!(ss >> tmp)) { /* validate ball value read */
std::cerr << "error: no powerball value read.\n";
return 1;
}
bfreq[tmp - 1].count++; /* increment ball freq count */
}
/* sort number frequency array of struct by count descending */
std::sort (nfreq.begin(), nfreq.end(), compare);
for (int i = 0; i < NTOP && nfreq[i].count; i++)
std::cout << std::setw(2) << nfreq[i].num << " : "
<< nfreq[i].count << '\n';
std::cout << '\n';
/* sort ball frequency array of struct by count descending */
std::sort (bfreq.begin(), bfreq.end(), compare);
for (int i = 0; i < NTOP && bfreq[i].count; i++)
std::cout << std::setw(2) << bfreq[i].num << " : "
<< bfreq[i].count << '\n';
std::cout << '\n';
}
dat/pwrball.txt
中的数据,彩票号码的频率以及强力球值(频率为零时停止)将为:
$ ./bin/pwrballnumfreq dat/pwrball.txt
50 : 4
16 : 3
67 : 2
59 : 2
53 : 2
45 : 2
25 : 2
21 : 2
69 : 1
68 : 1
4 : 3
21 : 2
14 : 2
12 : 1
6 : 1
5 : 1
std::sort
的过程中内联使用lamda函数,而不是编写单独的
compare
函数,则可以执行以下操作:
std::sort (nfreq.begin(), nfreq.end(), [](freq a, freq b) {
if (a.count != b.count)
return a.count > b.count;
else
return a.num > b.num;
});
compare
函数可能会保存几行代码)
关于c++ - 如何从最大到最小组织一个数组中的前10个频繁值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55681845/
我正在尝试创建一个包含 int[][] 项的数组 即 int version0Indexes[][4] = { {1,2,3,4}, {5,6,7,8} }; int version1Indexes[
我有一个整数数组: private int array[]; 如果我还有一个名为 add 的方法,那么以下有什么区别: public void add(int value) { array[va
当您尝试在 JavaScript 中将一个数组添加到另一个数组时,它会将其转换为一个字符串。通常,当以另一种语言执行此操作时,列表会合并。 JavaScript [1, 2] + [3, 4] = "
根据我正在阅读的教程,如果您想创建一个包含 5 列和 3 行的表格来表示这样的数据... 45 4 34 99 56 3 23 99 43 2 1 1 0 43 67 ...它说你可以使用下
我通常使用 python 编写脚本/程序,但最近开始使用 JavaScript 进行编程,并且在使用数组时遇到了一些问题。 在 python 中,当我创建一个数组并使用 for x in y 时,我得
我有一个这样的数组: temp = [ 'data1', ['data1_a','data1_b'], ['data2_a','data2_b','data2_c'] ]; // 我想使用 toStr
rent_property (table name) id fullName propertyName 1 A House Name1 2 B
这个问题在这里已经有了答案: 关闭13年前。 Possible Duplicate: In C arrays why is this true? a[5] == 5[a] array[index] 和
使用 Excel 2013。经过多年的寻找和适应,我的第一篇文章。 我正在尝试将当前 App 用户(即“John Smith”)与他的电子邮件地址“jsmith@work.com”进行匹配。 使用两个
当仅在一个边距上操作时,apply 似乎不会重新组装 3D 数组。考虑: arr 1),但对我来说仍然很奇怪,如果一个函数返回一个具有尺寸的对象,那么它们基本上会被忽略。 最佳答案 这是一个不太理
我有一个包含 GPS 坐标的 MySQL 数据库。这是我检索坐标的部分 PHP 代码; $sql = "SELECT lat, lon FROM gps_data"; $stmt=$db->query
我需要找到一种方法来执行这个操作,我有一个形状数组 [批量大小, 150, 1] 代表 batch_size 整数序列,每个序列有 150 个元素长,但在每个序列中都有很多添加的零,以使所有序列具有相
我必须通过 url 中的 json 获取文本。 层次结构如下: 对象>数组>对象>数组>对象。 我想用这段代码获取文本。但是我收到错误 :org.json.JSONException: No valu
enter code here- (void)viewDidLoad { NSMutableArray *imageViewArray= [[NSMutableArray alloc] init];
知道如何对二维字符串数组执行修剪操作,例如使用 Java 流 API 进行 3x3 并将其收集回相同维度的 3x3 数组? 重点是避免使用显式的 for 循环。 当前的解决方案只是简单地执行一个 fo
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我有来自 ASP.NET Web 服务的以下 XML 输出: 1710 1711 1712 1713
如果我有一个对象todo作为您状态的一部分,并且该对象包含数组列表,则列表内部有对象,在这些对象内部还有另一个数组listItems。如何更新数组 listItems 中 id 为“poi098”的对
我想将最大长度为 8 的 bool 数组打包成一个字节,通过网络发送它,然后将其解压回 bool 数组。已经在这里尝试了一些解决方案,但没有用。我正在使用单声道。 我制作了 BitArray,然后尝试
我们的数据库中有这个字段指示一周中的每一天的真/假标志,如下所示:'1111110' 我需要将此值转换为 boolean 数组。 为此,我编写了以下代码: char[] freqs = weekday
我是一名优秀的程序员,十分优秀!