F (f (n)) == -n ශ්‍රිතය සැලසුම් කිරීම


842

මගේ අවසාන සම්මුඛ සාකච්ඡාවේදී මට ලැබුණු ප්‍රශ්නයක්:

ශ්‍රිතයක් සැලසුම් කරන්න f,

f(f(n)) == -n

nබිට් 32 අත්සන් කළ පූර්ණ සංඛ්‍යාවක් කොහිද ; ඔබට අංක ගණිතමය වශයෙන් භාවිතා කළ නොහැක.

මුළු සංඛ්‍යා පරාසය සඳහා ඔබට එවැනි ශ්‍රිතයක් සැලසුම් කළ නොහැකි නම්, හැකි විශාලතම පරාසය සඳහා එය සැලසුම් කරන්න.

අදහස් තිබේද?


2
මෙම සම්මුඛ පරීක්ෂණය කුමන රැකියාව සඳහාද?
tymtam

Answers:


377

කොහොමද:

f (n) = ලකුණ (n) - (-1) n * n

පයිතන්හි:

def f(n): 
    if n == 0: return 0
    if n >= 0:
        if n % 2 == 1: 
            return n + 1
        else: 
            return -1 * (n - 1)
    else:
        if n % 2 == 1:
            return n - 1
        else:
            return -1 * (n + 1)

පයිතන් ස්වයංක්‍රීයව පූර්ණ සංඛ්‍යා අත්තනෝමතික දිගට ප්‍රවර්ධනය කරයි. වෙනත් භාෂාවලින් විශාලතම ධන නිඛිලය පිරී ඉතිරී යනු ඇත, එබැවින් එය හැර අනෙක් සියලුම නිඛිල සඳහා එය ක්‍රියා කරයි.


තාත්වික සංඛ්‍යා සඳහා එය ක්‍රියා කිරීමට නම් (-1) n හි n ආදේශ කළ යුතුය .{ ceiling(n) if n>0; floor(n) if n<0 }

C # හි (පිටාර ගැලීම් අවස්ථා හැර, ඕනෑම දෙගුණයක් සඳහා ක්‍රියා කරයි):

static double F(double n)
{
    if (n == 0) return 0;

    if (n < 0)
        return ((long)Math.Ceiling(n) % 2 == 0) ? (n + 1) : (-1 * (n - 1));
    else
        return ((long)Math.Floor(n) % 2 == 0) ? (n - 1) : (-1 * (n + 1));
}

10
-1 සඳහා කැඩී ඇත, මන්ද -1 * 0 තවමත් 0
ජොයෙල් කොහූර්න්

3
නැත එය එසේ නොවේ. f (-1) = 0. f (0) = 1
1800 තොරතුරු

5
කෙසේ වෙතත් එය 1 ක් සඳහා කැඩී ඇත. f (1) = 0. f (0) = 1
1800 තොරතුරු

18
හ්ම්, ඉරට්ටේ හා අමුතු සංඛ්‍යා වලින් තත්වය ඉතිරි කිරීම, මම ඒ ගැන සිතිය යුතුව තිබුණි.
නොදන්නා

38
මම හිතන්නේ වඩාත්ම වැදගත් දෙය සත්‍ය ශ්‍රිතය නොවේ (අසීමිත විසඳුම් රාශියක් ඇත), නමුත් ඔබට එවැනි ශ්‍රිතයක් ගොඩනගා ගත හැකි ක්‍රියාවලියයි.
pyon

440

ඔවුන් බලාපොරොත්තු වූයේ කුමන ආකාරයේ භාෂාවක්දැයි ඔබ කීවේ නැත ... මෙන්න ස්ථිතික විසඳුමක් (හස්කල්). එය මූලික වශයෙන් වඩාත්ම වැදගත් බිටු 2 සමඟ අවුල් කරයි:

f :: Int -> Int
f x | (testBit x 30 /= testBit x 31) = negate $ complementBit x 30
    | otherwise = complementBit x 30

ගතික භාෂාවකින් (පයිතන්) එය වඩා පහසුය. තර්කය X අංකයක් දැයි පරීක්ෂා කර -X:

def f(x):
   if isinstance(x,int):
      return (lambda: -x)
   else:
      return x()

23
සිසිල්, මම මේකට කැමතියි ... ජාවාස්ක්‍රිප්ට්හි එකම ප්‍රවේශය: var f = function (n) {return (typeof n == 'function')? n (): ශ්‍රිතය () {ආපසු -n; }}
මාර්ක් රෙනූෆ්

බොහෝ විට මගේ හැස්කල් ඉතා මලකඩ ඇති බව පෙනේ, නමුත් ඔබ එය (f 0) සඳහා පරීක්ෂා කර තිබේද? (F 0x80000000) හා සමාන ප්‍රති result ලයක් ලබා දිය යුතු බව පෙනේ, අවම වශයෙන් අපි බිටු 32 ක් අඟල් ආවරණ ගණිතය සමඟ ගනුදෙනු කරන්නේ නම් (නිෂේධනීය ක්‍රියාකාරිත්වය මත). ඒක නරකයි.
ඩාරියස් බේකන්

11
ලැම්බඩා ඉදිකිරීම යනු කුමක්දැයි සාමාන්‍ය සම්මුඛ පරීක්‍ෂකවරයා දැනගනීවිද ?
ජෙරමි පවෙල්

4
ඇත්ත වශයෙන්ම, එවැනි ආකාරයේ වංචා කිරීමේ උපක්‍රමයක් ස්ථිතික වුවද හැස්කෙල්හි ද ක්‍රියාත්මක වේ : class C a b | a->b where { f :: a->b }; instance C Int (()->Int) where { f=const.negate }; instance C (()->Int) Int where { f=($()) }.
වම් පසින්

4
කුමන? ටයිප් ඔෆ් එෆ් (එන්) === 'ශ්‍රිතය' යන අදහස ඔබට ලැබුනේ කොහෙන්ද? උදාහරණ නඩුවක් මෙහි අදාළ වන්නේ කෙසේදැයි මට තේරෙන්නේ නැත. මම පයිතන් හොඳින් කථා නොකරමි, නමුත් JS හි ශ්‍රිත වර්ගයක් සඳහා වන තර්කය පරික්ෂා කිරීම මෙම අවස්ථාවේ දී වැරදිය. මෙහි අදාළ වන්නේ සංඛ්‍යාත්මක විසඳුමක් පමණි. f යනු ශ්‍රිතයකි, f (n) යනු අංකයකි.
හැරී

284

සියලු සංඛ්‍යා සඳහා, අතිරේක තොරතුරු භාවිතා නොකරන්නේ නම්, එවැනි ශ්‍රිතයක් පැවතිය නොහැක්කේ මන්ද යන්න පිළිබඳ සාක්ෂියක් මෙන්න (int 32bit හැර):

අපට f (0) = 0 තිබිය යුතුය. (සාධනය: f (0) = x යැයි සිතමු. එවිට f (x) = f (f (0)) = -0 = 0. දැන්, -x = f (f (x) )) = f (0) = x, එයින් අදහස් වන්නේ x = 0.)

තවද, ඕනෑම කෙනෙකුට xසහ y, සිතමු f(x) = y. අපට f(y) = -xඑවිට අවශ්‍යයි . සහ f(f(y)) = -y => f(-x) = -y. සාරාංශගත කිරීම සඳහා: එසේ f(x) = yනම් f(-x) = -y, සහ f(y) = -x, සහ f(-y) = x.

එබැවින්, 0 හැර සෙසු සියලු නිඛිල 4 කට්ටලවලට බෙදිය යුතුය, නමුත් අපට එවැනි පූර්ණ සංඛ්‍යා ගණනක් තිබේ; එපමණක් නොව, ධනාත්මක ප්‍රතිවිරෝධකයක් නොමැති පූර්ණ සංඛ්‍යාවක් අප ඉවත් කළහොත්, අපට තවමත් අංක 2 (mod4) ඇත.

අපි ඉතිරිව ඇති උපරිම අංක 2 ඉවත් කළහොත් (abs අගය අනුව), අපට ශ්‍රිතය ලබා ගත හැකිය:

int sign(int n)
{
    if(n>0)
        return 1;
    else 
        return -1;
}

