鱼C论坛

 找回密码
 立即注册
查看: 3400|回复: 16

[已解决]测试3:实现加法。

[复制链接]
发表于 2023-1-8 22:39:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 KeyError 于 2023-1-9 12:29 编辑

请实现函数add(int a,int b) -> int,该函数返回a+b。
你不能使用+,-,*,/,//,%,if,for,while。
最佳答案
2023-3-19 08:39:32
这个简单
def add(a: int, b: int) -> int:
    return int(input(f'{a}+{b}=?'))
def add(a, b):
     return exec(f'{str(a)}{chr(43)}{str(b)}')
Doge
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-8 22:43:58 | 显示全部楼层
def add(a, b):
    return a.__add__(b)

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
人造人 + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-9 01:26:54 | 显示全部楼层
不能用 '+' 这个运算符,那就自己做一个加法器
sh-5.1$ cat main.py
#!/usr/bin/env python
#coding=utf-8

'''
def and_gate(a, b):
    if a == 0: return 0
    if b == 0: return 0
    return 1

def or_gate(a, b):
    if a == 1: return 1
    if b == 1: return 1
    return 0

def not_gate(a):
    if a == 0: return 1
    return 0

def xor_gate(a, b):
    if a == b: return 0
    return 1

def xor_gate(a, b):
    w0 = not_gate(a)
    w1 = not_gate(b)
    w2 = and_gate(a, w1)
    w3 = and_gate(b, w0)
    return or_gate(w2, w3)
'''

def and_gate(a, b): return a & b
def or_gate(a, b): return a | b
def not_gate(a): return int(not a)
def xor_gate(a, b): return a ^ b

def half_adder_1(a, b):
    s = xor_gate(a, b)
    c = and_gate(a, b)
    return (c, s)

def full_adder_1(a, b, c):
    w0, w1 = half_adder_1(a, b)
    w2, w3 = half_adder_1(w1, c)
    w4 = or_gate(w0, w2)
    return (w4, w3)

def full_adder_2(a, b, c):
    w0, w1 = full_adder_1(a & 0x0001, b & 0x0001, c)
    w2, w3 = full_adder_1(a >> 1, b >> 1, w0)
    result = (w3 << 1) | w1
    return (w2, result)

def full_adder_4(a, b, c):
    w0, w1 = full_adder_2(a & 0x0003, b & 0x0003, c)
    w2, w3 = full_adder_2(a >> 2, b >> 2, w0)
    result = (w3 << 2) | w1
    return (w2, result)

def full_adder_8(a, b, c):
    w0, w1 = full_adder_4(a & 0x000f, b & 0x000f, c)
    w2, w3 = full_adder_4(a >> 4, b >> 4, w0)
    result = (w3 << 4) | w1
    return (w2, result)

def full_adder_16(a, b, c):
    w0, w1 = full_adder_8(a & 0x00ff, b & 0x00ff, c)
    w2, w3 = full_adder_8(a >> 8, b >> 8, w0)
    result = (w3 << 8) | w1
    return (w2, result)

def full_adder_32(a, b, c):
    w0, w1 = full_adder_16(a & 0xffff, b & 0xffff, c)
    w2, w3 = full_adder_16(a >> 16, b >> 16, w0)
    result = (w3 << 16) | w1
    return (w2, result)

'''
print(full_adder_32(12345, 7366896, 0), 12345 + 7366896)
print(full_adder_32(12745, 7471895, 0), 12745 + 7471895)
print(full_adder_32(82345, 7586894, 0), 82345 + 7586894)
'''

def add(a, b): return full_adder_32(a, b, 0)[1]

a = 13748389521
b = 1912349134
print(add(a, b), a + b)
a = 13741234521
b = 1919087134
print(add(a, b), a + b)
a = 93741
b = 291987634
print(add(a, b), a + b)

a = 13748389521
b = 1912349134
print(add(a, b) == a + b)
a = 13741234521
b = 1919087134
print(add(a, b) == a + b)
a = 93741
b = 291987634
print(add(a, b) == a + b)
sh-5.1$ ./main.py
15660738655 15660738655
15660321655 15660321655
292081375 292081375
True
True
True
sh-5.1$
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-9 07:29:18 | 显示全部楼层
2楼厉害,网上的算法还是不能符合要求:
def add(a,b):
    p1=a^b
    p2=(a&b)<<1
    while p2!=0:
        temp=p1^p2
        p2=(p1&p2)<<1
        p1=temp
    return p1
