สิ่งนี้เป็นจริงสำหรับจำนวนลบทั้งหมด
f (n) = abs (n)
เนื่องจากมีจำนวนหนึ่งที่เป็นลบมากขึ้นกว่าที่มีตัวเลขในเชิงบวกสำหรับเจ้าตัวจำนวนเต็มสมบูรณ์, f(n) = abs(n)
ที่ถูกต้องสำหรับอีกหนึ่งกรณีกว่าการแก้ปัญหาที่เป็นเหมือนกันเช่นเดียวกับf(n) = n > 0 ? -n : n
f(n) = -abs(n)
มีคุณหนึ่ง ... : D
UPDATE
ไม่มันไม่ถูกต้องสำหรับอีกหนึ่งกรณีเนื่องจากฉันเพิ่งได้รับการยอมรับโดยความคิดเห็นของ litb ... abs(Int.Min)
จะล้น ...
ฉันคิดเกี่ยวกับการใช้ข้อมูล mod 2 ด้วย แต่ได้ข้อสรุปว่ามันไม่ทำงาน ... ไปก่อน ถ้าทำถูกต้องมันจะใช้ได้กับทุกหมายเลขยกเว้นInt.Min
เพราะจะล้น
UPDATE
ฉันเล่นกับมันซักพักหนึ่งแล้วมองหาเคล็ดลับการจัดการที่ดี แต่ฉันไม่สามารถหาซับในที่ดีได้ในขณะที่โซลูชัน mod 2 นั้นเข้ากันได้ดี
f (n) = 2n (abs (n)% 2) - n + sgn (n)
ใน C # สิ่งนี้จะกลายเป็นสิ่งต่อไปนี้:
public static Int32 f(Int32 n)
{
return 2 * n * (Math.Abs(n) % 2) - n + Math.Sign(n);
}
เพื่อให้มันทำงานได้กับค่าทั้งหมดคุณต้องแทนที่Math.Abs()
ด้วย(n > 0) ? +n : -n
และรวมการคำนวณในunchecked
บล็อก จากนั้นคุณจะได้Int.Min
แมปแม้กระทั่งกับตัวเองเป็น negation ไม่ จำกัด
UPDATE
แรงบันดาลใจจากคำตอบอื่นฉันจะอธิบายวิธีการทำงานของฟังก์ชั่นและวิธีการสร้างฟังก์ชั่นดังกล่าว
ให้เริ่มที่จุดเริ่มต้นมาก ฟังก์ชั่นf
จะใช้ซ้ำกับค่าที่กำหนดn
ซึ่งให้ลำดับของค่า
n => f (n) => f (f (n)) => f (f (f (n))) => f (f (f (f) ()))) => ...
คำถามที่ต้องการf(f(n)) = -n
นั่นคือสองแอพพลิเคชั่นที่ต่อเนื่องของการf
คัดค้านการโต้แย้ง แอปพลิเคชันเพิ่มเติมสองรายการf
- สี่รายการ - ปฏิเสธการโต้แย้งอีกครั้งให้ผลn
อีกครั้ง
n => f (n) => -n => f (f (f (n))) => n => f (n) => ...
ขณะนี้มีวัฏจักรที่ชัดเจนของความยาวสี่วง การแทนx = f(n)
และการสังเกตว่าสมการที่ได้รับf(f(f(n))) = f(f(x)) = -x
นั้นให้ผลดังนี้
n => x => -n => -x => n => ...
ดังนั้นเราจึงได้วงจรความยาวสี่จำนวนสองตัว ถ้าคุณจินตนาการว่าวัฏจักรเป็นรูปสี่เหลี่ยมผืนผ้าค่าที่ถูกลบจะอยู่ที่มุมตรงข้าม
หนึ่งในหลาย ๆ วิธีในการสร้างวงจรดังกล่าวคือการเริ่มต้นจาก n
n => คัดค้านและลบหนึ่งรายการ
-n - 1 = - (n + 1) => เพิ่มหนึ่งรายการ
-n => ปฏิเสธและเพิ่มหนึ่งรายการ
n + 1 => ลบออกหนึ่งอัน
n
+1 => -2 => -1 => +2 => +1
ตัวอย่างที่เป็นรูปธรรมเป็นเช่นวงจรคือ เราเกือบเสร็จแล้ว เมื่อสังเกตว่าวงจรที่สร้างขึ้นนั้นมีจำนวนบวกแปลก ๆ แม้จะเป็นตัวตายตัวแทนและทั้งคู่ก็คัดค้านเราสามารถแบ่งจำนวนเต็มออกเป็นหลาย ๆ รอบได้อย่างง่ายดาย ( 2^32
เป็นผลคูณของสี่) และได้พบฟังก์ชันที่ตรงตามเงื่อนไข
แต่เรามีปัญหากับศูนย์ รอบจะต้องมี0 => x => 0
เนื่องจากศูนย์เป็นโมฆะกับตัวเอง และเนื่องจากวงจรกล่าวแล้วเป็นไปตาม0 => x
0 => x => 0 => x
นี้เป็นเพียงวงจรของความยาวสองและจะกลายเป็นตัวเองหลังจากที่สองการใช้งานไม่เข้าx
-x
โชคดีที่มีกรณีหนึ่งที่สามารถแก้ไขปัญหาได้ ถ้าเท่ากับศูนย์เราได้รับรอบความยาวหนึ่งที่มีเพียงศูนย์และเราแก้ปัญหาที่สรุปว่าศูนย์เป็นจุดคงที่ของX
f
ทำ? เกือบจะ เรามี2^32
ตัวเลขศูนย์คือจุดคงที่ที่จะทิ้ง2^32 - 1
ตัวเลขไว้และเราต้องแบ่งหมายเลขนั้นเป็นรอบของตัวเลขสี่ตัว ไม่ดีที่2^32 - 1
ไม่ใช่ผลคูณของสี่ - จะมีตัวเลขสามตัวที่ไม่อยู่ในรอบความยาวสี่ใด ๆ
ผมจะอธิบายในส่วนที่เหลือของการแก้ปัญหาโดยใช้ชุดขนาดเล็ก 3 itegers บิตลงนามตั้งแต่การ-4
+3
เราทำด้วยศูนย์ +1 => -2 => -1 => +2 => +1
เรามีหนึ่งครบวงจร +3
ตอนนี้ให้เราสร้างวงจรเริ่มต้นที่
+3 => -4 => -3 => +4 => +3
ปัญหาที่เกิดขึ้น+4
คือไม่สามารถแสดงได้ว่าเป็นจำนวนเต็ม 3 บิต เราจะได้รับ+4
โดยกวน-3
ไป+3
- สิ่งที่ยังคงเป็นจำนวนเต็ม 3 บิตที่ถูกต้อง - แต่แล้วเพิ่มหนึ่งไป+3
(ไบนารี011
) อัตราผลตอบแทน100
ไบนารี ตีความว่าเป็นจำนวนเต็มไม่ได้ลงนามมันเป็นแต่เราต้องตีความมันลงนามจำนวนเต็ม+4
-4
ดังนั้น-4
สำหรับตัวอย่างนี้หรือInt.MinValue
ในกรณีทั่วไปคือจุดคงที่ที่สองของการปฏิเสธเลขจำนวนเต็ม - 0
และInt.MinValue
ถูกแมปกับตัวเอง ดังนั้นวงจรจึงเป็นดังนี้
+3 => -4 => -3 => -4 => -3
มันเป็นวงจรของความยาวสองและนอกจากนี้จะเข้าสู่วงจรผ่านทาง+3
-4
ผลที่ตามมา-4
คือการแมปอย่างถูกต้องกับตัวเองหลังจากที่สองฟังก์ชั่นการใช้งาน+3
จะถูกแมปอย่างถูกต้อง-3
หลังจากที่สองฟังก์ชั่นการใช้งาน แต่-3
ถูกแมปผิดพลาดกับตัวเองหลังจากสองฟังก์ชั่น
ดังนั้นเราจึงสร้างฟังก์ชันที่ใช้งานได้กับจำนวนเต็มทั้งหมด แต่มีหนึ่งฟังก์ชัน เราทำได้ดีกว่านี้ไหม ไม่เราทำไมได้. ทำไม? เราต้องสร้างวงจรความยาวสี่และสามารถครอบคลุมช่วงจำนวนเต็มทั้งหมดถึงสี่ค่า ค่าที่เหลือคือจุดคงที่สองจุด0
และInt.MinValue
จะต้องแมปเข้ากับตัวเองและจำนวนเต็มตามอำเภอใจสองตัวx
และ-x
จะต้องแมปเข้าด้วยกันโดยแอปพลิเคชันฟังก์ชันสองตัว
ในการทำแผนที่x
กับ-x
และในทางกลับกันพวกเขาจะต้องตั้งสี่รอบและจะต้องอยู่ที่มุมตรงข้ามของรอบนั้น ผลที่ตามมา0
และInt.MinValue
จะต้องอยู่ที่มุมตรงข้ามเช่นกัน สิ่งนี้จะทำการแมปอย่างถูกต้องx
และ-x
สลับจุดคงที่ทั้งสอง0
และInt.MinValue
หลังจากแอปพลิเคชั่นสองฟังก์ชั่นและปล่อยให้เรามีอินพุตที่ล้มเหลวสองตัว ดังนั้นจึงเป็นไปไม่ได้ที่จะสร้างฟังก์ชั่นที่ใช้งานได้กับค่าทั้งหมด แต่เรามีหนึ่งที่ทำงานได้สำหรับทุกค่ายกเว้นหนึ่งและนี่คือสิ่งที่ดีที่สุดที่เราสามารถทำได้