int f(int n)
{
    if(n==0) return 0;
    switch(abs(n)%2)
    {
        case 1:
             return sign(n)*(abs(n)+1);
        case 0:
             return -sign(n)*(abs(n)-1);
    }
}   

ඇත්ත වශයෙන්ම තවත් විකල්පයක් නම්, 0 ට අනුකූල නොවීම සහ අප ඉවත් කළ අංක 2 ප්‍රසාද දීමනාවක් ලෙස ලබා ගැනීමයි. (නමුත් එය මෝඩකමක් නම් පමණි.)


29
ගෝලීය විචල්‍යයන් හෝ කේතය අපැහැදිලි කරන උපක්‍රම භාවිතා නොකර negative ණ සංඛ්‍යා හසුරුවන හොඳ ක්‍රියා පටිපාටික විසඳුමක් සොයා ගැනීමට මට මෙය බොහෝ දුරට කියවිය යුතු යැයි මට විශ්වාස කළ නොහැකිය. මට ඔබට කිහිප වතාවක් ඡන්දය දිය හැකි නම්, මම එසේ කරමි.
කයිල් සිමෙක්

ලස්සන නිරීක්ෂණ, ඕනෑම nonzero නිඛිල ඔත්තේ සංඛ්යාවක් පවතින බව n අත්සන් බිටු.
ඇන්ඩ්‍රෙස් ජාන් ටැක්

මෙය මගේ පිළිතුර ද වනු ඇත, නමුත් දාරයේ සිද්ධියෙන් පරිස්සම් වන්න n = -2147483648(අවම අගය); ඔබට abs(n)එවැනි අවස්ථාවකදී කළ නොහැකි අතර ප්‍රති result ලය නිර්වචනය නොකෙරේ (හෝ ව්‍යතිරේකයක්).
කිර්ක් බ්‍රෝඩ්හර්ස්ට්

1
@ a1kmm: කණගාටුයි, ඉහත -2³¹ -2³¹ විය යුතුය. කෙසේ වෙතත්, f (0) ≠ 0 (සහ f (0) = - 2³¹) ඇත්ත වශයෙන්ම පහසු අවස්ථාව වන අතර, අප පෙන්වා දුන් පරිදි මේ දෙක අනෙක් ඒවා අතර විසන්ධි වී ඇත. අප සලකා බැලිය යුතු අනෙක් අවස්ථාව නම් f (0) = 0, නමුත් f (x) = - 2³¹ සමහර x ≠ 0, x ≠ -2³¹ සඳහා. එවැනි අවස්ථාවකදී, f (-2³¹) = f (f (x)) = - x (සටහන -x -2³¹ විය නොහැක, මන්ද එවැනි x නොපවතී). තවදුරටත් f (-x) = y කරමු. එවිට f (y) = f (f (-x)) = x. නැවතත් y -2³¹ විය නොහැක (f (y) = x ලෙස, නමුත් f (-2³¹) = - x, සහ x 0 නොවේ). ඉතින්, -2³¹ = f (x) = f (f (y)) = - y, එය කළ නොහැකි ය. එබැවින් ඇත්ත වශයෙන්ම 0 සහ -2³¹ අනෙක් ඒවායින් විසන්ධි කළ යුතුය (වෙනත් දෙයක රූපය නොවේ).
ශ්‍රීවාසර්

1
(මම උපකල්පනය කරන පරිදි) අපි කතා කරන්නේ බිට් 32 ක පූර්ණ සංඛ්‍යා දෙකක් ගැන නම්, අත්සන් කළ ශුන්‍යයන් නොමැත.
ගොෆ්රි

146

සී ++ හි අධික ලෙස පැටවීමට ස්තූතියි:

double f(int var)
{
 return double(var);
} 

int f(double var)
{
 return -int(var);
}

int main(){
int n(42);
std::cout<<f(f(n));
}

4
අවාසනාවකට මෙන්, නම මැන්ග්ලිං නිසා, ඔබ "f" ලෙස හඳුන්වන ශ්‍රිතවලට ඇත්ත වශයෙන්ම වෙහෙසකර නම් ඇත.
pyon

1
මම ඒ වගේ දෙයක් ගැන හිතුවා, නමුත් සී ගැන සිතමින්, මෙය ඉවතට විසි කළා ... හොඳ රැකියාවක්!
ලිරන් ඔරෙවි

U රූයි ක්‍රවේරියෝ: එය .NET 3.5+ හි ක්‍රියා නොකරනු ඇත.
ක්‍රෙඩ්න්ස්

72
තාක්ෂණික වශයෙන් ... ප්‍රශ්නය ඉල්ලා සිටින්නේ මෙය නොවේ. ඔබ 2 f () ශ්‍රිත, f (int) සහ f (float) අර්ථ දක්වා ඇති අතර ප්‍රශ්න අසන්නේ "ශ්‍රිතයක් f () නිර්මාණය කරන්න ..."
elcuco

3
celcuco තාක්ෂණික වශයෙන්, ඇත්ත වශයෙන්ම, නමුත් තර්කානුකූලව එය බහු බරක් සහිත එක් කාර්යයකි (ඔබට එය සමඟ f (f (42)) කළ හැකිය). නිර්වචනය පරාමිතීන් සහ ප්‍රතිලාභ අගය ගැන කිසිවක් නොකියන හෙයින්, එය තාක්‍ෂණික අර්ථ දැක්වීමක් ලෙස මට පිළිගත නොහැකිය.
මාරෙක් ටෝමන්

135

නැතහොත්, ඔබට පෙර සැකසුම්කරු අපයෝජනය කළ හැකිය:

#define f(n) (f##n)
#define ff(n) -n

int main()
{
  int n = -42;
  cout << "f(f(" << n << ")) = " << f(f(n)) << endl;
}

එහෙනම් ඔබ කොන්රාඩ් "ලෙ චිෆ්රේ" රුඩොල්ෆ් වේවිද? මම මගේ කබාය ගන්නම්. ඔව්, සමස්ත "අවලංගු ප්‍රධාන" දේ ගැන මම දනිමි, නමුත් "ආපසු 0;" එතරම් අමතර උත්සාහයක් පමණි ;-)
Skizz

25
KSkizz, int return අගය සමඟ වුවද c ++ හි ප්‍රධාන සිට ආපසු 0 අවශ්‍ය නොවේ ... එබැවින් එය නිවැරදිව කිරීමෙන් ඔබ සැබවින්ම අඩු අක්‍ෂරයක් ටයිප් කරන්න!
ඩෑන් ඕල්සන්

10
ස්කීස් සෑම විටම පෙර සැකසුම්කරු අපයෝජනය කරයි: ඩී
ආර්නිස් ලැප්සා

23
මෙය ශ්‍රිතයක් නොවේ .. එබැවින් මෙය වලංගු විසඳුමක් නොවේ
smerlin

3
mer ස්මර්ලින්: එය තාක්‍ෂණිකව පේළිගත ශ්‍රිතයක් නැවත ලබා දීමකි: දෙකෙහිම සිරුරු සම්පාදනය කරන වේලාවේදී හෝ ඊට පෙර පුළුල් වේ. මීට වඩා කාර්යක්ෂමව ලබා ගත නොහැක.
ජෝන් පර්ඩි

103

සියලුම negative ණ සංඛ්‍යා සඳහා මෙය සත්‍ය වේ.

    f (n) = abs (n)

