වර්ග ඉලක්කම් සාරාංශ කිරීමේදී මට negative ණ සංඛ්‍යා හෝ ශුන්‍යය පැහැදිලිව හැසිරවිය යුතුද?


220

මම මෑතකදී මගේ පන්තියේදී පරීක්ෂණයක් කළා. එක් ගැටළුවක් වූයේ:

N අංකයක් ලබා දී, C / C ++ හි ශ්‍රිතයක් ලියන්න, එය වර්ග කොටසේ ඉලක්කම්වල එකතුව ලබා දෙයි . (පහත සඳහන් කරුණු වැදගත් වේ). මෙම පරාසය පිළිබඳ n ඇත [- (10 ^ 7), 10 ^ 7]. උදාහරණය: n = 123 නම්, ඔබේ ශ්‍රිතය 14 (1 ^ 2 + 2 ^ 2 + 3 ^ 2 = 14) ආපසු ලබා දිය යුතුය.

මා ලියූ කාර්යය මෙයයි:

int sum_of_digits_squared(int n) 
{
    int s = 0, c;

    while (n) {
        c = n % 10;
        s += (c * c);
        n /= 10;
    }

    return s;
}

මට හරියටම බැලුවා. දැන් පරීක්ෂණය නැවත පැමිණ ඇති අතර මට තේරුණේ නැති හේතුවක් නිසා ගුරුවරයා මට සියලු කරුණු ලබා නොදුන් බව මට පෙනී ගියේය. ඔහුට අනුව, මගේ කාර්යය සම්පූර්ණ වීමට නම්, මම පහත විස්තර එකතු කළ යුතුව තිබුණි:

int sum_of_digits_squared(int n) 
 {
    int s = 0, c;

    if (n == 0) {      //
        return 0;      //
    }                  //
                       // THIS APPARENTLY SHOULD'VE 
    if (n < 0) {       // BEEN IN THE FUNCTION FOR IT
        n = n * (-1);  // TO BE CORRECT
    }                  //

    while (n) {
        c = n % 10;
        s += (c * c);
        n /= 10;
    }

    return s;
}

මේ සඳහා වන තර්කය නම් n අංකය [- (10 ^ 7), 10 ^ 7] පරාසයේ පවතින බැවින් එය negative ණ සංඛ්‍යාවක් විය හැකිය. නමුත් මගේම ශ්‍රිතයේ අනුවාදය අසමත් වන්නේ කොතැනදැයි මට නොපෙනේ. මම නිවැරදිව තේරුම් නම්, අර්ථය while(n)වන්නේ while(n != 0), නො while (n > 0) එසේ එම ශ්රිතයේ මගේ අනුවාදය සංඛ්යාව, n කම්බියක් ඇතුළු කිරීමට අසමත් නැහැ. එය එකම ආකාරයකින් ක්‍රියාත්මක වනු ඇත.

ඉන්පසුව, මම මගේ පරිගණකයේ ක්‍රියාකාරීත්වයේ අනුවාද දෙකම නිවසේදී අත්හදා බැලූ අතර, මා උත්සාහ කළ සියලු උදාහරණ සඳහා හරියටම එකම පිළිතුරු ලැබුණි. එබැවින්, sum_of_digits_squared(-123)සමාන වේ sum_of_digits_squared(123)(එය නැවතත්, සමාන වේ 14) (මා විසින් එකතු කළ යුතු විස්තර නොමැතිව වුවද). ඇත්ත වශයෙන්ම, මම තිරයේ මුද්‍රණය කිරීමට උත්සාහ කළහොත් අංකයේ ඉලක්කම් (අවම වශයෙන් වැදගත්කම දක්වා), 123මට ලැබෙන අවස්ථාවෙහිදී 3 2 1සහ -123මට ලැබෙන නඩුවේදී -3 -2 -1(එය ඇත්තෙන්ම සිත්ගන්නා සුළුය). නමුත් මෙම ගැටලුවේදී අපි ඉලක්කම් වර්ග කරන බැවින් එය වැදගත් නොවේ.

ඉතින්, කවුද වැරදි?

සංස්කරණය කරන්න : මගේ නරක, මට නියම කිරීමට අමතක වූ අතර එය වැදගත් යැයි දැන සිටියේ නැත. අපගේ පන්තියේ සහ පරීක්ෂණ වලදී භාවිතා කරන C හි අනුවාදය C99 හෝ නව විය යුතුය . එබැවින් මගේ අනුවාදයට ඕනෑම ආකාරයකින් නිවැරදි පිළිතුර ලැබෙනු ඇතැයි මම සිතමි (අදහස් කියවීමෙන්).


120
n = n * (-1)ලිවීමට හාස්‍යජනක ක්‍රමයකි n = -n; ඒ ගැන සිතන්නේ පවා ශාස්ත්‍ර ic යෙකු පමණි. අතිරික්ත වරහන් එකතු කිරීමට ඉඩ දෙන්න.
user207421

32
දී ඇති ක්‍රියාත්මක කිරීමක් පිරිවිතරයට ගැලපේදැයි පරීක්ෂා කිරීම සඳහා ඒකක පරීක්ෂණ මාලාවක් ලියන්න. කේත කැබැල්ලක (ක්‍රියාකාරී) ගැටලුවක් තිබේ නම්, විශේෂිත ආදානයක් ලබා දී ඇති වැරදි ප්‍රති result ල පෙන්වන පරීක්ෂණයක් ලිවීමට හැකි විය යුතුය.
කාල්

94
“වර්ග කොටසේ ඉලක්කම්වල එකතුව” සම්පූර්ණයෙන්ම වෙනස් ආකාර තුනකින් අර්ථ දැක්විය හැකි බව මට සිත්ගන්නා කරුණකි. (අංකය 123 නම්, විය හැකි අර්ථ නිරූපණයන් 18, 14 සහ 36 ලබා දෙයි.)
ඇන්ඩ්‍රියාස් රෙජ්බ්‍රෑන්ඩ්

23
kilkkachu: "වර්ග කොටසේ ඉලක්කම්වල එකතුව". හොඳයි, "වර්ග කොටසේ අංකය" පැහැදිලිවම 123 ^ 2 = 15129, එබැවින් "වර්ග කොටසේ ඉලක්කම්වල එකතුව" යනු "15129 හි ඉලක්කම්වල එකතුව" වන අතර එය පැහැදිලිවම 1 + 5 + 1 + 2 + 9 වේ. = 18.
ඇන්ඩ්‍රියාස් රෙජ්බ්‍රෑන්ඩ්

