日期:2014-05-20  浏览次数:20906 次

挑战 f(f(n)) = -n

源起:http://topic.csdn.net/u/20090525/17/4d0cb4ed-b503-42b6-b7d3-3528b3aaebf7.html


设计一个函数 f,使得 

f(f(n)) = -n

规定 f(n) 的定义域和值域都是 8 比特的有符号整数,其范围:-128 ~ 127。
显然,n = -128 时无法满足要求,因为其相反数 128 已经超出范围。
现在请问,能否做到对其余的 n 都满足上式。


也就是说,想办法使以下程序的输出为空:
(注意,您只能在 // TODO 处写语句,不能改动程序的其余任何部分)

C# code
using System;
using tiny = System.SByte;

class FFN
{
  static void Main()
  {
    for (tiny ffn, n = tiny.MaxValue; n > tiny.MinValue; n--)
      if ((long)(ffn = f(f(n))) != -(long)n)
        Console.WriteLine("n={0} ffn={1} ERROR", n, ffn);
  }
  
  static tiny f(tiny n)
  {
    // TODO: 在这里发挥您的聪明才智。
  }
}


------解决方案--------------------
C# code
        static sbyte f(sbyte n)
        {
            System.Diagnostics.StackFrame sf = new System.Diagnostics.StackFrame(1);
            if (sf.GetILOffset() > 6)
                return (sbyte)-n;
            else
                return n;
        }

------解决方案--------------------
C# code

        static tiny f(tiny n)
        {
            if (Console.Title.EndsWith(".")) {
                Console.Title = Console.Title.Substring(0, Console.Title.Length - 1);
                return (tiny)(-n);
            } else {
                Console.Title += ".";
                return n;
            }
        }