ද්වි අනුපූරක නිඛිල සඳහා ධනාත්මක සංඛ්‍යා ඇතිවාට වඩා එක් negative ණ සංඛ්‍යාවක් ඇති හෙයින්, විසඳුමට f(n) = abs(n)වඩා එක සිද්ධියක් සඳහා වලංගු වේ . ඔබට එකින් එක තේරුණා ...: ඩීf(n) = n > 0 ? -n : nf(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.MinValuethemselve චේට ඇත. එබැවින් චක්රය ඇත්ත වශයෙන්ම පහත පරිදි වේ.

    +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කාර්යය අයදුම්පත් දෙකකට පසුව හා අසමත් යෙදවුම් දෙකක් අපට තබන්න. එබැවින් සියලු අගයන් සඳහා ක්‍රියා කරන ශ්‍රිතයක් තැනීමට හැකියාවක් නැත, නමුත් එකක් හැර සෙසු සියලු අගයන් සඳහා ක්‍රියා කරන එකක් අප සතුව ඇති අතර මෙය අපට ළඟා කර ගත හැකි හොඳම දේ වේ.


නිර්ණායක සපුරාලන්නේ නැත: abs (abs (n))! = -N
Dan Olson

ඔහු කීවාක් මෙන් සියලු negative ණ සංඛ්‍යා සඳහා එය සිදු වන බව සහතිකයි. එය ප්‍රශ්නයේ කොටසකි: ඔබට සාමාන්‍ය එකක් ඉදිරිපත් කළ නොහැකි නම්, හැකි පුළුල්ම පරාසය සඳහා වැඩ කරන එකක් ඉදිරිපත් කරන්න.
jalf

මෙම පිළිතුර අවම වශයෙන් මාජ් සයිනෝවික් සහ රෝලන්ඩ් ෂෝගේ පිළිතුර තරම් හොඳ ය, එය වෙනස් සංඛ්‍යා පරාසයක් සඳහා ක්‍රියා කරයි
1800 තොරතුරු

19
මචන්, ඔබට "යාවත්කාලීනය" ඉවත් කර එක් නිවැරදි පිළිතුරක් ලියන්න. පහළ 3/4 ("වෙනත් පිළිතුරකින් දේවානුභාවයෙන්") නියමයි.
ඇන්ඩ්‍රෙස් ජාන් ටැක්

1
Negative ණ සංඛ්‍යා සඳහා වන අබ්-විසඳුමට මම ඇත්තෙන්ම කැමතියි. සරල හා පහසුවෙන් තේරුම් ගත හැකිය.
Thorbjørn Ravn Andersen

97

සංකීර්ණ සංඛ්‍යා භාවිතා කරමින්, අංකයක් ප්‍රතික්ෂේප කිරීමේ කාර්යය පියවර දෙකකට බෙදිය හැකිය:

  • n න් i න් ගුණ කරන්න, එවිට ඔබට n * i ලැබෙනු ඇත, එය n 90 ° ප්‍රතිවිරුද්ධ දිශාවට භ්‍රමණය වේ
  • i මගින් නැවත ගුණ කරන්න, එවිට ඔබට -n ලැබේ

විශිෂ්ට දෙය නම් ඔබට විශේෂ හැසිරවීමේ කේතයක් අවශ්‍ය නොවීමයි. මම ගුණ කිරීමෙන් පමණක් කාර්යය ඉටු කරයි.

නමුත් ඔබට සංකීර්ණ අංක භාවිතා කිරීමට අවසර නැත. එබැවින් ඔබේ දත්ත පරාසයේ කොටසක් භාවිතා කරමින් ඔබ කෙසේ හෝ ඔබේම මන inary කල්පිත අක්ෂයක් නිර්මාණය කළ යුතුය. ආරම්භක අගයන් තරම් මන inary කල්පිත (අතරමැදි) අගයන් ඔබට අවශ්‍ය බැවින්, ඔබට ඉතිරිව ඇත්තේ දත්ත පරාසයෙන් අඩක් පමණි.

අත්සන් කළ බිටු 8 දත්ත උපකල්පනය කරමින් මම පහත රූපයේ මෙය දෘශ්‍යමාන කිරීමට උත්සාහ කළෙමි. ඔබට මෙය බිටු 32 ක පූර්ණ සංඛ්‍යාවක් සඳහා පරිමාණය කිරීමට සිදුවේ. ආරම්භක n සඳහා අවසර ලත් පරාසය -64 සිට +63 දක්වා වේ. ධනාත්මක n සඳහා ශ්‍රිතය කරන්නේ කුමක්ද:

  • N 0..63 (ආරම්භක පරාසය) තුළ තිබේ නම්, ශ්‍රිත ඇමතුම 64 එකතු කරයි, n සිතියම්ගත කිරීම 64..127 පරාසයට (අතරමැදි පරාසය)
  • N 64..127 (අතරමැදි පරාසය) නම්, ශ්‍රිතය 64 සිට n අඩු කරයි, n සිතියම්ගත කිරීම 0 පරාසයට අනුරූප වේ ..- 63

Negative ණ n සඳහා, ශ්‍රිතය අතරමැදි පරාසය -65 ..- 128 භාවිතා කරයි.

alt පෙළ


4
@geschema, එම ලස්සන ග්‍රැෆික්ස් නිර්මාණය කිරීමට ඔබ භාවිතා කළ මෙවලම කුමක්ද?
jwfearn

10
කණගාටුයි, ප්‍රශ්නය පැහැදිලිවම සංකීර්ණ සංඛ්‍යා නොමැති බව පවසයි.
රුයි ක්‍රෙවීරෝ

6
@ ලිරාන්: මම භාවිතා කළේ ඔම්නි ග්‍රැෆල් (මැක්-පමණක්)
ගෙෂෙමා

39
+1 මම හිතන්නේ මෙය හොඳම පිළිතුරයි. මිනිසුන් ප්‍රමාණවත් තරම් කියවනු ඇතැයි මම නොසිතමි, මන්ද ඔවුන් සියල්ලන්ම සඳහන් කළේ සංකීර්ණ සංඛ්‍යා භාවිතා කළ නොහැකි බවයි. මම මුලු කාරණයම කියවූ අතර, ඔබ ඇසූ ප්‍රශ්නයට සංකීර්ණ නොවන විසඳුම සඳහා වේදිකාව සැකසීම සඳහා සංකීර්ණ අංකවලින් විසඳුම විස්තර කළෙමි. හරිම ලස්සනයි.
jrista

1
rist ක්‍රිස්ටා සියලු විසඳුම් දෙවන මානයක් භාවිතා කරයි, ඒ සියල්ලම 'සංකීර්ණ සංඛ්‍යා' සැබවින්ම වේ (බොහෝමයක් අමුතු එදිරිව පවා භාවිතා කරයි, සහ ඉහත භාවිතයන් floatඑදිරිව එදිරිව int). බොහෝ පිළිතුරු විස්තර කරන '4 මූලද්‍රව්‍ය වළල්ල' සඳහා ප්‍රාන්ත 4 ක් අවශ්‍ය වන අතර ඒවා ප්‍රාන්ත 2 ක් සහිත මානයන් 2 ක් ලෙස දැක්විය හැකිය. මෙම පිළිතුරේ ඇති ගැටළුව නම් එයට අමතර සැකසුම් ඉඩක් අවශ්‍ය වීමයි (-64..63 සඳහා 'ක්‍රියා කරන්නේ' පමණි, නමුත් -128..127 අවකාශය අවශ්‍ය වේ) සහ ලිඛිත සූත්‍රය පැහැදිලිව සඳහන් නොකරයි!
කිර්ක් බ්‍රෝඩ්හර්ස්ට්

65

Int.MaxValue සහ int.MinValue හැර ක්‍රියා කරයි

    public static int f(int x)
    {

        if (x == 0) return 0;

        if ((x % 2) != 0)
            return x * -1 + (-1 *x) / (Math.Abs(x));
        else
            return x - x / (Math.Abs(x));
    }

රූපමය


මෙය අවතක්සේරු කළේ ඇයිදැයි විශ්වාස නැත. එය අසමත් වන්නේ කුමන යෙදවුම් සඳහාද?
රොඩ්රික් චැප්මන්

ඔබ සිග්නම් ශ්‍රිතය භාවිතා නොකරන්නේ ඇයි?!?
comonad

1
රූපය ඇත්තෙන්ම හොඳයි. 0වෙත 0සහ -2147483648වෙත යවන්න-2147483648 , නිශේධනය ක්රියාකරු සඳහා ලකුණු මෙම අගයන් දෙක ස්ථාවර බැවින් x => -x. ඉතිරි අංක සඳහා, ඉහත රූපයේ ඊතල අනුගමනය කරන්න. සුරඩින්ගේ පිළිතුරෙන් සහ එහි අදහස් වලින් පැහැදිලි වන පරිදි, සංඛ්‍යා දෙකක් ඇත, මේ අවස්ථාවේ දී 2147483647සහ -2147483647වෙනත් යුගලයක් සමඟ හුවමාරු වීමට ඉතිරිව නැත.
ජෙප් ස්ටිග් නීල්සන්

එය සිනහවක් මෙන් පෙනේ - රැළි
රැසකින්

48

ප්රශ්නය එම ශ්රිතයේ ආදාන වර්ගය සහ නැවත අගය දේ ගැන කිසිම දෙයක් කියන්නේ නැහැ fවිය යුතු (ඔබ එය ඉදිරිපත් කළා එසේ නොවේ අවම වශයෙන්) ...

... n යනු බිටු 32 ක පූර්ණ සංඛ්‍යාවක් වන විට පමණි f(f(n)) = -n

ඉතින්, කොහොමද වගේ දෙයක්

Int64 f(Int64 n)
{
    return(n > Int32.MaxValue ? 
        -(n - 4L * Int32.MaxValue):
        n + 4L * Int32.MaxValue);
}

N යනු බිටු 32 ක පූර්ණ සංඛ්‍යාවක් නම් ප්‍රකාශය f(f(n)) == -nසත්‍ය වේ.

නිසැකවම, මෙම ප්‍රවේශය ඊටත් වඩා පුළුල් පරාසයක සංඛ්‍යා සඳහා වැඩ කිරීමට පුළුල් කළ හැකිය ...


2
සුනඛයා. චරිත සීමාව.
ජෝ ෆිලිප්ස්

2
ඔව්, මම ඒ හා සමාන ප්‍රවේශයක් මත වැඩ කරමින් සිටියෙමි. ඔයා මට ඒකට ගැහුවා. +1 :)
jalf