15
n = n * (-1)? වට් ??? ඔබේ පැතිකඩ සොයන දේ මෙයයි: `n = -n '. සී භාෂාවට ඒකීය us ණ ක්‍රියාකරුවෙකු ඇත.
Kaz

Answers:


245

අදහස් දැක්වීම්වල සංක්ෂිප්තව පැවති සාකච්ඡාවක් සාරාංශ කිරීම:

  • කල්තියා පරීක්ෂා කිරීමට හොඳ හේතුවක් නැත n == 0. මෙම while(n)පරීක්ෂණය ඉතා හොඳින් එම නඩුව හැසිරවිය ඇත.
  • %Negative ණාත්මක ක්‍රියාකාරිත්වයන්හි ප්‍රති result ලය වෙනස් ලෙස අර්ථ දක්වා ඇති විට, ඔබේ ගුරුවරයා පෙර කාලයට තවමත් පුරුදු වී ඇති බව පෙනේ. (අ PDP-11, ඩෙනිස් රිචී මුලින් සංවර්ධනය මෙහි C ඇතුලු, විශේෂයෙන්, මුල් යුනික්ස්) සමහර පැරණි පද්ධති මත, ප්රතිඵලයක් a % bවිය විටම පරාසයක [0 .. b-1], -123% 10 පරීක්ෂණ, එවැනි ක්රමයක් මත 7. බව අර්ථය කල්තියාම අවශ්‍ය n < 0වනු ඇත.

නමුත් දෙවන උණ්ඩය අදාළ වන්නේ පෙර කාලයට පමණි. සී සහ සී ++ ප්‍රමිති දෙකෙහිම වර්තමාන අනුවාද වලදී, පූර්ණ සංඛ්‍යා බෙදීම 0 දෙසට කප්පාදු කිරීම සඳහා අර්ථ දක්වා ඇත, එබැවින් n % 10the ණාත්මක වන nවිට පවා (සමහර විට negative ණාත්මක) අවසාන ඉලක්කම් ඔබට ලබා දෙන බවට සහතික වී nඇත.

ඉතින් "එහි තේරුම while(n)කුමක්ද?" යන ප්‍රශ්නයට පිළිතුර. ය "ලෙස හරියටම එකම while(n != 0)" පිළිතුර, සහ "සෘණ සඳහා මෙම කේතය වැඩ නිසි කරන්ෙනහිද මෙන්ම ධනාත්මක n?" යනු "ඔව්, ඕනෑම නවීන ප්‍රමිතීන්ට අනුකූල සම්පාදකයෙකු යටතේ ය." "එහෙනම් උපදේශකයා එය සලකුණු කළේ ඇයි?" යන ප්‍රශ්නයට පිළිතුර. 1999 දී සී සහ 2010 දී සී ++ ට සිදු වූ සැලකිය යුතු භාෂා නැවත අර්ථ දැක්වීමක් ඔවුන් නොදැන සිටීම විය හැකිය.


39
"N == 0 සඳහා කල්තියා පරීක්ෂා කිරීමට හොඳ හේතුවක් නොමැත" - තාක්ෂණික වශයෙන් එය නිවැරදි ය. නමුත් අපි ඉගැන්වීමේ පසුබිමක මහාචාර්යවරයකු ගැන කතා කරන විට, ඔවුන් අපට වඩා බොහෝ සෙයින් සංක්ෂිප්තභාවය පිළිබඳ පැහැදිළි බව අගය කරනු ඇත. n == 0අවම වශයෙන් අමතර පරීක්ෂණය එකතු කිරීමෙන් ඕනෑම පා er කයෙකුට එම අවස්ථාවේදී සිදුවන්නේ කුමක්ද යන්න වහාම සහ සම්පූර්ණයෙන්ම පැහැදිලි වේ. එය නොමැතිව, ලූපය සැබවින්ම මඟ හැරී ඇති බවට පා er කයාට සෑහීමකට පත්විය යුතු අතර, sආපසු ලබා දීමේ පෙරනිමි අගය නිවැරදි එකකි.
ilkkachu

22
එසේම, මහාචාර්යවරයා දැන ගැනීමට අවශ්‍ය වන්නේ ශිෂ්‍යයා දැනුවත්ව සිටින අතර ශ්‍රිතය ශුන්‍ය ආදානයකින් ක්‍රියා කරන්නේ ඇයි සහ කෙසේද යන්න ගැන සිතා ඇති බවය (එනම් එය අහම්බෙන් නිවැරදි අගය ලබා නොදෙන බව ). එම අවස්ථාවේදී කුමක් සිදුවේදැයි නොදැන, පුඩුවට ශුන්‍ය වාර ගණනක් ධාවනය කළ හැකි බව ඔවුන් නොදැන සිටි සිසුන් හමුවී ඇත. ඔබ ඉගැන්වීමේ පසුබිමක් සමඟ කටයුතු කරන විට, ඕනෑම උපකල්පන සහ මුල්ලක අවස්ථා පිළිබඳව අමතර පැහැදිලි වීම වඩාත් සුදුසුය. ..
ilkkachu

36
kilkkachu එය එසේ නම්, ගුරුවරයා එවැනි පරීක්‍ෂණයක් නිවැරදිව වැඩ කිරීමට අවශ්‍ය කාර්යයක් භාර දිය යුතුය.
klutt

38
kilkkachu හොඳයි, මම ඔබේ කාරණය පොදුවේ සලකා බලමි. මක්නිසාද යත්, සංක්ෂිප්තභාවය පිළිබඳ පැහැදිලිකම මම තරයේ අගය කරන හෙයිනි - සහ සෑම විටම බොහෝ විට, අවශ්‍යයෙන්ම අධ්‍යාපනික පසුබිමක නොවේ. නමුත් ඒ සමඟ, සමහර විට සංක්ෂිප්ත භාවය පැහැදිලිය, සහ කේතය අවුල් නොකර (සහ ආවරණ විශ්ලේෂණය) දාර නඩුව සඳහා විශේෂ අවස්ථා සමඟ සාමාන්‍ය කේතය සහ දාර නඩුව (ය) යන දෙකම හැසිරවීමට ඔබට ප්‍රධාන කේතය සකස් කළ හැකි නම්. , ඒක ලස්සන දෙයක්! මම හිතන්නේ එය ආරම්භක මට්ටමේ දී පවා අගය කළ යුතු දෙයක්.
ස්ටීව් සමුළුව

49
@ilkkachu එම තර්කය අනුව ඔබ නියත වශයෙන්ම n = 1 සඳහා පරීක්ෂණ එකතු කළ යුතුය. විශේෂ දෙයක් නැහැ n=0. අනවශ්‍ය ශාඛා හා සංකූලතා හඳුන්වා දීමෙන් කේතය පහසු නොවේ, එය දැන් සිට වඩාත් අපහසු කරයි සාමාන්‍ය ඇල්ගොරිතම නිවැරදි බව පෙන්වීමට පමණක් නොව, සියලු විශේෂ අවස්ථා ගැන වෙන වෙනම සිතා බැලිය යුතුය.
Voo

107

ඔබේ කේතය ඉතා හොඳයි

ඔබ නියත වශයෙන්ම නිවැරදි වන අතර ඔබේ ගුරුවරයා වැරදිය. එම අතිරේක සංකීර්ණතාව එක් කිරීමට කිසිසේත්ම හේතුවක් නැත, මන්ද එය ප්‍රති result ලයට කිසිසේත් බලපාන්නේ නැත. එය දෝෂයක් පවා හඳුන්වා දෙයි. (පහත බලන්න)

පළමුව, nශුන්‍ය නම් වෙනම චෙක්පත පැහැදිලිවම සම්පූර්ණයෙන්ම අනවශ්‍ය වන අතර මෙය අවබෝධ කර ගැනීම ඉතා පහසුය. ඇත්තම කිව්වොත්, ඇත්ත වශයෙන්ම මම මේ ගැන ඔබේ ගුරුවරුන්ගේ විරෝධය ඇත්දැයි ප්‍රශ්න කරමි. නමුත් මම හිතන්නේ සෑම කෙනෙකුටම වරින් වර මොළයේ දුරක් තිබිය හැකිය. කෙසේ වෙතත්, while(n)එය වෙනස් කළ යුතු යැයි මම සිතන්නේ while(n != 0)එය අතිරේක රේඛාවක් පවා වැය නොකර ටිකක් පැහැදිලි බවක් එක් කරන බැවිනි. එය සුළු දෙයක් වුවද.

දෙවැන්න තව ටිකක් තේරුම් ගත හැකි නමුත් ඔහු තවමත් වැරදිය.

මෙය කුමක් ද C11 සම්මත 6.5.5.p6 පවසයි:

A / b යන අගය නිරූපණය කළ හැකි නම්, (a / b) * b + a% b ප්‍රකාශනය a ට සමාන වේ; එසේ නොමැතිනම්, a / b සහ% b යන දෙවර්ගයේම හැසිරීම නිර්වචනය කර නැත.

පාදසටහන මෙය පවසයි:

මෙය බොහෝ විට "ශුන්‍ය දෙසට කප්පාදු කිරීම" ලෙස හැඳින්වේ.

අදහස් ශුන්ය කරා කවලම් පරම අගය බව a/bපරම අගය සමාන වේ (-a)/bසියලු aහාb , අනෙක් අතට මාධ්යයන්ගේ ඔබේ කේතය සම්පූර්ණයෙන්ම ඒක යහපත් දෙයක්.

මොඩියුලෝ පහසු ගණිතය, නමුත් ප්‍රතිවිරුද්ධ විය හැකිය

කෙසේ වෙතත්, ඔබේ ගුරුවරයාට ඔබ පරෙස්සම් විය යුතු කරුණක් ඇත, මන්ද ඔබ ප්‍රති result ලය වර්ග කර තිබීම ඇත්ත වශයෙන්ම මෙහි තීරණාත්මක ය. a%bඉහත අර්ථ දැක්වීම අනුව ගණනය කිරීම පහසු ගණිතයකි, නමුත් එය ඔබගේ ප්‍රතිභාවට පටහැනි විය හැකිය. ගුණ කිරීම හා බෙදීම සඳහා, ඔපෙරන්ඩ් වලට සමාන ලකුණක් තිබේ නම් ප්‍රති result ලය ධනාත්මක වේ. නමුත් මොඩියුලෝ සම්බන්ධයෙන් ගත් කල, ප්‍රති result ලය පළමු ඔපෙරන්ඩ් එකට සමාන ලකුණක් ඇත . දෙවන ක්‍රියාකාරිත්වය ලකුණට කිසිසේත් බලපාන්නේ නැත. උදාහරණයක් ලෙස, 7%3==1නමුත් (-7)%(-3)==(-1).

මෙන්න එය නිරූපණය කරන කුඩා කොටසක්:

$ cat > main.c 
#include <stdio.h>

void f(int a, int b) 
{
    printf("a: %2d b: %2d a/b: %2d a\%b: %2d (a%b)^2: %2d (a/b)*b+a%b==a: %5s\n",
           a, b ,a/b, a%b, (a%b)*(a%b), (a/b)*b+a%b == a ? "true" : "false");
}

int main(void)
{
    int a=7, b=3;
    f(a,b);
    f(-a,b);
    f(a,-b);
    f(-a,-b);
}

$ gcc main.c -Wall -Wextra -pedantic -std=c99

$ ./a.out
a:  7 b:  3 a/b:  2 a%b:  1 (a%b)^2:  1 (a/b)*b+a%b==a:  true
a: -7 b:  3 a/b: -2 a%b: -1 (a%b)^2:  1 (a/b)*b+a%b==a:  true
a:  7 b: -3 a/b: -2 a%b:  1 (a%b)^2:  1 (a/b)*b+a%b==a:  true
a: -7 b: -3 a/b:  2 a%b: -1 (a%b)^2:  1 (a/b)*b+a%b==a:  true

ඉතින්, උත්ප‍්‍රාසාත්මක ලෙස, ඔබේ ගුරුවරයා ඔහුගේ කාරණය වැරදි බව ඔප්පු කළේය.

ඔබේ ගුරුවරයාගේ කේතය දෝෂ සහිතය

ඔව්, එය ඇත්තෙන්ම ය. ආදානය INT_MINසහ ගෘහ නිර්මාණ ශිල්පය දෙකේ අනුපූරකයක් නම් සහ සං bit ා බිට් 1 වන බිට් රටාව සහ සියලු අගය බිටු 0 යනු උගුල් අගයක් නොවේ (උගුල් අගයන් නොමැතිව දෙදෙනෙකුගේ අනුපූරකය භාවිතා කිරීම ඉතා සුලභ ය) එවිට ඔබේ ගුරුවරයාගේ කේතය නිර්වචනය නොකළ හැසිරීමක් ලබා දෙනු ඇත පේළියේ n = n * (-1). ඔබේ කේතය - කවදා හෝ තරමක් නම් - ඔහුට වඩා හොඳයි . කේතය අනවශ්‍ය ලෙස සංකීර්ණ කර නිරපේක්ෂ ශුන්‍ය අගයක් ලබා ගැනීමෙන් කුඩා දෝෂයක් හඳුන්වා දීම ගැන සලකා බැලීමේදී, ඔබේ කේතය වඩා හොඳ යැයි මම කියමි.

වෙනත් වචන වලින් කිවහොත්, INT_MIN = -32768 (එහි ප්‍රති function ලයක් ලෙස ලැබෙන ශ්‍රිතයට <-32768 හෝ> 32767 වන ආදානයක් ලැබිය නොහැකි වුවද), -32768 හි වලංගු ආදානය නිර්වචනය නොකළ හැසිරීමට හේතු වේ, මන්ද එහි ප්‍රති result ලය - (- 32768i16) බිටු 16 ක පූර්ණ සංඛ්‍යාවක් ලෙස ප්‍රකාශ කළ නොහැක. .

නමුත් ඔබේ ගුරුවරයා පැහැදිලිවම කියා සිටියේ nඑය [-10 ^ 7 පරාසයේ විය හැකි බවයි; 10 ^ 7]. බිටු 16 ක පූර්ණ සංඛ්‍යාවක් ඉතා කුඩා ය; ඔබට [අවම වශයෙන්] බිටු 32 ක පූර්ණ සංඛ්‍යාවක් භාවිතා කිරීමට සිදුවේ. භාවිතා intකිරීම ඔහුගේ කේතය ආරක්ෂිත බව පෙනේ, intඑය අනිවාර්යයෙන්ම බිටු 32 ක පූර්ණ සංඛ්‍යාවක් නොවේ. ඔබ බිට් 16 ගෘහ නිර්මාණ ශිල්පයක් සඳහා සම්පාදනය කරන්නේ නම්, ඔබේ කේත ස්නිපෙට් දෙකම දෝෂ සහිතය. නමුත් ඔබේ කේතය තවමත් වඩා හොඳය, මන්ද මෙම තත්වය INT_MINඔහුගේ අනුවාදය සමඟ ඉහත සඳහන් කළ දෝෂය නැවත හඳුන්වා දෙයි . මෙය වළක්වා ගැනීම සඳහා, ඔබට longඒ වෙනුවට ලිවිය හැකිය int, එය ගෘහ නිර්මාණ ශිල්පය මත බිටු 32 ක පූර්ණ සංඛ්‍යාවක් වේ. long[-2147483647 පරාසය තුළ ඕනෑම අගයක් රඳවා ගැනීමට A ට සහතික වේ; 2147483647]. C11 සම්මත 5.2.4.2.1 LONG_MIN බොහෝ විට වේ-2147483648නමුත් අවසර දී ඇති උපරිම අගය (ඔව්, උපරිම, එය negative ණ සංඛ්‍යාවක්) LONG_MINවේ 2147483647.

මම ඔබේ කේතයේ කුමන වෙනස්කම් කරන්නද?

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

  • විචල්යයන්ගේ නම් ටිකක් හොඳ විය හැකිය, නමුත් එය තේරුම් ගැනීමට පහසු කෙටි කාර්යයකි, එබැවින් එය විශාල ගනුදෙනුවක් නොවේ.
  • ඔබ තත්ත්වය වෙනස් විය හැකි nකිරීමට n!=0. අර්ථාන්විතව, එය 100% සමාන වේ, නමුත් එය ටිකක් පැහැදිලි කරයි.
  • ප්‍රකාශය එහි භාවිතා කර ඇති බැවින් c(මම නැවත නම් කරන ලද digit) කාල ලූපය තුළට ගෙන යන්න.
  • longසම්පූර්ණ ආදාන කට්ටලය හැසිරවිය හැකි බව සහතික කිරීම සඳහා තර්ක වර්ගය වෙනස් කරන්න .
int sum_of_digits_squared(long n) 
{
    long sum = 0;

    while (n != 0) {
        int digit = n % 10;
        sum += (digit * digit);
        n /= 10;
    }

    return sum;
}

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

  • විචල්‍යය සම්පූර්ණයෙන්ම වෙනස් sum += (digit * digit)කර sum += ((n%10)*(n%10))මඟ හරින්න digit.
  • .ණ නම් ලකුණ වෙනස් කරන්න digit. නමුත් විචල්ය නාමයක් අර්ථවත් කිරීම සඳහා කේතය වඩාත් සංකීර්ණ කිරීමට එරෙහිව මම තරයේ අවවාද කරමි. එය ඉතා ශක්තිමත් කේත සුවඳකි.
  • අවසාන ඉලක්කම් උපුටා ගන්නා වෙනම ශ්‍රිතයක් සාදන්න. int last_digit(long n) { int digit=n%10; if (digit>=0) return digit; else return -digit; }ඔබට එම ශ්‍රිතය වෙනත් තැනක භාවිතා කිරීමට අවශ්‍ය නම් මෙය ප්‍රයෝජනවත් වේ.
  • cඔබ මුලින් කරන ආකාරයටම එය නම් කරන්න. එම විචල්‍ය නාමය කිසිදු ප්‍රයෝජනවත් තොරතුරක් ලබා නොදෙන අතර අනෙක් අතට එය නොමඟ යවන සුළු නොවේ.

නමුත් අවංක වීමට නම්, මේ අවස්ථාවේදී ඔබ වඩාත් වැදගත් කාර්යයකට යා යුතුය. :)


19
ආදානය INT_MINසහ ගෘහ නිර්මාණ ශිල්පය දෙදෙනෙකුගේ අනුපූරකය භාවිතා කරන්නේ නම් (එය ඉතා සුලභ ය) එවිට ඔබේ ගුරුවරුන්ගේ කේතය නිර්වචනය නොකළ හැසිරීමක් ලබා දෙනු ඇත. ඕච්. එය සලකුණක් තබනු ඇත. ;-)
ඇන්ඩ rew හෙන්ල්

5
ඊට අමතරව (a/b)*b + a%b ≡ a, OP හි කේතය ද /ශුන්‍ය දෙසට වටය යන කාරණය සමඟ බැඳී ඇති බව සඳහන් කළ යුතුය (-c)*(-c) ≡ c*c. එය කළ හැකි එය ප්රමාණවත් තරම්-පැහැදිලි නොවන දෙයක් නිසා සියල්ල සම්මත සමාගමට නොතකා අමතර චෙක්පත් යුක්ති සහගත වන බව තර්ක කළ යුතුය. (ඇත්ත වශයෙන්ම එය අදාළ සම්මත කොටස් සම්බන්ධ කරමින් අදහස් දැක්වීමක් තිබිය යුතු යැයි තර්ක කළ හැකිය, නමුත් විලාසිතාවේ මාර්ගෝපදේශ වෙනස් වේ.)
වම්පස

7
Ar මාටින් රොසෙනෝ ඔබ "බලවත්" යැයි කියනු ඇත. මෙය සැබවින්ම සිදුවෙමින් පවතින බව හෝ එය සම්මතයෙන් හෝ වෙනත් දෙයකින් අවසර දී ඇති බව ඔබට විශ්වාසද?
klutt

6
Ar මාටින් රොසෙනෝ: හරි, නමුත් එම ස්විච භාවිතා කිරීමෙන් එය තවදුරටත් සී නොවේ. මා දන්නා ඕනෑම අයිඑස්ඒ මත පූර්ණ සංඛ්‍යා බෙදීමේ ස්විචයන් ජීසීසී / ක්ලැන්ග් සතුව නොමැත. සං bit ා බිට් නොසලකා හැරීම නිරන්තර බෙදුම්කරුවන් සඳහා සාමාන්‍ය ගුණ කිරීමේ ප්‍රතිලෝම භාවිතා කරමින් වේගවත් කිරීමක් ලබා දිය හැකිය. (නමුත්, දෘඩාංග අංශය උපදෙස් ඇති බව මම හුරු පුරුදු වෙනවා සියලු ISAs එය C99 ප්රමිතියේ දී ආකාරයෙන්, ශුන්ය කරා truncating, C එසේ ක්රියාත්මක %සහ /ක්රියාකරුවන් හුදෙක් කිරීමට සම්පාදනය කළ හැකි idiv, x86 මත, හෝ sdivඊට වඩා බෙහෙවින් සම්බන්ධයක් නැති බව, නිපදවා හෝ ඕනෑම දෙයක්. ඒ වුණත් සම්පාදක-කාල නියත බෙදුම්කරුවන් සඳහා වේගවත් කේත-ජෙන)
පීටර් කෝඩ්ස්

5
OnyTonyK AFIK, එය සාමාන්‍යයෙන් විසඳෙන්නේ එලෙසයි, නමුත් ප්‍රමිතියට අනුව එය UB වේ.
klutt

20

මම ඔබේ අනුවාදයට හෝ ඔබේ ගුරුවරයාට සම්පූර්ණයෙන්ම කැමති නැත. ඔබේ ගුරුවරයාගේ අනුවාදය මඟින් ඔබ නිවැරදිව පෙන්වා දෙන අමතර පරීක්ෂණ අනවශ්‍යය. C හි මෝඩ් ක්‍රියාකරු නිසි ගණිතමය මෝඩයක් නොවේ: mod ණ සංඛ්‍යා මොඩ් 10 negative ණාත්මක ප්‍රති result ලයක් ලබා දෙනු ඇත (නිසි ගණිතමය මාපාංකය සැමවිටම negative ණාත්මක නොවේ). නමුත් ඔබ එය කෙසේ හෝ වර්ග කරන බැවින් වෙනසක් නැත.

නමුත් මෙය පැහැදිලිව පෙනෙන දෙයක් නොවේ, එබැවින් මම ඔබේ කේතයට එකතු කරන්නේ ඔබේ ගුරුවරයාගේ චෙක්පත් නොව එය ක්‍රියාත්මක වන්නේ ඇයිද යන්න පැහැදිලි කරන විශාල අදහසක්. උදා:

/ * සටහන: මෙය negative ණ අගයන් සඳහා ක්‍රියා කරයි, මන්ද මාපාංකය වර්ග වේ * /


9
C හි %හොඳම දේ ඉතිරි කොටස ලෙස හැඳින්වේ , මන්ද එය අත්සන් කළ වර්ග සඳහා පවා වේ.
පීටර් කෝර්ඩ්ස්

15
වර්ග කිරීම වැදගත්, නමුත් මම හිතන්නේ එය පැහැදිලිව පෙනෙන කොටසයි. පෙන්වා දිය යුතු දෙය නම් (උදා) -7 % 10 ඇත්ත වශයෙන්ම-7 3 ට වඩා වැඩි වනු ඇත .
ජාකොබ් රයිහෙල්

5
“නිසි ගණිතමය මාපාංකය” යන්නෙන් කිසිවක් අදහස් නොවේ. නිවැරදි පදය “යුක්ලීඩියානු මොඩියුලෝ” (උපසර්ගය මතක තබා ගන්න!) සහ ඇත්ත වශයෙන්ම සී හි %ක්‍රියාකරු එය නොවේ.
ජෑන් හුඩෙක්

මම මෙම පිළිතුරට කැමතියි මොඩියුලය අර්ථ නිරූපණය කිරීම සඳහා විවිධ ක්‍රම පිළිබඳ ප්‍රශ්නය විසඳන නිසා. එවැනි දෙයක් අහම්බෙන් / අර්ථ නිරූපණයට කිසි විටෙකත් තබන්න එපා. මෙය කේත ගොල්ෆ් නොවේ.
හාපර් - මොනිකා නැවත

1
“නිසි ගණිතමය මාපාංකය සැමවිටම negative ණාත්මක නොවේ - ඇත්ත වශයෙන්ම නොවේ. මොඩියුලෝ මෙහෙයුමක ප්‍රති result ලය සමානතා පන්තියකි , නමුත් ප්‍රති class ලය එම පන්තියට අයත් කුඩාම negative ණ නොවන අංකය ලෙස සැලකීම සාමාන්‍ය දෙයකි.
klutt

10

සටහන: මම මෙම පිළිතුර ලියන විට, ඔබ සී භාවිතා කරන බව ඔබ පැහැදිලි කර ඇත. මගේ පිළිතුරෙන් වැඩි ප්‍රමාණයක් C ++ ගැන ය. කෙසේ වෙතත්, ඔබේ මාතෘකාවට තවමත් C ++ ඇති අතර ප්‍රශ්නය තවමත් C ++ ලෙස ටැග් කර ඇති හෙයින්, මෙය තවමත් අනෙක් පුද්ගලයින්ට ප්‍රයෝජනවත් වේ නම් කෙසේ හෝ පිළිතුරු දීමට මම තෝරාගෙන ඇත, විශේෂයෙන් මම මේ දක්වා දුටු බොහෝ පිළිතුරු බොහෝ දුරට සෑහීමකට පත්විය නොහැකි බැවින්.

නූතන සී ++ හි (සටහන: සී මේ මත සිටින්නේ කොතැනදැයි මම නොදනිමි), ඔබේ මහාචාර්යවරයා ගණන් දෙකෙහිම වැරදියි.

පළමුව මෙම කොටස මෙහි ඇත:

if (n == 0) {
        return 0;
}

C ++ හි, මෙය මූලික වශයෙන් සමාන වන්නේ :

if (!n) {
        return 0;
}

ඒ කියන්නේ ඔබේ කාලය මේ වගේ දෙයකට සමානයි:

while(n != 0) {
    // some implementation
}

එයින් අදහස් වන්නේ ඔබ කෙසේ හෝ ක්‍රියාත්මක නොවන්නේ නම් ඔබ හුදෙක් ඔබගේ පිටවීම නිසා, මෙය මෙහි තැබීමට ඇත්ත වශයෙන්ම හේතුවක් නොමැති නිසා, ඔබ ලූපයෙන් පසුව කරන දේ සහ කෙසේ හෝ සමාන නම්. කිසියම් හේතුවක් නිසා මේවා වෙනස් යැයි මා පැවසිය යුතු වුවත්, ඔබට මෙය අවශ්‍ය නම්.

ඉතින් ඇත්ත වශයෙන්ම, මෙය වැරදියට හැරෙන්නට ප්‍රකාශය විශේෂයෙන් ප්‍රයෝජනවත් නොවේ නම්.

දෙවන කොටස වන්නේ දේවල් කෙස් වැටෙන තැනයි:

if (n < 0) {
    n = n * (-1);
}  

ගැටලුවේ හදවත වන්නේ negative ණ සංඛ්‍යා ප්‍රතිදානයන්හි මාපාංකයේ ප්‍රතිදානය කුමක්ද යන්නයි.

නූතන C ++ හි මෙය බොහෝ දුරට මනාව අර්ථ දක්වා ඇති බව පෙනේ :

ද්විමය / ක්‍රියාකරු විසින් අස්වැන්න ලබා දෙන අතර ද්විමය% ක්‍රියාකරු පළමු ප්‍රකාශනයේ බෙදීමෙන් ඉතිරි කොටස දෙවැන්න මඟින් ලබා දෙයි. / හෝ% හි දෙවන ක්‍රියාකාරිත්වය ශුන්‍ය නම් හැසිරීම නිර්වචනය නොකෙරේ. සමෝධානික ක්‍රියාකාරිත්වයන් සඳහා / ක්‍රියාකරු විසින් වීජීය උපුටා දැක්වීම ඕනෑම භාගික කොටසක් ඉවතලනු ලැබේ; a / b යන අගය ප්‍රති result ල වර්ගයෙහි නිරූපණය කළ හැකි නම්, (a / b) * b + a% b යනු a ට සමාන වේ.

සහ පසුව:

ඔපෙරන්ඩ් දෙකම non ණාත්මක නොවේ නම්, ඉතිරිය අක්‍රීය වේ; එසේ නොවේ නම්, ඉතිරි කොටසෙහි ලකුණ ක්‍රියාත්මක කිරීම-අර්ථ දක්වා ඇත.

උපුටා ගත් පිළිතුරේ පෝස්ටරය නිවැරදිව පෙන්වා දෙන පරිදි, මෙම සමීකරණයේ වැදගත් කොටස මෙතැනින්:

(a / b) * b + a% b

ඔබේ නඩුව පිළිබඳ උදාහරණයක් ගනිමින්, ඔබට මේ වගේ දෙයක් ලැබෙනු ඇත:

-13/ 10 = -1 (integer truncation)
-1 * 10 = -10
-13 - (-10) = -13 + 10 = -3 

එකම අල්ලා ගැනීම එම අන්තිම පේළියයි:

ඔපෙරන්ඩ් දෙකම non ණාත්මක නොවේ නම්, ඉතිරිය අක්‍රීය වේ; එසේ නොවේ නම්, ඉතිරි කොටසෙහි ලකුණ ක්‍රියාත්මක කිරීම-අර්ථ දක්වා ඇත.

ඒ කියන්නේ මේ වගේ අවස්ථාවක ලකුණ විතරයි ක්‍රියාත්මක කිරීම-අර්ථ දක්වා ඇති බව පෙනේ. එය ඔබගේ නඩුවේ ගැටළුවක් නොවිය යුතුය, මන්ද ඔබ කෙසේ හෝ මෙම අගය වර්ග කරන බැවිනි.

මෙය C ++ හෝ C99 හි පෙර සංස්කරණ වලට අනිවාර්යයෙන්ම අදාළ නොවන බව මතක තබා ගන්න. ඔබේ මහාචාර්යවරයා භාවිතා කරන්නේ එය නම්, ඒ නිසා විය හැකිය.


සංස්කරණය කරන්න: නෑ, මම වැරදියි. C99 හෝ ඊට පසුවද මෙය සිදු වන බව පෙනේ :

C99 ට අවශ්‍ය වන්නේ / b නිරූපණය කළ හැකි විට:

(a / b) * b + a% b a ට සමාන විය යුතුය

හා තවත් තැනක් :

පූර්ණ සංඛ්‍යා බෙදී ඇති විට සහ බෙදීම නිරවද්‍ය නොවන විට, ඔපෙරන්ඩ් දෙකම ධනාත්මක නම් / ක්‍රියාකරුගේ ප්‍රති result ලය වීජීය සංඛ්‍යාංකයට වඩා විශාලතම පූර්ණ සංඛ්‍යාවක් වන අතර% ක්‍රියාකරුගේ ප්‍රති result ලය ධනාත්මක වේ. එක්කෝ ඔපෙරන්ඩ් negative ණ නම්, / ක්‍රියාකරුගේ ප්‍රති result ලය වීජ ගණිතයට වඩා අඩු සංඛ්‍යාවක් හෝ වීජීය උපුටා දැක්වීමට වඩා කුඩාම පූර්ණ සංඛ්‍යා ක්‍රියාත්මක කිරීම-නිර්වචනය කර ඇති අතර එය% ක්‍රියාකරුගේ ප්‍රති result ලයේ සං sign ාව වේ. A / b යන අගය නිරූපණය කළ හැකි නම්, (a / b) * b + a% b ප්‍රකාශනය a ට සමාන වේ.

ANSI C හෝ ISO C මගින් -5% 10 විය යුත්තේ කුමක් ද?

ඉතින්, ඔව්. C99 හි පවා මෙය ඔබට බලපාන බවක් නොපෙනේ. සමීකරණය සමාන වේ.


1
ඔබ උපුටා ගත් කොටස් මෙම පිළිතුරට සහය නොදක්වයි. “ඉතිරියෙහි සං sign ාව ක්‍රියාත්මක කිරීම අර්ථ දක්වා ඇත” යන්නෙන් අදහස් කරන්නේ (-1)%10නිෂ්පාදනය කළ හැකි -1හෝ 1; එයින් අදහස් කරන්නේ එය නිපදවිය හැකි -1හෝ 9, පසුව (-1)/10නිපදවන -1අතර OP කේතය කිසි විටෙකත් අවසන් නොවන බවයි.
stewbasic

ඔබට මේ සඳහා මූලාශ්‍රයක් පෙන්වා දිය හැකිද? (-1) / 10 යනු -1 යැයි විශ්වාස කිරීමට මට ඉතා අසීරු කාලයක් තිබේ. එය 0 විය යුතුය. (-1)% 10 = 9 පාලක සමීකරණය උල්ලං to නය කරන බවක් පෙනේ.
චිප්ස්ටර්

1
Ip චිප්ස්ටර්, ආරම්භ කරන්න (a/b)*b + a%b == a, පසුව දෙන්න a=-1; b=10, දෙන්න (-1/10)*10 + (-1)%10 == -1. දැන්, -1/10ඇත්ත වශයෙන්ම (-inf දෙසට) වටයනු ලැබුවහොත්, අප සතුව (-1/10)*10 == -10ඇති (-1)%10 == 9අතර, පළමු සමීකරණය ගැලපීම සඳහා ඔබට තිබිය යුතුය . ඒ සමාන වෙනත් පිළිතුරු රාජ්ය, මේ එය වත්මන් සම්මත (ව) තුළ ක්රියා කරන ආකාරය නොවේ, නමුත්, එය වැඩ කටයුතු කිරීම සඳහා භාවිතා කරන ආකාරය. එය වැනි ඉතිරි ලකුණ, නමුත් අංශය වට ආකාරය සහ ඊට පස්සේ ඉතිරි ගැන ඇත්තටම නෑ ඇති රසායනික සමීකරණයට තෘප්තිමත් කිරීමට විය.
ilkkachu

1
Ip චිප්ස්ටර් ප්‍රභවය වන්නේ ඔබ උපුටා ගත් ස්නිපෙට් ය. මතක තබා ගන්න (-1)*10+9=-1, එබැවින් තේරීම (-1)/10=-1සහ (-1)%10=9පාලන සමීකරණය උල්ලං does නය නොකරයි. අනෙක් අතට, තේරීම (-1)%10=1කෙසේ වෙතත් පාලක සමීකරණය තෘප්තිමත් කළ නොහැක (-1)/10; qඑවැනි පූර්ණ සංඛ්‍යාවක් නොමැත q*10+1=-1.
ස්ටූබසික්

8

අනෙක් අය පෙන්වා දී ඇති පරිදි, n == 0 සඳහා වන විශේෂ ප්‍රතිකාරය විකාරයකි, මන්ද සෑම බැරෑරුම් සී ක්‍රමලේඛකයෙකුටම “අතර (n)” කාර්යය කරන බව පැහැදිලිය.

N <0 සඳහා හැසිරීම එතරම් පැහැදිලි නැත, ඒ නිසා මම එම කේත පේළි 2 දැකීමට කැමැත්තෙමි:

if (n < 0) 
    n = -n;

හෝ අවම වශයෙන් අදහස් දැක්වීමක්:

// don't worry, works for n < 0 as well

අවංකවම, n negative ණ විය හැකි යැයි ඔබ සලකන්නේ කුමන අවස්ථාවේදීද? කේතය ලිවීමේදී හෝ ගුරුවරයාගේ අදහස් කියවීමේදී?


1
N negative ණද යන්න නොසලකා N වර්ග ධනාත්මක වේ. ඉතින්, මුලින්ම ලකුණ ඉවත් කරන්නේ ඇයි? -3 * -3 = 9; 3 * 3 = 9. නැතහොත් මම මෙය ඉගෙන ගෙන වසර 30 ක් තුළ ගණිතය වෙනස් වී තිබේද?
මෙරොවෙක්ස්

2
@CB සාධාරණ ලෙස කිවහොත්, මම පරීක්ෂණය ලියන විට n negative ණ විය හැකි බව මා දුටුවේ නැත, නමුත් එය ආපසු පැමිණි විට මට හැඟී ගියේ එම කාල සීමාව පුපුරා නොයන බවය, අංකය .ණ වුවද. මම මගේ පරිගණකයේ පරීක්ෂණ කිහිපයක් කළ අතර එය මගේ සැකය තහවුරු කළේය. ඊට පස්සේ මම මේ ප්‍රශ්නය පළ කළා. ඉතින් නැහැ, කේතය ලිවීමේදී මම එතරම් ගැඹුරින් සිතුවේ නැහැ.
user010517720

5

මෙය මට අසමත් වූ පැවරුමක් සිහිගන්වයි

90 දශකයේ ආපසු යන්න. කථිකාචාර්යවරයා ලූප ගැන පැළවී ඇති අතර, දිගු කතාව කෙටියෙන් කිවහොත්, අපගේ පැවරුම වූයේ ඕනෑම පූර්ණ සංඛ්‍යාවක්> 0 සඳහා ඉලක්කම් ගණන ආපසු ලබා දෙන ශ්‍රිතයක් ලිවීමයි.

උදාහරණයක් ලෙස, ඉලක්කම් ගණන 321වනු ඇත 3.

පැවරුම හුදෙක් ඉලක්කම් ගණන ආපසු ලබා දෙන ශ්‍රිතයක් ලිවීමට පැවසුවද, අපේක්ෂාව වූයේ අපි 10 න් බෙදෙන ලූපයක් භාවිතා කරන තෙක්ය ... දේශනයෙන් ආවරණය වන පරිදි ඔබට එය ලැබෙනු ඇත .

නමුත් ලූප භාවිතා කිරීම පැහැදිලිව ප්‍රකාශ කර නොතිබූ නිසා මම: took the log, stripped away the decimals, added 1පසුව මුළු පන්තිය ඉදිරිපිටම ලැම්බස්ට් කරන ලදී.

කාරණය නම්, පැවරුමේ අරමුණ වූයේ දේශනවලදී අප ඉගෙන ගත් දේ පිළිබඳ අපගේ අවබෝධය පරීක්ෂා කිරීමයි . මට ලැබුණු දේශනයෙන් මම ඉගෙන ගත්තා පරිගණක ගුරුවරයා ටිකක් විහිළුවක් (නමුත් සමහර විට සැලැස්මක් සහිත විහිළුවක්ද?).


ඔබගේ තත්වය තුළ:

C / C ++ හි ශ්‍රිතයක් ලියන්න, එය වර්ග කොටසේ ඉලක්කම්වල එකතුව ලබා දෙයි

මම අනිවාර්යයෙන්ම පිළිතුරු දෙකක් ලබා දෙන්නෙමි:

  • නිවැරදි පිළිතුර (පළමුව අංකය වර්ග කිරීම), සහ
  • උදාහරණයට අනුකූලව වැරදි පිළිතුර, ඔහුව සතුටින් තබා ගැනීමට ;-)

5
තුන්වන එකක් ඉලක්කම්වල එකතුව වර්ග කරයිද?
ක්‍රිස්

r ක්‍රිස් - ඔව්, මම එතරම් දක්ෂ නැහැ :-(
මන්දගාමී ඉගෙනුම

1
මගේ ශිෂ්‍ය කාලය තුළ ද අපැහැදිලි උපකල්පනයන්ගෙන් කොටසක් මට ලැබුණි. ගුරුවරයෙකුට ටිකක් හැසිරවීමේ පුස්තකාලයක් අවශ්‍ය වූ නමුත් ඔහු මගේ කේතය ගැන පුදුමයට පත් වූ අතර එය ක්‍රියාත්මක නොවන බව පැවසීය. ඔහුගේ පැවරුමේ දී ඔහු කිසි විටෙකත් එන්ඩියන භාවය නිර්වචනය කර නැති බවත්, අනෙක් තේරීම කරන අතරතුර ඔහු අඩු බිට් 0 ලෙස තෝරා ගත් බවත් මට ඔහුට පෙන්වා දීමට සිදු විය. එකම කරදරකාරී කොටස නම්, මම ඔහුට නොකියා වෙනස කොතැනදැයි සොයා ගැනීමට ඔහුට හැකි විය යුතුය.
ක්‍රිස්

1

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

මට ප්‍රමාණවත් ලෙස ගමන් කළ නොහැකි එකක් නම් “අර්ථවත් විචල්‍ය නම් භාවිතා කිරීම” යන්නයි .

ඔබේ උදාහරණයේ එය එතරම් වෙනසක් නොකරයි, නමුත් ඔබ කේත කියවීමේ හැකියාව සහිත මිලියන ගණනක් සහිත ව්‍යාපෘතියක වැඩ කරන්නේ නම් එය ඉතා වැදගත් වේ.

සී කේතය සමඟ මා දැකීමට නැඹුරු වන තවත් දෙයක් නම් මිනිසුන් දක්ෂ ලෙස බැලීමට උත්සාහ කිරීමයි. (N! = 0) අතර භාවිතා කරනවා වෙනුවට (n) ලිවීමේදී මා කෙතරම් දක්ෂ දැයි මම සෑම කෙනෙකුටම පෙන්වන්නම් . හොඳයි, එය ඔබ සතුව ඇති සම්පාදකයා තුළ ඇති නමුත් ඔබ යෝජනා කළ පරිදි ගුරුවරයාගේ පැරණි අනුවාදය එය එකම ආකාරයකින් ක්‍රියාත්මක කර නැත.

පොදු නිදසුනක් නම්, දර්ශකයක් අරාවෙහි යොමු කිරීම එකවර වැඩි කිරීම ය; අංක [i ++] = iPrime;

දැන්, කේතය මත වැඩ කරන ඊළඟ ක්‍රමලේඛකයා දැනගත යුතුව ඇත්තේ මට පැවරුමට පෙර හෝ පසුව වර්ධනයක් සිදුවී ඇත්දැයි යමෙකුට පෙන්විය හැකිය.

මෙගාබයිට් තැටියක ඉඩ මිළ අඩුයි වැසිකිළි කඩදාසි රෝල් කිරීම, ඉඩ ඉතිරි කර ගැනීමට උත්සාහ කරනවාට වඩා පැහැදිලිකම සඳහා යන්න, ඔබේ සෙසු වැඩසටහන්කරුවන් සතුටින් සිටිනු ඇත.


2
මම සී හි වැඩසටහන්ගත කර ඇත්තේ අතළොස්සක් පමණි. ++iඇගයීමට පෙර i++වර්ධක සහ ඉන් පසුව වර්ධක බව මම දනිමි . while(n)පොදු භාෂා ලක්ෂණයකි. මේ වගේ තර්කනය මත පදනම්ව මම බොහෝ කේත දැක ඇත්තෙමි if (foo == TRUE). මම නැවත එකඟ වෙමි: විචල්‍ය නම්.
alan ocallaghan

3
සාමාන්‍යයෙන් එය නරක උපදෙස් නොවේ, නමුත් ආරක්ෂක ක්‍රමලේඛනය සඳහා මූලික භාෂා අංග (මිනිසුන් අනිවාර්යයෙන්ම කෙසේ හෝ හමුවනු ඇත) මග හැරීම අතිරික්තය. කෙටි, පැහැදිලි කේතය බොහෝ විට කෙසේ හෝ කියවිය හැකිය. අපි මෙහි කතා කරන්නේ පිස්සු පර්ල් හෝ බැෂ් වන්-ලයිනර් ගැන නොවේ, ඇත්ත වශයෙන්ම මූලික භාෂා ලක්ෂණ පමණි.
alan ocallaghan

1
මෙම පිළිතුරේ ඇති අඩුපාඩු මොනවාදැයි විශ්වාස නැත. මට මෙහි දක්වා ඇති සෑම දෙයක්ම සත්‍ය සහ වැදගත් වන අතර සෑම සංවර්ධකයෙකුටම හොඳ උපදෙස් වේ. විශේෂයෙන්ම ස්මාර්ට්-ඇස්-ක්‍රමලේඛන කොටස, while(n)ඒ සඳහා නරකම උදාහරණය නොවුනත් (මම if(strcmp(one, two))වැඩි වැඩියෙන් "කැමතියි"
කයි හප්මන්

1
ඊට අමතරව, නිෂ්පාදනයේ භාවිතා කළ යුතු C කේතය අතර වෙනස නොදන්නා i++සහ ++iවෙනස් කිරීමට ඔබ සැබවින්ම ඉඩ නොදිය යුතුය.
klutt

2
APaulMcCarthy අපි දෙදෙනාම කේත කියවීමේ හැකියාව සඳහා ය. නමුත් එහි තේරුම පිළිබඳව අපි එකඟ නොවෙමු. එසේම, එය වෛෂයික නොවේ. එක් පුද්ගලයෙකුට කියවීමට පහසු දේ තවත් කෙනෙකුට අපහසු විය හැකිය. පෞරුෂත්වය සහ පසුබිම් දැනුම මෙයට තදින්ම බලපායි. මගේ ප්‍රධාන කාරණය නම්, සමහර නීති අන්ධ ලෙස අනුගමනය කිරීමෙන් ඔබට උපරිම කියවීමේ හැකියාව නොලැබීමයි.
klutt

0

'%' හි මුල් හෝ නවීන අර්ථ දැක්වීම වඩා හොඳ දැයි මම තර්ක නොකරමි, නමුත් එවැනි කෙටි ශ්‍රිතයක් වෙත ආපසු ප්‍රකාශ දෙකක් ලියන ඕනෑම කෙනෙකුට සී ක්‍රමලේඛනය කිසිසේත් ඉගැන්විය යුතු නැත. අමතර ප්‍රතිලාභ යනු ගොටෝ ප්‍රකාශයක් වන අතර අපි සී හි ගොටෝ භාවිතා නොකරමු. තවද ශුන්‍ය පරීක්ෂාවකින් තොරව කේතය එකම ප්‍රති result ලයක් ලබා දෙනු ඇත, අමතර ප්‍රතිලාභ කියවීම දුෂ්කර විය.


4
"අමතර ප්‍රතිලාභ යනු ගොටෝ ප්‍රකාශයක් වන අතර අපි සී හි ගොටෝ භාවිතා නොකරමු." - එය ඉතා පුළුල් සාමාන්‍යකරණයක හා බොහෝ දුර ප්‍රමාණයක එකතුවකි.
එස්එස් ne න්

1
"අපි" අනිවාර්යයෙන්ම සී හි ගොටෝ භාවිතා කරමු. එහි කිසිදු වරදක් නොමැත.
ක්ලූට්

1
එසේම, ශ්‍රිතයක කිසිදු වරදක් නැතint findChar(char *str, char c) { if(!str) return -1; int i=0; while(str[i]) { if(str[i] == c) return i; i++; } return -1; }
klutt

1
EtPeterKrassoi මම කියවීමට අමාරු කේතයක් ඉදිරිපත් නොකරමි, නමුත් සරල ගොටෝ හෝ අමතර ප්‍රතිලාභ ප්‍රකාශයක් වළක්වා ගැනීම සඳහා කේතය සම්පූර්ණ අවුල් ජාලයක් ලෙස පෙනෙන උදාහරණ ටොන් ගණනක් මම දැක ඇත්තෙමි. මෙන්න ගොටෝ භාවිතා කිරීම සඳහා කේත කිහිපයක්. ගොටෝ ප්‍රකාශ ඉවත් කර ඒ සමඟම කේතය කියවීමට පහසු කරවන ලෙස මම ඔබට අභියෝග කරමි: pastebin.com/aNaGb66Q
klutt

1
EtPeterKrassoi කරුණාකර මෙහි ඔබේ අනුවාදය ද පෙන්වන්න: pastebin.com/qBmR78KA
klutt

0

ගැටළු ප්‍රකාශය අවුල් සහගත ය, නමුත් සංඛ්‍යාත්මක උදාහරණය මඟින් වර්ග කොටසේ ඉලක්කම්වල එකතුවෙහි අර්ථය පැහැදිලි කරයි . වැඩි දියුණු කළ අනුවාදයක් මෙන්න:

[-10 7 , 10 7 ]n පරාසය තුළ පූර්ණ සංඛ්‍යාවක් ගන්නා C සහ C ++ හි පොදු උප කුලකයේ ශ්‍රිතයක් ලියන්න සහ එහි නිරූපණයෙහි ඉලක්කම්වල වර්ගවල එකතුව 10 වන පදනමෙහි නැවත ලබා දේ. උදාහරණය: එසේ නම් , ඔබේ ශ්‍රිතය ආපසු යා යුතුය (1 2 + 2 2 + 3 2 = 14).n12314

විස්තර 2 ක් හැර ඔබ ලියූ කාර්යය හොඳයි:

  • longනිශ්චිත පරාසයක ඇති සියළුම අගයන් සඳහා ඉඩ සැලසීමට තර්කයේ වර්ගය තිබිය යුතුය long. සී ප්‍රමිතිය මඟින් අවම වශයෙන් අගය බිටු 31 ක් වත් ඇති බව සහතික කර ඇත, එබැවින් සියලු අගයන් නිරූපණය කිරීමට ප්‍රමාණවත් පරාසයක් [-10 7 , 10 7 ]. (intආපසු එන වර්ගය සඳහාවර්ගයප්‍රමාණවත්බව සලකන්න, එහි උපරිම අගය වේ568 .)
  • %Negative ණාත්මක ක්‍රියාකාරිත්වයන් සඳහා වන හැසිරීම බුද්ධිමය නොවන අතර එහි පිරිවිතර C99 ප්‍රමිතිය සහ පෙර සංස්කරණ අතර වෙනස් වේ. Negative ණාත්මක යෙදවුම් සඳහා වුවද ඔබේ ප්‍රවේශය වලංගු වන්නේ මන්දැයි ඔබ ලේඛනගත කළ යුතුය.

වෙනස් කළ අනුවාදයක් මෙන්න:

int sum_of_digits_squared(long n) {
    int s = 0;

    while (n != 0) {
        /* Since integer division is defined to truncate toward 0 in C99 and C++98 and later,
           the remainder of this division is positive for positive `n`
           and negative for negative `n`, and its absolute value is the last digit
           of the representation of `n` in base 10.
           Squaring this value yields the expected result for both positive and negative `c`.
           dividing `n` by 10 effectively drops the last digit in both cases.
           The loop will not be entered for `n == 0`, producing the correct result `s = 0`.
         */
        int c = n % 10;
        s += c * c;
        n /= 10;
    }
    return s;
}

ගුරුවරයාගේ පිළිතුරට අඩුපාඩු තිබේ:

  • වර්ගය int ප්‍රමාණවත් නොවන අගයන් තිබිය හැක.
  • විශේෂ අවස්ථා වල වටිනාකම අවශ්‍ය නොවේ 0 .
  • negative ණාත්මක අගයන් ප්‍රතික්ෂේප කිරීම අනවශ්‍ය වන අතර ඒ සඳහා නිර්වචනය නොකළ හැසිරීම් තිබිය හැකිය n = INT_MIN .

ගැටළු ප්‍රකාශයේ අමතර සීමාවන් (C99 සහ සඳහා අගයන් පරාසය n ) ගැටළුවක් වන්නේ පළමු දෝෂය පමණි. අමතර කේතය තවමත් නිවැරදි පිළිතුරු සපයයි.

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

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.