print(add(3,69))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-9 08:26:13 | 显示全部楼层
def add(a,b):
    c=sum([a,b])
    return c
print(add(3.5,69))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-9 10:47:35 | 显示全部楼层
如果你对这些原理感兴趣的话,那来学底层吧
在这里什么都自己写
自己写编译器,自己写操作系统,自己写计算机!
^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-9 11:15:50 | 显示全部楼层
人造人 发表于 2023-1-9 01:26
不能用 '+' 这个运算符,那就自己做一个加法器

“专 业 对 口”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-9 11:19:04 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-9 12:17:27 | 显示全部楼层

__add__方法已经算+了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-9 12:18:07 | 显示全部楼层
人造人 发表于 2023-1-9 01:26
不能用 '+' 这个运算符,那就自己做一个加法器

这有if。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-9 12:19:08 | 显示全部楼层
KeyError 发表于 2023-1-9 12:17
__add__方法已经算+了。

但是如果想写一个适用所有对象的add函数,就必须使用__add__魔法方法。否则只能指定某一类对象。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-9 12:20:08 | 显示全部楼层

不能用任何与+,-,*,/,//,%运算符有关的方法。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-9 12:22:18 | 显示全部楼层

这个代码你看了吗?
看懂了吗?
有if吗?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-9 13:06:34 | 显示全部楼层
KeyError 发表于 2023-1-9 12:40
答案与解析:
首先,我们的工具很少,
只有and,or,not,&,|,~,^,递归......(无法使用for,while迭代)

不至于吧?
贴代码之前要自己先运行一遍,没问题才贴的
sh-5.1$ cat main.py
#!/usr/bin/env python
#coding=utf-8

def add(int a, int b) -> int:
    x = a + 0
    y = b + 0
    def f():
        global x, y
        x = ~ (- x)
        y = - (~ y)
        return bool(y) and f()
    f()
    return x

print(add(1, 1))
sh-5.1$ ./main.py
  File "/tmp/./main.py", line 4
    def add(int a, int b) -> int:
                ^
SyntaxError: invalid syntax
sh-5.1$ vim main.py
sh-5.1$ cat main.py
#!/usr/bin/env python
#coding=utf-8

#def add(int a, int b) -> int:
def add(a: int, b: int) -> int:
    x = a + 0
    y = b + 0
    def f():
        global x, y
        x = ~ (- x)
        y = - (~ y)
        return bool(y) and f()
    f()
    return x

print(add(1, 1))
sh-5.1$ ./main.py
Traceback (most recent call last):
  File "/tmp/./main.py", line 16, in <module>
    print(add(1, 1))
  File "/tmp/./main.py", line 13, in add
    f()
  File "/tmp/./main.py", line 10, in f
    x = ~ (- x)
NameError: name 'x' is not defined
sh-5.1$ vim main.py
sh-5.1$ cat main.py
#!/usr/bin/env python
#coding=utf-8

#def add(int a, int b) -> int:
def add(a: int, b: int) -> int:
    x = a + 0
    y = b + 0
    def f():
        #global x, y
        nonlocal x, y
        x = ~ (- x)
        y = - (~ y)
        return bool(y) and f()
    f()
    return x

print(add(1, 1))
sh-5.1$ ./main.py
Traceback (most recent call last):
  File "/tmp/./main.py", line 17, in <module>
    print(add(1, 1))
  File "/tmp/./main.py", line 14, in add
    f()
  File "/tmp/./main.py", line 13, in f
    return bool(y) and f()
  File "/tmp/./main.py", line 13, in f
    return bool(y) and f()
  File "/tmp/./main.py", line 13, in f
    return bool(y) and f()
  [Previous line repeated 995 more times]
RecursionError: maximum recursion depth exceeded
sh-5.1$
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-13 16:05:16 | 显示全部楼层
好像要用__add__魔法方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-19 08:39:32 | 显示全部楼层    本楼为最佳答案   
这个简单
def add(a: int, b: int) -> int:
    return int(input(f'{a}+{b}=?'))
def add(a, b):
     return exec(f'{str(a)}{chr(43)}{str(b)}')
Doge
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-19 11:02:46 | 显示全部楼层

什么我搞笑一下都能最佳答案????
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-15 04:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表