1
ඉතා දක්ෂයි! මෙය සංකීර්ණ සංඛ්‍යා භාවිතා කිරීමට (හා effectively ලදායී ලෙස සමාන) වන අතර එය පැහැදිලි සහ පරිපූර්ණ විසඳුම වනු ඇති නමුත් එය පැහැදිලිවම තහනම් කර ඇත. අවසර ලත් සංඛ්‍යා පරාසයෙන් පිටත වැඩ කිරීම.
කිර්ක් බ්‍රෝඩ්හර්ස්ට්

48

ජාවාස්ක්‍රිප්ට් සඳහා (හෝ වෙනත් ගතිකව ටයිප් කළ භාෂා) ඔබට ශ්‍රිතය පූර්ණ හෝ වස්තුවක් පිළිගෙන අනෙක ආපසු ලබා දිය හැකිය. එනම්

function f(n) {
    if (n.passed) {
        return -n.val;
    } else {
        return {val:n, passed:1};
    }
}

දීම

js> f(f(10))  
-10
js> f(f(-10))
10

විකල්පයක් ලෙස ඔබට දැඩි ලෙස ටයිප් කළ භාෂාවකින් අධික ලෙස පැටවීම භාවිතා කළ හැකි නමුත් එය නීති කඩ කළ හැකිය

int f(long n) {
    return n;
}

long f(int n) {
    return -n;
}

දෙවැන්න "අ" (ඒකීය) ශ්‍රිතයක අවශ්‍යතාවය අදහස් නොකරයි. :)
ඩ්‍රූ

පිළිතුරේ දෙවන භාගය ඉවත් කරන්න, මෙය නිවැරදි පිළිතුරකි.
jmucchiello

Rew ඩ්‍රූ ඒ නිසා එය නීති කඩ කළ හැකි බව මා සඳහන් කළා
කොබල්

2
ජාවාස්ක්‍රිප්ට් හි, ශ්‍රිතයක් වස්තුවක් වන අතර එමඟින් රාජ්‍යයක් තබා ගත හැකිය.
නොස්රෙඩ්නා

