设计函数f(f(n))== -n

来源:厦门SEO

我上次面试时遇到的一个问题:

设计一个函数f ,使得:

f(f(n)) == -n

其中n是一个32位有符号整数 ; 您不能使用复数算法。

如果您不能为整个数字范围设计这样的函数,请为最大范围设计它。

有任何想法吗?


#1楼

x86 asm(AT&T风格):

; input %edi
; output %eax
; clobbered regs: %ecx, %edx
f:
    testl   %edi, %edi
    je  .zero

    movl    %edi, %eax
    movl    $1, %ecx
    movl    %edi, %edx
    andl    $1, %eax
    addl    %eax, %eax
    subl    %eax, %ecx
    xorl    %eax, %eax
    testl   %edi, %edi
    setg    %al
    shrl    $31, %edx
    subl    %edx, %eax
    imull   %ecx, %eax
    subl    %eax, %edi
    movl    %edi, %eax
    imull   %ecx, %eax
.zero:
    xorl    %eax, %eax
    ret

检查代码,传递所有可能的32位整数,错误-2147483647(下溢)。


#2楼

该Perl解决方案适用于整数,浮点数和字符串 。

sub f {
    my $n = shift;
    return ref($n) ? -$$n : \$n;
}

尝试一些测试数据。

print $_, ‘ ‘, f(f($_)), "\n" for -2, 0, 1, 1.1, -3.3, ‘foo‘ ‘-bar‘;

输出:

-2 2
0 0
1 -1
1.1 -1.1
-3.3 3.3
foo -foo
-bar +bar

#3楼

没有人说过f(x)必须是同一类型。

def f(x):
    if type(x) == list:
        return -x[0]
    return [x]

f(2) => [2]
f(f(2)) => -2

#4楼

这是受要求启发的解决方案,或声称不能使用复数来解决此问题。

乘以-1的平方根是一个想法,这似乎只是失败了,因为-1在整数上没有平方根。 但是,使用诸如mathematica之类的程序可以得出以下等式

(1849436465 2 +1)mod(2 32 -3)= 0。

这几乎与平方根为-1一样好。 该函数的结果必须是一个有符号整数。 因此,我将使用修改后的模运算mods(x,n),它返回与最接近0的x模n一致的整数y。只有极少数的编程语言具有suc模运算,但是很容易定义。 例如在python中,它是:

def mods(x, n):
    y = x % n
    if y > n/2: y-= n
    return y

使用上面的方程,现在可以解决问题

def f(x):
    return mods(x*1849436465, 2**32-3)

对于[-2 31 -2, 2 31 -2]范围内的所有整数,满足f(f(x)) = -x 。 f(x)结果也在此范围内,但是计算当然需要64位整数。


#5楼

利用JavaScript异常。

function f(n) {
    try {
        return n();
    }
    catch(e) {
        return function() { return -n; };
    }
}

f(f(0)) => 0

f(f(1)) => -1

原文地址:https://www.cnblogs.com/1994july/p/12057010.html

时间: 2024-10-08 00:46:54

设计函数f(f(n))== -n的相关文章

<转载>网页设计中的F式布局

地址:http://www.uisdc.com/understanding-the-f-layout-in-web-design 网页设计中的F式布局 今天我们来重点介绍网页设计中的F式布局.传统的布局方式,依赖布置视觉线索,“控制”用户的视觉路径,相较之下,F式布局更加自然,更加友好.本文将讲述一些F式布局的规则.原理以及设计方法. 推荐阅读:<极好的交互设计:19个创意网页欣赏><拒绝平庸:优秀WEB登录页面设计><超赞!网页设计中的数学运用> F式布局简介 F式布

C++:一般情况下,设计函数的形参只需要两种形式

C++:一般情况下,设计函数的形参只需要两种形式.一,是引用形参,例如 void function (int &p_para):二,是常量引用形参,例如 void function(const int &p_para). 它们的特点如下: # 引用形参适用于需要改变变量数据的情况,常量引用形参适用于不需要改变对象.变量数据的情况. # 引用形参需要对象.变量来传递值,常量引用形参则不需要,可以直接传递表达式或者函数返回值. 通过这两种方式可以涵盖所有可能需要的设计情况,而通过这种方式实现的

创建数组,用函数分别实现初始化、清空和逆置。自己设计函数的参数,返回值

创建一个数组, 实现函数init()初始化数组. 实现empty()清空数组. 实现reverse()函数完成数组元素的逆置. 要求:自己设计函数的参数,返回值.*/ #include<stdio.h> #include<cstdlib> void init(int* arr, int length)//没有为arr开辟空间  可以不初始化. { int i = 0; for (i = 0; i<length; i++) { arr[i] = i;// scanf_s(&qu

f = f * i

代码: long f = 1; for(int i = 1 ; i < 5 ; i ++){ System.out.println(f = f*i); 之前一直以为f 的值是固定的1,后来测试才发现,f 的值随着f*i的变化而变化.

使用聚合函数及F/Q及分组查询

import os from django.core.wsgi import get_wsgi_application if __name__=='__main__': os.environ.setdefault("DJANGO_SETTINGS_MODULE", "b20190116.settings") application = get_wsgi_application() # 聚合查询(一堆聚合函数,使用之前先导入) from django.db.model

提高代码质量系列之三:我是怎么设计函数的?

前言 这篇其实是上两篇的两个主题思想的承接和发散: 我也想少写注释,想用2-4个很清晰的单词去描述函数,但是这个函数好复杂啊,我恨不得写近百字去描述它,要我用几个单词去描述?臣妾实在是做不到啊~  <如何做到少写注释> 我也不想写这么多if  else,然后看着那一堆一堆{}{{}{}{{}}}}}}}{{{}{{}头晕眼花,但逻辑就是有这么复杂,我能怎么办呢?  <如何简化代码逻辑>  这篇博文,应该就是我对于以上问题结合设计原理的一些思考,不算多高深,但都是自己的总结,我也不会

OPEN CASCADE Multiple Variable Function

OPEN CASCADE Multiple Variable Function [email protected] Abstract. Multiple variable function with gradient and Hessian matrix is very very import in OPEN CASCADE optimization algorithms. In order to understand these optimization algorithm better, l

8.1.4 在 F# 中使用函数列表

首先,我们声明一个表示有关客户信息的类型:客户有很多属性,因此,用F# 的记录类型表示最自然的选择,我们在前一章已经看过.清单 8.4 显示了类型声明,和所创建样本客户的代码. 清单 8.4 Client 记录类型和样本值 (F# Interactive) > type Client = { Name : string; Income : int;YearsInJob : int UsesCreditCard : bool;CriminalRecord : bool };; type Clien

F# 学习笔记(函数基础2模式匹配)

模式匹配表达式: [<EntryPoint>] let main argv = let eval x = match x with |5 -> "优" |4 -> "良" |3 -> "中" |_ -> "差" let y = eval 4 let s = Array.map eval [|3; 2; 1; 5|] 0 // 返回整数退出代码 在这里表达式中Array.map 函数,数组的每