我是博士。学生。我正在处理关于素数的论文,但我在编程方面遇到了困难。我希望有人可以帮助我解决这个问题。这是场景:
假设我有一个主要差距列表:
1
2
2
4
2
4
2
4
6
2
6
4
2
4
6
我想知道数字2后跟4的实例数。在上面的例子中,2跟随4的实例数是4。我还想知道4号跟随6号等的次数
在上面的数据中,只有15个,但如果您拥有大量数据,则难以计算。目前我已有283,146个数据,如果我没有程序,我很难做到这一点。
答案 0 :(得分:2)
将列表放在A列中,分别选择B1和C1中的第一个和第二个值:
=COUNTIFS(A1:A1048575,B1,A2:A1048576,C1)
请注意,对于几乎所有其他阵列处理功能,引用这些大小的范围根本不是一个好主意。但是,COUNTIF(S)/ SUMIF(S)从任何通过的范围中隐式检测使用范围,因此仅对这些单元进行操作,因此在引用任意大范围时,性能几乎没有或没有损失。
此致
答案 1 :(得分:1)
@XOR LX答案是完美的,正如@Jeeped所说,它可以最佳地使用偏移范围。但是,您必须在B:C列中手动定义值列表,如果必须多次重复分析,并且满足条件的唯一素数范围从不相同,则可能有点单调乏味。如果您想在不到30秒的时间内获得自动结果。对于100万行,您可以尝试以下VBA代码。
唯一的假设是数据在A列中。如果不是这种情况,最好的选择是将包含数据的列复制到新工作表中的A列。使用这种数据结构,您不应该遇到问题。
<强>代码:强>
Option Explicit
Sub countPrimes()
Dim LRC As Long, LRPrimes As Long, count As Integer, lRowB As Long, Rng As Range
Application.ScreenUpdating = False
LRC = 0
Range("A1").Activate
While Not ActiveCell = ""
If ActiveCell.Value = ActiveCell.Offset(1).Value - 2 Then
LRC = LRC + 1
Range("B" & LRC).Value = ActiveCell.Value
End If
ActiveCell.Offset(1, 0).Activate
Wend
Range("B1", Range("B1").End(xlDown)).Copy Destination:=Range("C1")
Range("C1", Range("C1").End(xlDown)).RemoveDuplicates Columns:=1, Header:=xlNo
Range("C1", Range("C1").End(xlDown)).Sort key1:=Range("C1"), order1:=xlAscending, Header:=xlNo
lRowB = Range("B" & Rows.count).End(xlUp).Row
Set Rng = Range("B1:B" & lRowB)
Range("C1").Activate
While Not ActiveCell = ""
count = Application.WorksheetFunction.CountIf(Rng, ActiveCell.Value)
ActiveCell.Offset(0, 1).Value = count
ActiveCell.Offset(1, 0).Activate
Wend
Range("B1", Range("B1").End(xlDown)).Delete
Application.ScreenUpdating = True
End Sub
迭代A列并将列(x)中的每个单元格与其下方的单元格(y)进行比较。 If x = y -2
,然后它将x的值复制到B列中的第一个空行。在遍历整个列之后,它会在C列中生成一个唯一素数列表,ASC有序。在这个新列中,还有另一个迭代,但这一次,它计算列C中每个值出现在列B中的时间,并将值放在列D中。列B被删除,因为它不再有用。结果:
如果您从未使用过宏,this official website可以帮助您完成此操作。