പ്രൈം നമ്പര്‍ പ്രിന്റ് ചെയ്യാന്‍

പ്രൈം നമ്പര്‍ പ്രിന്റ് ചെയ്യുന്നത് പ്രോഗ്രാമിങ്ങ് പഠിക്കുന്ന വിദ്യാര്‍ത്ഥികള്‍ക്ക് കിട്ടുന്ന ആദ്യപ്രശ്നങ്ങളിലൊന്നാണ്‌.
സി പ്രോഗ്രാമില്‍ പ്രം നമ്പര്‍ പ്രിന്റ് ചെയ്യാന്‍ ഉള്ള ഒരു ഫംഗ്ഷന്‍ പ്രോഗ്രാം താഴെ കൊടുത്തിരിക്കുന്നു. ഇതില്‍ പ്രൈം നമ്പര്‍ ആണോ അല്ലയോ എന്ന് തിരിച്ചറിയാന്‍ ഉള്ള ലോജിക്കില്‍ ഒരു ഫ്ലാഗ് യൂസ് ചെ‌യ്തിരിക്കുന്നത് ശ്രദ്ധിക്കുക (isPrime).

1. Create file
calvin@Singularity:~/programming$ gedit prime_flag.c




#include<stdio.h>


int prime_or_not(int iNum){

int isPrime = 0;
int jNum =2;

for(jNum=2;jNum<iNum;jNum++)
{
if( iNum%jNum==0)
{
isPrime = 1;
break;
}
}


return isPrime;

}

void main(){

int iNum=2;


printf("\n");
printf("==================================================\n");
printf("Program to print the prime numbers from 1 to 100\n");
printf("==================================================\n");


for(iNum=2;iNum<=100; iNum++)
{
if(!(prime_or_not(iNum)))
{
printf("%d is a prime number\n", iNum);
}


}



printf("\n\n");
}


2. Compile and run
calvin@Singularity:~/programming$gcc prime_flag.c
calvin@Singularity:~/programming$./a.out

3. Output


==================================================
Program to print the prime numbers from 1 to 100
==================================================

2 is a prime number
3 is a prime number
5 is a prime number
7 is a prime number
11 is a prime number
13 is a prime number
17 is a prime number
19 is a prime number
23 is a prime number
29 is a prime number
31 is a prime number
37 is a prime number
41 is a prime number
43 is a prime number
47 is a prime number
53 is a prime number
59 is a prime number
61 is a prime number
67 is a prime number
71 is a prime number
73 is a prime number
79 is a prime number
83 is a prime number
89 is a prime number
97 is a prime number


മെക്കാനിക്കല്‍ ഡിപ്പാര്‍ട്മെന്റിലെ സജിത് ബാബു സാര്‍ ഐ.ഐ.ടി ഇന്റര്‍‌വ്യൂവിനു പോയപ്പോള്‍ ചോദിച്ച ചോദ്യങ്ങളിലൊന്ന് How to write a C program to print prime numbers from 1 to 100 without using any flags എന്നായിരുന്നു. പുള്ളി അന്നാ ചോദ്യം ഞങ്ങള്‍ കുറച്ച് വിദ്യാര്‍ത്ഥികളോട് ചോദിച്ചു. അന്നതിനു എന്തോ ഒരു സൊലൂഷന്‍ ഞാന്‍ കണ്ടു പിടിച്ച് പ്രിന്റ് എടുത്ത് കുറേ ദിവസം നടന്നെങ്കിലും സാറ് സ്ഥലം മാറ്റം കിട്ടിയോ മറ്റോ പോയതിനാല്‍ അത് കൊടുക്കാന്‍ കഴിഞ്ഞില്ല. ആ ലോജിക് ഇപ്പോള്‍ ഓര്‍മയില്ല. വൈല്‍ ലൂപിന്റെ എന്തോ ഒരു കളി ആയിരുന്നു എന്ന് നേരിയ ഓര്‍മ ഉണ്ട്.

ഇന്നിപ്പോള്‍ അത് ഇങ്ങനെ സോള്‍‌വ് ചെയ്യാന്‍ തോന്നി.

