excel 函数 写一个判断a1,a3,a5一直到a39单元格是否不为空
时间: 2024-03-17 13:41:27 浏览: 21
你可以使用以下公式来判断 A1、A3、A5 到 A39 是否非空:
```
=IF(COUNTA(A1,A3,A5:A39)=37, "所有单元格都非空", "至少有一个单元格为空")
```
这个公式中,COUNTA 函数用来计算 A1、A3、A5 到 A39 中非空单元格的数量,其中 A5:A39 表示 A5 到 A39 的单元格范围。如果所有的单元格都非空,COUNTA 函数返回值为 37(A1、A3、A5 到 A39 共计 19 个单元格),IF 函数会返回 "所有单元格都非空"。如果至少有一个单元格为空,COUNTA 函数返回值小于 37,IF 函数会返回 "至少有一个单元格为空"。
注意,这个公式中使用了逗号来分隔不同的单元格,如果你需要适用于其他行或者列,可以根据需要调整单元格的范围和数量。
相关问题
我如何回退到某一个git的版本
在Git中,可以使用`git checkout`命令回退到某一个特定的版本。具体操作步骤如下:
1. 首先,使用`git log`命令查看提交历史,获取需要回退的版本的commit ID。
```bash
$ git log
commit 5f8e1d88d3f0c7c6c8c2c31a4f3c3c1f6d7c1f8a (HEAD -> master)
Author: John Doe <johndoe@example.com>
Date: Thu Jun 10 15:23:33 2021 +0800
Add feature B
commit b9c9e5a0964f1a0b8b9f0ebf2a5e8c4837c5377f
Author: John Doe <johndoe@example.com>
Date: Wed Jun 9 10:32:15 2021 +0800
Add feature A
commit 9bb3e3a2e9bacfe439a39d6f7a5b048c86783f9a
Author: John Doe <johndoe@example.com>
Date: Tue Jun 8 18:12:45 2021 +0800
Init project
```
上述命令会列出所有的提交历史,包括每个提交的commit ID、作者、日期和提交信息。
2. 使用`git checkout`命令回退到指定的版本,例如回退到`b9c9e5a`版本:
```bash
$ git checkout b9c9e5a
```
执行该命令后,Git会将当前代码库回退到指定的版本。此时,你可以查看代码库的文件,发现它们已经被还原到指定版本的状态。
3. 如果需要回到最新版本,可以使用`git checkout master`命令,其中`master`表示主分支的名称。如果你的主分支名称不同,需要替换为对应的分支名称。
不调用gmssl库,用python代码具体实现签名,验签过程,比如杂凑函数,随机生成素数p等
好的,以下是一个使用Python代码实现SM2签名和验签的示例:
```python
from hashlib import sha256
from random import randint
from sympy import isprime, primerange
# 杂凑函数使用SHA256
def hash(msg):
return sha256(msg).digest()
# 随机生成SM2私钥
def gen_private_key():
p = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f
n = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141
d = randint(1, n - 1)
while not isprime(d):
d = randint(1, n - 1)
return d
# 生成SM2公钥
def gen_public_key(d):
p = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f
a = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2c
b = 0x28e9fa9e9d9f5e344d5a9e4bcf6509a7f39789f515ab8f92d5879b8543a1e
gx = 0x32c4ae2c1f1981195f9904466a39c9948fe30bbff2660be1711fe3c3eb9b67
gy = 0xbc3736a2f4f6779c59bdcee36b692153d0a9877cc62a474002df32e52139f0a
return sm2_point_mul(d, (gx, gy), a, p)
# SM2点乘
def sm2_point_mul(k, P, a, p):
Q = P
k2 = bin(k)[2:]
for i in range(1, len(k2)):
Q = sm2_point_add(Q, Q, a, p)
if k2[i] == '1':
Q = sm2_point_add(Q, P, a, p)
return Q
# SM2点加
def sm2_point_add(P, Q, a, p):
if P[0] == Q[0] and P[1] == Q[1]:
return sm2_point_double(P, a, p)
elif P[0] == Q[0] and P[1] == -Q[1] % p:
return (0, 0)
else:
lam = ((Q[1] - P[1]) * pow(Q[0] - P[0], p - 2, p)) % p
x = (lam**2 - P[0] - Q[0]) % p
y = (lam * (P[0] - x) - P[1]) % p
return (x, y)
# SM2点倍乘
def sm2_point_double(P, a, p):
if P[1] == 0:
return (0, 0)
else:
lam = ((3 * P[0]**2 + a) * pow(2 * P[1], p - 2, p)) % p
x = (lam**2 - 2 * P[0]) % p
y = (lam * (P[0] - x) - P[1]) % p
return (x, y)
# SM2签名
def sm2_sign(msg, d):
p = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f
n = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141
e = int.from_bytes(hash(msg), 'big')
k = randint(1, n - 1)
while True:
x1, y1 = sm2_point_mul(k, (gx, gy), a, p)
r = (e + x1) % n
if r == 0 or r + k == n:
continue
s = ((1 + d) ** -1 * (k - r*d) % n)
if s == 0:
continue
else:
break
return (r, s)
# SM2验签
def sm2_verify(msg, Q, r, s):
p = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f
n = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141
e = int.from_bytes(hash(msg), 'big')
if not (1 <= r <= n - 1 and 1 <= s <= n - 1):
return False
t = (r + s) % n
if t == 0:
return False
x1, y1 = sm2_point_mul((s**-1 * t) % n, (gx, gy), a, p)
x2, y2 = sm2_point_mul((s**-1 * r) % n, Q, a, p)
x, y = sm2_point_add((x1, y1), (x2, y2), a, p)
if r == (e + x) % n:
return True
else:
return False
# 测试代码
d = gen_private_key()
Q = gen_public_key(d)
msg = b"Hello, world!"
r, s = sm2_sign(msg, d)
if sm2_verify(msg, Q, r, s):
print("签名验证成功")
else:
print("签名验证失败")
```
其中,使用 `hashlib.sha256()` 函数实现杂凑函数,使用 `random.randint()` 函数生成私钥,使用 SymPy 库的 `isprime()` 和 `primerange()` 函数判断质数。使用 `sm2_point_mul()` 函数实现SM2点乘,使用 `sm2_point_add()` 函数实现SM2点加,使用 `sm2_point_double()` 函数实现SM2点倍乘。使用 `sm2_sign()` 函数实现SM2签名,使用 `sm2_verify()` 函数实现SM2验签。
需要注意的是,SM2签名中还涉及到Z值的计算,可以使用 `hash()` 函数进行计算。具体实现可以参考SM2密码算法标准。另外,本示例代码中的SM2参数为固定值,实际应用中需要根据具体情况进行调整。
希望这个示例代码对您有所帮助。