සියලුම negative ණ සංඛ්යා සඳහා මෙය සත්ය වේ.
f (n) = abs (n)
ද්වි අනුපූරක නිඛිල සඳහා ධනාත්මක සංඛ්යා ඇතිවාට වඩා එක් negative ණ සංඛ්යාවක් ඇති හෙයින්, විසඳුමට f(n) = abs(n)
වඩා එක සිද්ධියක් සඳහා වලංගු වේ . ඔබට එකින් එක තේරුණා ...: ඩීf(n) = n > 0 ? -n : n
f(n) = -abs(n)
යාවත්කාලීන කරන්න
නැත, ලිට්බ්ගේ අදහස් දැක්වීමෙන් මා හඳුනාගත් පරිදි තවත් එක් සිද්ධියක් සඳහා එය වලංගු නොවේ ... abs(Int.Min)
පිටාර ගැලෙනු ඇත ...
මම මෝඩ් 2 තොරතුරු භාවිතා කිරීම ගැනද සිතුවෙමි, නමුත් නිගමනය කළ පරිදි, එය ක්රියා නොකරයි ... මුල් කාලයට. නිවැරදිව සිදු කළ හොත්, මෙය Int.Min
පිටාර ගැලීම හැර අනෙක් සියලුම සංඛ්යා සඳහා ක්රියා කරයි .
යාවත්කාලීන කරන්න
මම ටික වේලාවක් එය සමඟ සෙල්ලම් කළෙමි, හොඳ හැසිරවීමේ උපක්රමයක් සොයමින් සිටියෙමි, නමුත් මට ලස්සන එක ලයිනර් එකක් සොයා ගැනීමට නොහැකි වූ අතර මෝඩ් 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
විසින්ම පරීක්ෂා කර නොගත් ප්රතික්ෂේප කිරීමක් සිදු වේ.
යාවත්කාලීන කරන්න
තවත් පිළිතුරකින් දේවානුභාවයෙන් මම ශ්රිතය ක්රියා කරන ආකාරය සහ එවැනි ශ්රිතයක් ගොඩනඟන්නේ කෙසේද යන්න පැහැදිලි කිරීමට යන්නෙමි.
ආරම්භයේදීම ආරම්භ කරමු. සාරධර්ම අනුපිළිවෙලක් f
ලබා දෙන අගයකට ශ්රිතය නැවත නැවතත් යොදනු ලැබේ n
.
n => f (n) => f (f (n)) => f (f (f (n))) => f (f (f (f (n)))) => ...
ප්රශ්නය ඉල්ලා සිටින්නේ 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 නිඛිලයක් ලෙස නිරූපණය නොවේ. වලංගු 3 බිටු නිඛිල සංඛ්යාවක් වන +4
නිෂේධනය -3
කිරීමෙන් අපි ලබා ගත හැකි +3
නමුත් +3
(ද්විමය 011
) අස්වැන්නක් 100
ද්විමය ලෙස එකතු කිරීමෙන් . එය අත්සන් නොකළ පූර්ණ සංඛ්යාවක් ලෙස +4
අර්ථකථනය කර ඇති නමුත් අප එය අත්සන් කළ පූර්ණ සංඛ්යාවක් ලෙස අර්ථ දැක්විය යුතුය -4
. ඒ නිසා ඇත්තටම -4
මෙම උදාහරණය සඳහා හෝ Int.MinValue
පොදු නඩුවේ පූර්ණ සංඛ්යාමය අංක ගණිතමය නිශේධනය දෙවන කවියක් වන්නේ - 0
හා Int.MinValue
themselve චේට ඇත. එබැවින් චක්රය ඇත්ත වශයෙන්ම පහත පරිදි වේ.
+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
කාර්යය අයදුම්පත් දෙකකට පසුව හා අසමත් යෙදවුම් දෙකක් අපට තබන්න. එබැවින් සියලු අගයන් සඳහා ක්රියා කරන ශ්රිතයක් තැනීමට හැකියාවක් නැත, නමුත් එකක් හැර සෙසු සියලු අගයන් සඳහා ක්රියා කරන එකක් අප සතුව ඇති අතර මෙය අපට ළඟා කර ගත හැකි හොඳම දේ වේ.