1. Create file
calvin@Singularity:~/programming$ gedit prime_no_flag.c


#include<stdio.h>


int prime_or_not(int iNum){


int jNum =2;

for(jNum=2;jNum<iNum;jNum++)
{
if( iNum%jNum==0)
{

break;
}
}

if (jNum<=iNum-1)
return 1;
else
return 0;
}
void main(){

int iNum=2;


printf("\n");
printf("==================================================\n");
printf("Program to print the prime numbers from 1 to 100\n");
printf("Without using any Flags\n");
printf("==================================================\n");


for(iNum=2;iNum<=100; iNum++)
{
if(!(prime_or_not(iNum)))
{
printf("%d is a prime number\n", iNum);
}


}



printf("\n\n");
}



2. Compile and run
calvin@Singularity:~/programming$gcc prime__no_flag.c
calvin@Singularity:~/programming$./a.out

3.Output



==================================================
Program to print the prime numbers from 1 to 100
Without using any Flags
==================================================

2 is a prime number
3 is a prime number
5 is a prime number
7 is a prime number
11 is a prime number
13 is a prime number
17 is a prime number
19 is a prime number
23 is a prime number
29 is a prime number
31 is a prime number
37 is a prime number
41 is a prime number
43 is a prime number
47 is a prime number
53 is a prime number
59 is a prime number
61 is a prime number
67 is a prime number
71 is a prime number
73 is a prime number
79 is a prime number
83 is a prime number
89 is a prime number
97 is a prime number



വ്യത്യാസം ശ്രദ്ധിച്ചു കാണും എന്നു കരുതുന്നു.

ഇതല്ലാതെയും പല തരത്തില്‍ സോള്‍‌വ് ചെയ്യാവുന്നതാണ്‌. എല്ലാം നിങ്ങളുടെ ഇഷ്ടം ;)