1
IMO: ශ්‍රිතය f (n) {ආපසු n.passed? -n.val: {val: n, සම්මත: 1} more වඩාත් කියවිය හැකි හා කෙටි වේ.
SamGoody

46

ඔබගේ වේදිකාව මත පදනම්ව, සමහර භාෂාවන් මඟින් ක්‍රියාකාරීත්වය පවත්වා ගැනීමට ඔබට ඉඩ සලසයි. VB.Net, උදාහරණයක් ලෙස:

Function f(ByVal n As Integer) As Integer
    Static flag As Integer = -1
    flag *= -1

    Return n * flag
End Function

IIRC, C ++ ද මේ සඳහා ඉඩ දී ඇත. මම හිතන්නේ ඔවුන් වෙනස් විසඳුමක් සොයනවා.

තවත් අදහසක් නම්, ශ්‍රිතයට පළමු ඇමතුමේ ප්‍රති result ලය ඔවුන් විසින් නිර්වචනය කර නොමැති බැවින්, ලකුණ පෙරළා දැමිය යුතුද යන්න පාලනය කිරීම සඳහා ඔබට අමුතු / සන්ධ්‍යාවක් භාවිතා කළ හැකිය:

int f(int n)
{
   int sign = n>=0?1:-1;
   if (abs(n)%2 == 0)
      return ((abs(n)+1)*sign * -1;
   else
      return (abs(n)-1)*sign;
}

සියලු ඉරට්ටේ සංඛ්‍යා වල විශාලත්වයට එකක් එක් කරන්න, සියලු අමුතු සංඛ්‍යා වල විශාලත්වයෙන් එකක් අඩු කරන්න. ඇමතුම් දෙකක ප්‍රති result ලයට එකම විශාලත්වයක් ඇත, නමුත් එක් ඇමතුමක් ඇති තැන පවා අපි ලකුණ මාරු කරමු. මෙය ක්‍රියාත්මක නොවන සමහර අවස්ථා තිබේ (-1, උපරිම හෝ මිනි ඉන්ට), නමුත් එය මෙතෙක් යෝජනා කර ඇති සියල්ලටම වඩා බොහෝ සෙයින් ක්‍රියා කරයි.


1
එය සැමවිටම අමුතු බැවින් එය MAX_INT සඳහා ක්‍රියා කරයි යැයි මම විශ්වාස කරමි. එය MIN_INT සහ -1 සඳහා ක්‍රියා නොකරයි.
එයාර්සෝර්ස් ලිමිටඩ්

9
අතුරු ආබාධ තිබේ නම් එය කාර්යයක් නොවේ.
අංක

12
එය ගණිතයේ සත්‍ය විය හැකි නමුත් වැඩසටහන්කරණයේදී එය අදාල නොවේ. එබැවින් ප්‍රශ්නය වන්නේ ඔවුන් ගණිතමය විසඳුමක් හෝ ක්‍රමලේඛ විසඳුමක් සොයනවාද යන්නයි. නමුත් එය ක්‍රමලේඛන රැකියාවක් සඳහා ලබා දී ඇති නිසා ...
රයන් ලුන්ඩි

+1 මම ප්‍රතිදානය ප්‍රතික්ෂේප කිරීමත් සමඟ FIFO ක්‍රියාත්මක කරමින් “ස්ථිතික int x” සමඟ C සමඟ එකක් පළ කිරීමට අදහස් කළෙමි. නමුත් මෙය ප්රමාණවත් තරම් සමීපයි.
phkahler

2
osnos: ඔව්, එය යොමු පාරදෘශ්‍ය නොවේ.
ක්ලාක් ගේබෙල්

26

ජාවාස්ක්‍රිප්ට් ව්‍යතිරේකයන් ගසාකෑම.

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

f(f(0)) => 0

f(f(1)) => -1


මීට පෙරද මෙවැනි ව්‍යතිරේක භාවිතා කර ඇති බවට මට සැකයි ... :)
NoBugs

+1 කොටුවෙන් පිටත සිතීම. සිසිල්! නමුත් නිෂ්පාදන කේතයේ දී මම යතුරු ලියනය භාවිතා කරන්නේ ආරක්ෂිතව ය.

21

සියලුම බිට් 32 අගයන් සඳහා (-0 -2147483648 යන අවවාදය සමඟ)

int rotate(int x)
{
    static const int split = INT_MAX / 2 + 1;
    static const int negativeSplit = INT_MIN / 2 + 1;

    if (x == INT_MAX)
        return INT_MIN;
    if (x == INT_MIN)
        return x + 1;

    if (x >= split)
        return x + 1 - INT_MIN;
    if (x >= 0)
        return INT_MAX - x;
    if (x >= negativeSplit)
        return INT_MIN - x + 1;
    return split -(negativeSplit - x);
}

ඔබ මූලික වශයෙන් එක් එක් -x => x => -x පුඩුවක් ay => -y => y පුඩුවක් සමඟ සම්බන්ධ කළ යුතුය. ඒ නිසා මම ප්‍රතිවිරුද්ධ පැති යුගලනය කළා split.

උදා: බිට් නිඛිල 4 ක් සඳහා:

0 => 7 => -8 => -7 => 0
1 => 6 => -1 => -6 => 1
2 => 5 => -2 => -5 => 2
3 => 4 => -3 => -4 => 3

21

සී ++ අනුවාදයක්, බොහෝ විට නීති රීති තරමක් නැමී ඇති නමුත් සියලු සංඛ්‍යාත්මක වර්ග සඳහා (පාවෙන, තීන්ත, ද්විත්ව) සහ ඒකීය us ණතාව ඉක්මවා යන පන්ති වර්ග සඳහා පවා ක්‍රියා කරයි:

template <class T>
struct f_result
{
  T value;
};

template <class T>
f_result <T> f (T n)
{
  f_result <T> result = {n};
  return result;
}

template <class T>
T f (f_result <T> n)
{
  return -n.value;
}

void main (void)
{
  int n = 45;
  cout << "f(f(" << n << ")) = " << f(f(n)) << endl;
  float p = 3.14f;
  cout << "f(f(" << p << ")) = " << f(f(p)) << endl;
}

හොඳ අදහස. විකල්පයක් ලෙස, ඔබට බොහෝ විට ව්‍යුහය අහිමි විය හැකි අතර ඒ වෙනුවට එක් ශ්‍රිතයක් දර්ශකයක් නැවත ලබා දිය හැකිය, අනෙක් ශ්‍රිතය විරූපණය සහ ප්‍රතික්ෂේප කරන්න.
ඉම්බු

20

x86 asm (AT&T style):

; 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

කේතය පරික්ෂා කර ඇත, හැකි 32bit පූර්ණ සංඛ්‍යා පසු කර ඇත, -2147483647 සමඟ දෝෂයකි (පිටාර ගැලීම).


19

ගෝලීය භාවිතා කරයි ... නමුත් එසේද?

bool done = false
f(int n)
{
  int out = n;
  if(!done)
  {  
      out = n * -1;
      done = true;
   }
   return out;
}

3
මෙය ප්‍රශ්න අසන්නාගේ අභිප්‍රාය බව විශ්වාස නැත, නමුත් "කොටුවෙන් පිටත සිතීම" සඳහා +1.
ලිරන් ඔරෙවි

5
කොන්දේසි සහිතව "done = true" යැයි පැවසීම වෙනුවට, ඔබ සැමවිටම "done =! Done" යැයි පැවසිය යුතුය, එමඟින් ඔබේ ශ්‍රිතය එක් වරකට වඩා භාවිතා කළ හැකිය.
ක්‍රිස් ලුට්ස්

H ක්‍රිස්, සත්‍ය ලෙස සැකසීම if (! .
nsayer

1
මගේ පළමු අදහස වූයේ මෙම විශේෂිත ප්‍රශ්නයට වංචා කිරීමක් ලෙස හැඟුණත් ගෝලීය විචල්‍යයක් භාවිතා කරමින් මෙය විසඳීමයි. කෙසේ වෙතත්, ගෝලීය විචල්‍ය විසඳුමක් යනු ප්‍රශ්නයේ පිරිවිතරයන්ට අනුව හොඳම විසඳුම යැයි මම තර්ක කරමි. ගෝලීයයක් භාවිතා කිරීමෙන් සිදුවන්නේ කුමක්ද යන්න තේරුම් ගැනීම ඉතා පහසු කරයි. කළ දෙයක්! = කළත් වඩා හොඳ බව මම එකඟ වෙමි. If වගන්තියට පිටතින් එය ගෙනයන්න.
ඇල්ඩරත්

3
තාක්ෂණික වශයෙන්, රාජ්‍යය පවත්වා ගෙන යන ඕනෑම දෙයක් ශ්‍රිතයක් නොව රාජ්‍ය යන්ත්‍රයකි. විසින් නිර්වචනය , විශාල උත්සවයක් සෑම විටම එකම ආදානය සඳහා එකම ප්රතිඵලය ලබා දෙයි.
ටෙඩ් හොප්

19

මෙම පර්ල් විසඳුම පූර්ණ සංඛ්‍යා, පාවෙන සහ නූල් සඳහා ක්‍රියා කරයි .

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

නමුත් එය එය පූර්ණ ලෙස තබා නොගනී. ඔබ අත්‍යවශ්‍යයෙන්ම ගෝලීය විචල්‍ය දත්ත int "n" තුළම ගබඩා කරයි ... එය int එකක් නොවේ නම් හැර ඔබට එය කළ නොහැක. උදාහරණයක් ලෙස nමට 548 සෑදිය හැකි නූලක් නම් "පළමු_ ටයිම්_548" බවට පත් වන අතර ඊළඟ වතාවේ එය ශ්‍රිතය හරහා ධාවනය වේ නම් ... (උපසර්ගය == පළමු_ ටයිම්_ ")" ෆස්ට්_ටයිම්_ "වෙනුවට" - "වෙනුවට ආදේශ කරන්න
ඇල්බට් රෙන්ෂෝ

L ඇල්බට් රෙන්ෂෝ ඔබට එම අදහස් ලැබෙන්නේ කොහෙන්දැයි විශ්වාස නැත. (1) මෙහි අනිවාර්යයෙන්ම ගෝලීය විචල්‍යයන් නොමැත. (2) ඔබ ශ්‍රිතයට int එකක් ලබා දෙන්නේ නම්, ඔබට ශ්‍රිතය අමුතු වාර ගණනක් අමතන්නේ නම්, ඔබට නැවත int එකක් ලැබෙනු ඇත. (3) සමහර විට වඩාත් මූලික වශයෙන් මෙය පර්ල් ය . සියළුම ප්‍රායෝගික අරමුණු සඳහා, තීන්ත සහ නූල් සම්පූර්ණයෙන්ම එකිනෙකට හුවමාරු වේ. ඉලක්කම් මෙන් පෙනෙන නූල් බොහෝ සන්දර්භයන්හි සංඛ්‍යා මෙන් හොඳින් ක්‍රියාත්මක වන අතර, ඉල්ලන සෑම විටම සංඛ්‍යා සතුටින් තද වේ.
එෆ්එම්සී

කණගාටුයි, මම ගෝලීය පර්යන්තයක් භාවිතා කරන බවක් පෙනෙන්නට නැත
ඇල්බට් රෙන්ෂෝ

18

F (x) එකම වර්ගයේ විය යුතු යැයි කිසිවෙකු පවසා නැත.

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


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

16

මම ඇත්ත වශයෙන්ම ගැටලුවට විසඳුමක් ලබා දීමට උත්සාහ නොකරමි, නමුත් අදහස් කිහිපයක් තිබේ, මෙම ප්‍රශ්නය මතු වූ ප්‍රශ්නය (රැකියාව?) සම්මුඛ සාකච්ඡාවක කොටසකි:

  • මම මුලින්ම අසන්නේ "එවැනි කාර්යයක් අවශ්‍ය වන්නේ ඇයි? මෙහි ඇති විශාලතම ගැටළුව කුමක්ද?" එම ස්ථානයේ ඇති සැබෑ ගැටළුව විසඳීමට උත්සාහ කරනවා වෙනුවට. මෙයින් මා සිතන්නේ කෙසේද සහ මා මෙවැනි ගැටළු විසඳන්නේ කෙසේද යන්න පෙන්වයි. කවුද දන්නෙ? සම්මුඛ සාකච්ඡාවකදී ප්‍රශ්නය ඇසූ සැබෑ හේතුව එය විය හැකිය. පිළිතුර නම් "කමක් නෑ, එය අවශ්‍ය යැයි උපකල්පනය කර ඔබ මෙම ක්‍රියාව සැලසුම් කරන්නේ කෙසේදැයි මට පෙන්වන්න." මම දිගටම එසේ කරමි.
  • ඉන්පසුව, මම භාවිතා කරන C # පරීක්ෂණ සිද්ධි කේතය ලියමි (පැහැදිලිව: ලූප සිට සිට int.MinValueදක්වා)int.MaxValue , සහ එක් එක් සඳහා nබව පරාසයක ඇමතුමක් f(f(n))අතර එහි ප්රතිඵල පරීක්ෂා වේ-n නම් මම එවැනි ක්රියාවන් සඳහා ලබා ගැනීමට ටෙස්ට් පලවා හරින්න සංවර්ධන භාවිතා කරන කියන,).
  • සම්මුඛ පරීක්‍ෂකවරයා දිගින් දිගටම මගෙන් ඉල්ලා සිටින ගැටලුව විසඳන ලෙස ඉල්ලා සිටියහොත් පමණක් මම සම්මුඛ පරීක්ෂණය අතරතුරදී ව්‍යාජ කේතයක් ලිවීමට උත්සාහ කර යම් ආකාරයක පිළිතුරක් ලබා ගැනීමට උත්සාහ කරමි. කෙසේ වෙතත්, සම්මුඛ පරීක්‍ෂකවරයා සමාගම කෙබඳුද යන්න පිළිබඳ කිසියම් ඇඟවීමක් කළහොත් මම රැකියාව භාර ගැනීමට පනින්නෙමි යැයි මම නොසිතමි ...

ඔහ්, මෙම පිළිතුර උපකල්පනය කරන්නේ සම්මුඛ පරීක්ෂණය සී # ක්‍රමලේඛනය හා සම්බන්ධ තනතුරක් සඳහා බවය. සම්මුඛ පරීක්ෂණය ගණිතය හා සම්බන්ධ තනතුරක් සඳහා නම් ඇත්ත වශයෙන්ම මෝඩ පිළිතුරක් වනු ඇත. ;-)


7
ඔබ වාසනාවන්තයි ඔවුන් 32 ක් ඉල්ලා සිටි අතර, එය බිට් 64 ක් නම් ඔබ පරීක්ෂණ පැවැත්වීමෙන් පසු සම්මුඛ පරීක්ෂණය කිසි විටෙකත්
නොපවතිනු ඇත

ඇත්ත වශයෙන්ම, මම ඇත්ත වශයෙන්ම එම පරීක්ෂණය ලිවීමට හා සම්මුඛ පරීක්ෂණයක් අතරතුර එය ක්‍රියාත්මක කිරීමට යම් ස්ථානයකට ගියහොත්. ;-) මගේ අදහස: සම්මුඛ සාකච්ඡාවකදී මම එම ස්ථානයට නොපැමිණීමට උත්සාහ කරමි. මගේ මතය අනුව "ඔහු කේත රේඛා ලියන්නේ කෙසේද" යන්නට වඩා ක්‍රමලේඛනය "සිතීමේ ක්‍රමයක්" වේ.
peSHIr

7
සම්මුඛ පරීක්ෂණයකදී මෙම උපදෙස් අනුගමනය නොකරන්න. සම්මුඛ පරීක්‍ෂකවරයා ඔබ සැබවින්ම ප්‍රශ්නයට පිළිතුරු දෙනු ඇතැයි අපේක්ෂා කරයි. ප්‍රශ්නයේ අදාළත්වය ප්‍රශ්න කිරීමෙන් ඔබට කිසිවක් මිලට ගත නොහැකි නමුත් එය සම්මුඛ පරීක්‍ෂකවරයාට කරදරයක් විය හැකිය. සුළු පරීක්ෂණයක් සැලසුම් කිරීමෙන් ඔබට පිළිතුරට කිසිදු පියවරක් සමීප නොවන අතර සම්මුඛ පරීක්ෂණයේදී ඔබට එය ක්‍රියාත්මක කළ නොහැක. ඔබට අමතර තොරතුරු (බිට් 32) ලැබෙන්නේ නම්, එය ප්‍රයෝජනවත් වන්නේ කෙසේදැයි සොයා ගැනීමට උත්සාහ කරන්න.
ස්ටෙෆාන් හවුස්ටයින්

මා වැඩි විස්තර ඉල්ලා සිටින විට කෝපයට පත්වන සම්මුඛ පරීක්‍ෂකවරයෙක් (මෙම ක්‍රියාවලියේදී ඔහුගේ ප්‍රශ්නයේ අදාළත්වය ප්‍රශ්න කරන අතරම) සම්මුඛ පරීක්‍ෂකවරයකු නොවේ. එබැවින් සම්මුඛ සාකච්ඡා වලදී මම දිගටම එවැනි ප්‍රශ්න අසමි. ඔවුන් එයට අකමැති නම්, අපගේ කාලය තවදුරටත් නාස්ති කිරීම නැවැත්වීම සඳහා සම්මුඛ පරීක්ෂණය අවසන් කරමි. "මම ඇණවුම් පමණක් අනුගමනය කරමින් සිටියෙමි" යන මනස කැමති නැත. ඔබත්..?
peSHIr

16

මම ඔබට වඩාත්ම වැදගත් බිටු 2 වෙනස් කරමි.

00.... => 01.... => 10.....

01.... => 10.... => 11.....

10.... => 11.... => 00.....

11.... => 00.... => 01.....

ඔබට පෙනෙන පරිදි, එය එකතු කිරීමක් පමණි.

මම පිළිතුරට ආවේ කෙසේද? මගේ පළමු සිතුවිල්ල සමමිතිය සඳහා අවශ්‍යතාවයක් පමණි. මා ආරම්භ කළ ස්ථානයට ආපසු යාමට වාර 4 ක්. මුලදී මම හිතුවා, ඒක 2bit අළු කේතය කියලා. එවිට මම සිතුවේ ඇත්ත වශයෙන්ම සම්මත ද්විමය ප්‍රමාණවත් බවයි.


මෙම ප්‍රවේශයේ ඇති ගැටළුව නම් එය දෙදෙනෙකුගේ අනුපූරක negative ණ සංඛ්‍යා සමඟ ක්‍රියා නොකිරීමයි (සෑම නවීන CPU එකක්ම භාවිතා කරන්නේ එයයි). ඒ නිසා තමයි මම මගේ සමාන පිළිතුර මකා දැමුවේ.
ටමාස් සීනෙජ්

ප්‍රශ්නය 32-බිට් අත්සන් කළ පූර්ණ සංඛ්‍යා නියම කර ඇත. බිට් 32 අත්සන් කරන ලද පූර්ණ සංඛ්‍යා දෙකේ අනුපූරක හෝ කෙනෙකුගේ අනුපූරක නිරූපණයන් සඳහා මෙම විසඳුම ක්‍රියා නොකරයි. එය ක්‍රියාත්මක වන්නේ නවීන පරිගණකවල (පාවෙන ලක්ෂ්‍ය සංඛ්‍යා හැර) ඉතා සුලභ වන සං sign ා සහ විශාලත්ව නිරූපණයන් සඳහා පමණි.
ජෙෆ්රි එල් වයිට්ලෙජ්

1
RDrJokepu - වාව්, මාස හයකට පසු - ජින්ක්ස්!
ජෙෆ්රි එල් වයිට්ලෙජ්

ශ්‍රිතය තුළ ඇති සං sign ා සහ විශාලත්ව නිරූපණයට සංඛ්‍යා පරිවර්තනය කිරීම, පරිණාමනය සිදු කිරීම, ඉන්පසු එය ආපසු ලබා දීමට පෙර ස්වදේශීය පූර්ණ සංඛ්‍යා නිරූපණය වන ඕනෑම දෙයකට ආපසු හැරවීම අවශ්‍ය නොවේද?
බිල් මිචෙල්


16

මෙම ගැටළුව විසඳීම සඳහා සංකීර්ණ සංඛ්‍යා භාවිතා කළ නොහැකි බවට අවශ්‍යතාවයෙන් හෝ ප්‍රකාශ කිරීමෙන් විසඳුමක් මෙන්න.

-1 හි වර්ග මූලයෙන් ගුණ කිරීම අදහසකි, එය අසාර්ථක වන බව පෙනෙන්නේ -1 ට පූර්ණ සංඛ්‍යා වලට වඩා වර්ග මූලයක් නොමැති බැවිනි. නමුත් ගණිතය වැනි වැඩසටහනක් සමඟ සෙල්ලම් කිරීම උදාහරණයක් ලෙස සමීකරණය ලබා දෙයි

(1849436465 2 +1) මොඩ් (2 32 -3) = 0.

මෙය -1 හි වර්ග මූලයක් තිබීම තරම්ම හොඳයි. ශ්‍රිතයේ ප්‍රති result ලය අත්සන් කළ පූර්ණ සංඛ්‍යාවක් විය යුතුය. එනිසා මම නවීකරණය කරන ලද මොඩියුලෝ මෙහෙයුම් මොඩ්ස් (x, n) භාවිතා කිරීමට බලාපොරොත්තු වන අතර එය පූර්ණ සංඛ්‍යා y x x මොඩියුලෝ n වෙත 0 ට ආසන්න වන අතර එය 0 ට ආසන්න වේ. . උදා: පයිතන්හි එය:

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)

f(f(x)) = -xපරාසය තුළ ඇති සියලුම නිඛිල සඳහා මෙය තෘප්තිමත් වේ . ප්‍රති results ල ද මෙම පරාසය තුළ ඇත, නමුත් ඇත්ත වශයෙන්ම ගණනය කිරීම සඳහා බිට් 64 පූර්ණ සංඛ්‍යාවක් අවශ්‍ය වේ.[-231-2, 231-2]f(x)


13

2 # 32 - 1 ඉලක්කම් සඳහා C #, (Int32.MinValue) හැර අනෙකුත් සියලුම int32 අංක

    Func<int, int> f = n =>
        n < 0
           ? (n & (1 << 30)) == (1 << 30) ? (n ^ (1 << 30)) : - (n | (1 << 30))
           : (n & (1 << 30)) == (1 << 30) ? -(n ^ (1 << 30)) : (n | (1 << 30));

    Console.WriteLine(f(f(Int32.MinValue + 1))); // -2147483648 + 1
    for (int i = -3; i <= 3  ; i++)
        Console.WriteLine(f(f(i)));
    Console.WriteLine(f(f(Int32.MaxValue))); // 2147483647

මුද්‍රණ:

2147483647
3
2
1
0
-1
-2
-3
-2147483647

මෙය 1073741824 වන f (0) සඳහාද ක්‍රියා නොකරයි. F (1073741824) = 0. f (f (1073741824)) = 1073741824
දීනා

ඔබ සාමාන්යයෙන් ඕනෑම ටිකක් ප්රමාණයේ දෙදෙනාගේ සහකාරියක් පූර්ණ සංඛ්යාමය වර්ගය සඳහා, මෙම උත්සවය බව ඔප්පු කළ හැකි යුතු ආදාන වටිනාකම් අවම වශයෙන් දෙකක් වැඩ නෑ.
ස්ලකර්

12

අත්‍යවශ්‍යයෙන්ම ශ්‍රිතයට පවතින පරාසය 4 ප්‍රමාණයේ චක්‍රවලට බෙදිය යුතු අතර, n හි චක්‍රයේ ප්‍රතිවිරුද්ධ කෙළවරේ. කෙසේ වෙතත්, 0 ප්‍රමාණය 1 ප්‍රමාණයේ චක්‍රයක කොටසක් විය යුතුය0->x->0->x != -x . 0 තනිව සිටීම නිසා, අපගේ පරාසය තුළ තවත් අගයන් 3 ක් තිබිය යුතුය (ඒවායේ ප්‍රමාණය 4 න් ගුණ කළ යුතුය) මූලද්‍රව්‍ය 4 ක් සහිත නිසි චක්‍රයක නොවේ.

මම කල මෙම අතිරේක අමුතු අගයන් තීරණය MIN_INT, MAX_INTසහ MIN_INT+1. තව දුරටත්, නිවැරදිව MIN_INT+1සිතියම් ගත කරනු ඇත MAX_INT, නමුත් එහි සිරවී නැවත සිතියම් ගත නොකරනු ඇත. මම හිතන්නේ මෙය හොඳම සම්මුතියකි, මන්ද එය සතුව ඇත්තේ නිවැරදි අගයන් පමණක් නිවැරදිව ක්‍රියා නොකිරීමේ හොඳ දේපලකි. එසේම, එයින් අදහස් වන්නේ එය සියලු බිග් ඉන්ට්ස් සඳහා වැඩ කරන බවයි.

int f(int n):
    if n == 0 or n == MIN_INT or n == MAX_INT: return n
    return ((Math.abs(n) mod 2) * 2 - 1) * n + Math.sign(n)

12

කිසිවෙකු කීවේ එය අස්ථායි විය යුතු බවයි.

int32 f(int32 x) {
    static bool idempotent = false;
    if (!idempotent) {
        idempotent = true;
        return -x;
    } else {
        return x;
    }
}

වංචා කිරීම, නමුත් බොහෝ උදාහරණ තරම් නොවේ. ඊටත් වඩා නපුර වනුයේ ඔබේ අමතන්නාගේ ලිපිනය & f දැයි බැලීමට තොගය සොයා ගැනීමයි, නමුත් මෙය වඩාත් අතේ ගෙන යා හැකි වනු ඇත (නූල් ආරක්ෂිත නොවුනත් ... නූල්-ආරක්ෂිත අනුවාදය TLS භාවිතා කරයි). ඊටත් වඩා නපුර:

int32 f (int32 x) {
    static int32 answer = -x;
    return answer;
}

ඇත්ත වශයෙන්ම, මේ දෙකම MIN_INT32 සම්බන්ධයෙන් එතරම් හොඳින් ක්‍රියා නොකරයි, නමුත් පුළුල් වර්ගයක් ආපසු ලබා දීමට ඔබට ඉඩ නොදුනහොත් ඔබට ඒ පිළිබඳව කළ හැකි වටිනා අල්ප ප්‍රමාණයක් ඇත.


ලිපිනය ගැන විමසීමට ඔබට එය 'උත්ශ්‍රේණිගත' කළ හැකිය (ඔව්, ඔබ එය යොමු කරන්නෙකු ලෙස ref by මගින් ලබා ගත යුතුය) - C හි, උදාහරණයක් ලෙස: int f (int & n) {static int * addr = & n; if (addr == & n) {return -n; } ආපසු n; }
IUnknownPointer

11

31 වන බිට් එක මන inary කල්පිත ලෙස භාවිතා කිරීම මට සිතාගත හැකිය ( i ) බිට් යනු මුළු පරාසයෙන් අඩකටම සහාය වන ප්‍රවේශයකි.


මෙය වඩාත් සංකීර්ණ නමුත් වර්තමාන හොඳම පිළිතුරට වඩා effective
1800 තොරතුරු

1
00 1800 තොරතුරු: අනෙක් අතට, [-2 ^ 30 + 1, 2 ^ 30-1] වසම පරස්පර වන අතර එය ගණිතමය දෘෂ්ටි කෝණයකින් වඩාත් සිත් ඇදගන්නා සුළුය.
ජොචෙන් වෝල්ටර්

10

n = [0 .. 2 ^ 31-1] සඳහා ක්‍රියා කරයි

int f(int n) {
  if (n & (1 << 31)) // highest bit set?
    return -(n & ~(1 << 31)); // return negative of original n
  else
    return n | (1 << 31); // return n with highest bit set
}

10

ප්රශ්නය රාජ්යයන් "32-bit අත්සන් නිඛිල" නමුත් ඔවුන් ද යන්න සඳහන් නොවේ දෙදෙනා බැගින්-සහකාරියක් හෝ අය-සහකාරියක් .

ඔබ ඒවා අනුපූරක ලෙස භාවිතා කරන්නේ නම්, සියලු 2 ^ 32 අගයන් හතරවන චක්‍රයේ සිදු වේ - ඔබට ශුන්‍යය සඳහා විශේෂ අවස්ථාවක් අවශ්‍ය නොවන අතර ඔබට කොන්දේසි ද අවශ්‍ය නොවේ.

සී හි:

int32_t f(int32_t x)
{
  return (((x & 0xFFFFU) << 16) | ((x & 0xFFFF0000U) >> 16)) ^ 0xFFFFU;
}

මෙය ක්‍රියාත්මක වන්නේ

  1. ඉහළ සහ අඩු 16-බිට් බ්ලොක් හුවමාරු කිරීම
  2. එක් බ්ලොක් එකක් පෙරළීම

පාස් දෙකකට පසු අපට මුල් අගයේ බිටු ප්‍රතිලෝම ඇත. ඒවායින් අනුපූරක නිරූපණය ප්‍රතික්ෂේප කිරීමට සමාන වේ.

උදාහරණ:

Pass |        x
-----+-------------------
   0 | 00000001      (+1)
   1 | 0001FFFF (+131071)
   2 | FFFFFFFE      (-1)
   3 | FFFE0000 (-131071)
   4 | 00000001      (+1)

Pass |        x
-----+-------------------
   0 | 00000000      (+0)
   1 | 0000FFFF  (+65535)
   2 | FFFFFFFF      (-0)
   3 | FFFF0000  (-65535)
   4 | 00000000      (+0)

1
විවිධ ගෘහ නිර්මාණ හරහා බයිට් ඇණවුම ගැන කුමක් කිව හැකිද?
ස්ටීවන්

1
සියලුම අංක ගණිතය 32-බිට් වේ. මම තනි බයිට් හසුරුවන්නේ නැත, එබැවින් බයිට් අනුපිළිවෙල එයට බලපාන්නේ නැත.
finnw

මේක හරියට කිට්ටුයි වගේ. ආදානය 2-අනුපූරකයක් යැයි ඔබට උපකල්පනය කළ හැකිය. එබැවින් ඔබ සං bit ා බිට් නිරූපණයට පරිවර්තනය කරයි. දැන් අන්තිම බිට් එක මත පදනම්ව, ඔබ පළමු බිට් එක සහ අන්තිම බිට් එක හෝ අන්තිම බිට් එක පෙරළන්න. මූලික වශයෙන් ඔබ නිතරම ප්‍රතික්ෂේප කරන්නේ සංඛ්‍යා හා චක්‍ර පවා / අමුතුයි. එබැවින් ඔබ අමුතු සිට අමුතු හා ඇමතුම් 2 කට පසුව පවා ආපසු පැමිණේ. අවසානයේ ඔබ නැවත 2-අනුපූරකය බවට පරිවර්තනය කරයි. මේ සඳහා කේතය පහතින් කොතැනක හෝ පළ කර ඇත.
ස්ටෙෆාන් හවුස්ටයින්

9

: ඩී

boolean inner = true;

int f(int input) {
   if(inner) {
      inner = false;
      return input;
   } else {
      inner = true;
      return -input;
   }
}

5
සම්මුඛ පරීක්ෂණයෙන් ඔබව පන්නා නොදැමුවේ නම් ගෝලීය විචල්‍යයන් නරක වන්නේ මන්ද යන්න පිළිබඳවද ඔබට සාකච්ඡාවක් ලබා දිය හැකිය!
palswim


7

ගණිත ian යෙකු ලෙස මෙම සිත්ගන්නා ගැටලුව පිළිබඳ මගේ මතය බෙදා ගැනීමට මම කැමතියි. මම හිතන්නේ මට වඩාත්ම කාර්යක්ෂම විසඳුමක් තිබේ.

මට නිවැරදිව මතක නම්, ඔබ අත්සන් කළ බිටු 32 ක පූර්ණ සංඛ්‍යාවක් පළමු බිට් එක පෙරළීමෙන් ප්‍රතික්ෂේප කරයි. උදාහරණයක් ලෙස, n = 1001 1101 1110 1011 1110 0000 1110 1010 නම්, -n = 0001 1101 1110 1011 1110 0000 1110 1010.

එසේ නම්, අත්සන් කරන ලද 32-බිටු නිඛිලයක් ගෙන, අත්සන් කළ තවත් 32-බිටු සංඛ්‍යාවක් පූර්ණ ගුණාංගයක් ආපසු ලබා දෙන එෆ් ශ්‍රිතය පළමු බිට් එක පෙරළීමට සමාන වේ.

පූර්ණ සංඛ්‍යා වැනි අංක ගණිත සංකල්ප සඳහන් නොකර ප්‍රශ්නය නැවත ලිවීමට මට ඉඩ දෙන්න.

එෆ් ශ්‍රිතයක් අර්ථ දක්වන්නේ කෙසේද? එය ශුන්‍ය අනුක්‍රමයක් සහ දිග 32 ක් ගෙන ශුන්‍ය අනුක්‍රමයක් සහ එකම දිගකින් යුත් අනුපිළිවෙලක් ලබා දෙයි.

නිරීක්‍ෂණය: ඔබට ඉහත ප්‍රශ්නයට බිට් 32 නඩුවකට පිළිතුරු දිය හැකි නම්, ඔබට බිට් 64 කේස්, බිට් 100 කේස් ආදිය සඳහා ද පිළිතුරු දිය හැකිය. ඔබ පළමු බිට් 32 ට එෆ් යොදන්න.

දැන් ඔබට බිට් 2 නඩුව සඳහා ප්‍රශ්නයට පිළිතුරු දිය හැකි නම්, වොයිලා!

ඔව්, පළමු බිටු 2 වෙනස් කිරීම ප්‍රමාණවත් බව පෙනේ.

මෙන්න ව්‍යාජ කේතය

1. take n, which is a signed 32-bit integer.
2. swap the first bit and the second bit.
3. flip the first bit.
4. return the result.

සටහන: පියවර 2 සහ 3 පියවර එකට (a, b) -> (-b, a) ලෙස ගිම්හානය කළ හැකිය. හුරුපුරුදු බව පෙනේ? එමඟින් ඔබට තලයෙහි අංශක 90 භ්‍රමණය සහ -1 හි වර්ග මූලයෙන් ගුණ කිරීම මතක් කළ යුතුය.

දිගු පෙරවදනකින් තොරව මම ව්‍යාජ කේතය පමණක් ඉදිරිපත් කළහොත්, එය තොප්පියෙන් එළියට ගිය හාවෙකු මෙන් පෙනේ, මට විසඳුම ලැබුණේ කෙසේද යන්න පැහැදිලි කිරීමට මට අවශ්‍ය විය.


6
ඔව් එය සිත්ගන්නා කරුණකි. ඔබ ඔබේ ගණිතය දන්නවා. නමුත් මෙය පරිගණක විද්‍යා ගැටළුවක්. එබැවින් ඔබ පරිගණක අධ්‍යයනය කළ යුතුය. සං Sign ා-විශාලත්ව නිරූපණයට ඉඩ දිය හැකි නමුත් එය වසර 60 කට පමණ පෙර විලාසිතාවෙන් බැහැර විය. 2 හි අනුපූරකය වඩාත් ජනප්රියයි.
වින්ඩෝස් ක්‍රමලේඛකයා

5
දෙවරක් යොදන විට ඔබේ ශ්‍රිතය බිටු දෙක සඳහා කරන්නේ කුමක්ද: (a, b) -> (-b, a) -> (-a, -b). නමුත්, අපි උත්සාහ කරන්නේ (-a, b) වෙත නොව (-a, -b) වෙතය.
බියුටි-ඔක්සා

@ බුටි-ඔක්සා, ඔබ හරි. බිටු දෙකේ ක්‍රියාකාරිත්වය මෙසේ විය යුතුය: 00 -> 01 -> 10 -> 11 -> 00. නමුත් වින්ඩෝස් ක්‍රමලේඛකයා පැවසූ පරිදි මගේ ඇල්ගොරිතම දැන් ජනප්‍රිය නොවන සං sign ා-විශාලත්ව නිරූපණය උපකල්පනය කරයි, එබැවින් මගේ ඇල්ගොරිතම එතරම් ප්‍රයෝජනයක් නැත .
යූ

ඉතින් ඔහුට එකවර වෙනුවට දෙවරක් පියවර ගත නොහැකිද?
නොස්රෙඩ්නා

4
බියුටි-ඔක්සා සම්පූර්ණයෙන්ම නිවැරදියි: ශ්‍රිතය ආයාචනා දෙකකට පසුව පළමු බිට් එක පෙරළන්නේ නැත, එය පළමු බිටු දෙක පෙරළයි. සියලු බිටු පෙරළීම 2 හි අනුපූරකයට වඩා සමීප වේ, නමුත් එය හරියටම නිවැරදි නොවේ.
redtuna
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.