24 comments:

  1. cALviN::കാല്‍‌വിന്‍ said...

    Just for horror!

  2. ഹാഫ് കള്ളന്‍||Halfkallan said...

    Edo 1 prime number alla !

  3. cALviN::കാല്‍‌വിന്‍ said...

    true.. thalkam shemi... edit cheyyan vayya

  4. cALviN::കാല്‍‌വിന്‍ said...

    ok,, cheythu pandarame :P

    thanks :)

  5. Captain Haddock said...

    നിനക്ക് അവിടെ പ്രിന്റിംഗ് പ്രെസില്ലാ പണി ?

  6. Pyari K said...

    ഈശ്വരാ ഇവിടേം കോഡും കോഡു റിവ്യൂം ഒക്കെയാണോ??? ഞാന്‍ നോക്കിയില്ല കേട്ടോ ..

    എന്ത് പറ്റി ഇപ്പൊ ഇങ്ങനെ ഒരു ചുവടു മാറ്റം?

  7. Muneer said...
    This comment has been removed by the author.
  8. Muneer said...

    ഇപ്പ ശരിയാക്കിത്തരാം

    #include

    int prime_or_not(int iNum)
    {

    int jNum =2;

    for(jNum=2;jNum<iNum;jNum++)
    {
    if( iNum%jNum==0)
    {
    return 1; /*അല്ലെന്നു മനസ്സിലായാ ഇനി ഇവിടെ കിടന്നു കറങ്ങേണ്ടാ, വീട്ടീ പോടേ! */
    }
    }

    return 0;
    }

    സിമ്പിള്‍ അല്ലെ?

    പിന്നെ, for loop condition sqrt(iNum) വരെ മതി.

    അതായത് ദാസാ...
    for(jNum=2;jNum*jNum<=iNum;jNum++) വരെ മതി.
    പോരെ?

  9. kurian said...

    for cnt in range(0,100):
    primeNum=cnt
    primeNum*=1.0
    for divisor in range(2,int(primeNum**0.5)+1):
    if primeNum/divisor==int(primeNum/divisor):
    print '%s is Prime '%cnt

  10. Sudhi|I|സുധീ said...

    സോറി... ഞാന്‍ ഉദ്ദേശിച്ച ബ്ലോഗ്‌ ഇതല്ല... പിന്നെ വരാം...

  11. desertfox said...

    Programming skills പരീക്ഷിക്കാനും മെച്ചപ്പെടുത്താനും ഈ സൈറ്റ്‌ ഉപയോഗപ്പെട്ടേക്കും.
    പ്രൊജെക്ട്‌ യൂളര്‍
    പഠിക്കുന്നവര്‍ക്ക്‌ മാത്രമല്ല പയറ്റിത്തെളിഞ്ഞവര്‍ക്കും ഒരു കൈ നോക്കാം

  12. Anoop said...

    The for loop need not be till "jNum<iNum".

    You can define an integer iNum/2, say iNumBy2Int. The for loop needn't have to go beyond this number.

    jNum<=iNumBy2Int should suffice.

    It should be less computationally expensive for larger numbers. Of course, this simple algorithm has its limits in case of really large numbers.

  13. Anoop said...

    Oops.. since we don't need all the factors, even (iNum/2 - 1) loops are not required.

    We need to check if iNum%jNum == 0, only when (jNum)^2 <=iNum.

    looks better with a while loop.

  14. റോഷ്|RosH said...

    എന്റെ നമ്പര്‍ എപ്പോ വരും? :P

  15. chithrakaran:ചിത്രകാരന്‍ said...

    ചിത്രകാരന് ഈ ഭാഷ അപരിചിത ലോകമാണെങ്കിലും,
    ഇത്രയും കാലം ആരും ഈ കംബ്യൂട്ടര്‍ ഭാഷയൊന്നും എന്തുകൊണ്ട്
    പുറത്തെടുത്ത് അലക്കിയില്ല എന്ന് അതിശയിച്ചുപോകയാണ്.
    അറിവിന്റെ വളര്‍ച്ചക്കും നാടിന്റെ വളര്‍ച്ചക്കും ഇത്തരം സാങ്കേതിക
    ഭാഷകളൊക്കെ പൊതുവേദിയില്‍ സംവദിക്കുന്ന ശീലം ഉണ്ടാകുകതന്നെ വേണം.
    ഈ കംബ്യൂട്ടര്‍ ഭാഷ എന്ത് ആവശ്യത്തിന് ഉപയോഗിക്കുന്നു എന്നു മാത്രം അറിയാന്‍ താല്‍പ്പര്യമുണ്ട് :)

  16. cALviN::കാല്‍‌വിന്‍ said...

    ഗഡീസ്...

    ദാങ്ക്സ് ഫോര്‍ കമന്റിംഗ്...
    ഞാന്‍ കോഡൊന്നും ഒപ്റ്റിമൈസ് ചെയ്തില്ല. ഫ്ലാഗൊഴിവാക്കുന്നത് മാത്രമേ ചൂണ്ടിക്കാണിക്കാന്‍ ഉദ്ദേശിച്ചുള്ളൂ.

    മുനീറിന്റെ ആദ്യത്തെ മെഥേഡിന്റെ പ്രയോജനം ഒരു ഇഫ് എല്‍സ് ഒഴിവാക്കാം. എഫിഷ്യന്‍സിയേക്കാള്‍ കോഡ് വൃത്തിയാകും എന്നതാണ്‌ പ്രയോജനം.
    രണ്ടാമത് പറഞ്ഞത് അവശ്യം തന്നെ. പ്രത്യേകിച്ചും നൂറിനു പകരം വലിയ സംഖ്യയാണ്‌ ഉപയോഗിക്കുന്നതെങ്കില്‍.

    കുര്യനും അനൂപും പറഞ്ഞത് അത് തന്നെയല്ലേ?

    Pyari,
    ചുവട് മാറിയതല്ല. സ്ഥിരം ആയി കോഡ് ചെയ്യുന്നവര്‍ അത് മടുത്തിട്ട് ബ്ലോഗില്‍ കഥ എഴുതുന്നു.
    കുറേക്കാലമായി കോഡ് എഴുതാത്തതിനാല്‍ ബോറഡിച്ചിട്ട് ഞാന്‍ അതും എഴുതുന്നു... ;)

    ചിത്രകാരന്‍,

    മലയാളത്തിലേ സാങ്കേതിക ബ്ലോഗുകള്‍ കുവുള്ളൂ. അതിന്റെ ആവശ്യമുണ്ടെന്നും തോന്നുന്നില്ല.
    ഇംഗ്ലീഷ് ബ്ലോഗുകള്‍ ധാരാളമുണ്ട്.

    ഇത് കമ്പുയൂട്ടര്‍ പ്രോഗ്രാമുകള്‍ എഴുതാന്‍ ഉള്ള ഭാഷയാണ്‌. കമ്പ്യുട്ടറിനു ബൈനറി മാത്രമേ മനസിലാകൂ എന്ന് താങ്കള്‍ക്കറിയാമല്ലോ. ബൈനറിയില്‍ പ്രോഗ്രാം എഴുതാന്‍ മനുഷ്യര്‍ക്ക് ബുദ്ധിമുട്ടാണ്‌. അതിനാല്‍ മനുഷ്യര്‍ക്ക് മനസിലാവുന്ന ഭാഷയില്‍ എഴുതി അതിനെ ബൈനറി ആക്കുകയാണ്‌ ചെയ്യുക. ഇംഗ്ലീഷോ മലയാളമോ പോലുള്ള ഭാഷയില്‍ പ്രോഗ്രാം എഴുതി അതിന്റെ ബൈനറി ആക്കുക നടപ്പുള്ള കാര്യമല്ല. അതിനാല്‍ വളരെക്കുറച്ച് വാക്കുകളും എന്നാല്‍ ശക്തമായ വ്യാകരണവും ഉള്ള പ്രത്യേകം ഭാഷകള്‍ ഉപയോഗിക്കുന്നു. സയന്‍സിന്റെ ഭാഷയായ മാത്തമറ്റിക്സിന്റെ വ്യാകരണമാണ്‌ പൊതുവെ ഇത്തരം ഭാഷകള്‍ക്കുണ്ടാവുക (സ്വാഭാവികമായും)

    സുധി,റോഷ്,കാപ്റ്റന്‍, ഡെസേര്‍ട് ഫോക്സ് ...
    കമന്റുകള്‍ക്ക് നന്ദി

  17. Umesh::ഉമേഷ് said...
    This comment has been removed by the author.
  18. Umesh::ഉമേഷ് said...

    1) The name isPrime is confusing. It indicates true (1) when it is not a prime and false (0) when it is a prime.

    2) main() should return int, not void.

    3) You need not check up to inum. Checking up to sqrt(inum) is sufficient. (If you don't want to use floating point calculation even once, check up to half of inum.)

    4) Since it just wants to know whether it is a prime or not, no flag is needed. Just return when you know it is not.

    So,

    int is_prime(int n) {
    int s = (int) sqrt(n);
    int i;
    for (i = 2; i <= s; ++i) {
    if (!(n % i)) {
    return 0;
    }
    }
    return 1;
    }

    If you want to list prime numbers up to some number, you can further optimize it. You need to check only primes, not all numbers. So, keep the primes you get in an array and check only those further.

  19. ഹാഫ് കള്ളന്‍||Halfkallan said...

    ഞങ്ങ ക്വാഡ് ചെയ്യമ്പോ ഫ്ലാഗ് ഉപയോഗിക്കാന്‍ അറിയാന്‍ മേലാരുന്നു .. അതോണ്ട് നീ പുതീത് ന്നു പറഞ്ഞ മെത്തേഡ് ലാ പണ്ടേ ഞങ്ങ അഭാജ്യ സംഖ്യകള്‍ പ്രിന്റാറ് !

  20. Kalavallabhan said...

    കാൽ വിൻ സാറെ ഈ സംരംഭം കൊള്ളാം. ഇത്‌ സരളമായ "മലയാളഭാഷയിൽ" ടെക്നിക്കൽ പദങ്ങളുടെ വിശദീകരണവും ഉപയോഗിക്കുന്നതിന്റെ ആവശ്യകതയും നിരത്തി ചെറിയ ചെറിയ
    പ്രോഗ്രാമുകൾ അവതരിപ്പിച്ചാൽ (ഒരു പുതിയ ബ്ലോഗിൽ തന്നെ ആയാൽ നന്ന്) നന്നായിരുന്നു.

  21. cALviN::കാല്‍‌വിന്‍ said...

    Please don't call me sir :) I really doubt whether there is a scope for
    computer science blog in Malayalam . But sure I will be posting some more stuff soon. Thanks.

  22. R. said...

    Haree,

    Mind trying the Sieve of Erathosethenes? http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

  23. cALviN::കാല്‍‌വിന്‍ said...

    R.,

    ഇഷ്ടപ്പെട്ടു :) സിയില്‍ എഴുതാന്‍ വയ്യ.
    സിഷാര്‍പ്പില്‍ ഒരു പിടി പിടിക്കട്ടെ...
    താങ്ക്സ്...

  24. cALviN::കാല്‍‌വിന്‍ said...

    R.,
    അത് സോള്വ് ചെയ്‌ത് ഒരു പുതിയ പോസ്റ്റായി ഇട്ടിട്ടുണ്ട്.

    http://singularityon.blogspot.com/2010/02/eulers-sieve.html

    ഉമേഷേട്ടാ, ഇപ്പോള്‍ എല്ലാം ശരിയായി എന്നു കരുതുന്നു

Post Your Comment (പഴയ കമന്റ്‌ ഫോം?)

അഭിപ്രായങ്ങള്‍ക്ക് സുസ്വാഗതം.
തെറിവിളികള്‍, വ്യക്തിഹത്യ മുതലായവയെ ഒഴിവാക്കുമല്ലോ.
അനോണിമസ് ഓപ്ഷന്‍ തല്‍ക്കാലം ലഭ്യമല്ല. പഴയ പോസ്റ്റുകള്‍ക്ക് കമന്റ് മോഡറേഷന്‍ ഉണ്ട്. സരസമായ ഓഫുകളെ നിരുത്സാഹപ്പെടുത്തുന്നില്ല. മനപൂര്‍‌വം വിഷയത്തില്‍ നിന്നും വഴി തിരിച്ചു വിടുന്ന കമന്റുകള്‍ ഡിലീറ്റ് ചെയ്യപ്പെട്ടേക്കാം.

CopyLeft Information

Singularity എന്ന ബ്ലോഗില്‍ പ്രസിദ്ധീകരിക്കുന്ന ലേഖനങ്ങള്‍ എല്ലാം പൊതുതാല്പര്യാര്‍ത്ഥം ഉള്ളതാണ്. അവ ലേഖകന്റെ അനുമതി കൂടാതെ തന്നെ വാണിജ്യപരമോ വാണിജ്യേതരമോ ആയ എന്താവശ്യത്തിനും ഏതൊരാള്‍ക്കും എപ്പോഴും എത്ര തവണ വേണമെങ്കിലും മാറ്റങ്ങളോടെയോ അതേ പടിയോ ബ്ലോഗിലോ ഇതരമാധ്യമങ്ങളിലോ സ്വതന്ത്രവും സൌജന്യവുമായി ഉപയോഗിക്കാം. മാറ്റം വരുത്തുന്ന പക്ഷം അതില്‍ ഈ ലേഖകന്‍‍ ഉത്തരവാദിയല്ല. പുനഃപ്രസിദ്ധീകരിക്കുന്ന കുറിപ്പിനൊപ്പം മൂലലേഖനത്തിന്റെ രചയിതാവു് എന്ന സ്ഥാനം ലേഖകനു് നല്‍കുന്നതു് അഭികാമ്യം. എന്നാല്‍ ഇതു് നിബന്ധനയല്ല. മറ്റൊരാളുടെ പേരു് പകരം കൊടുക്കാന്‍ അനുമതിയില്ല. വീണ്ടും ഉപയോഗിക്കുന്ന പക്ഷം ആ വിവരം ലേഖകനെ അറിയിക്കണമെന്നും ഈ പകര്‍പ്പുപേക്ഷാപത്രം ഒപ്പം നല്‍കണമെന്നും താത്പര്യപ്പെടുന്നു.