One of the questions given to us for the lab exam was to generate the first 10 armstrong numbers. I could generate upto 5 numbers correctly..the rest are wrong.

#include<stdio.h>
#include<conio.h>

void main()
{
 int n=1,a,b,i=1,r;
 clrscr();
 while(i<=10)
 {
  a=0;
  b=n;
  do
  {
   r=b%10;
   a=a+r*r*r;
   b=b/10;
  }while(b>0);
  if(a==n)
  {
   printf("\t%d",n);
   i++;
   n++;
  }
  else
   n++;
 }
 getch();
}

the output i got is :
1 153 370 371 407 -729 -216 -125 -64 -1

What should I do to get the correct output?

Is it possibe to generate ten armstrong numbers?? I could not even find what the 6th armstrong number is?

An n-digit number that is the sum of the nth powers of its digits is called an n-narcissistic number. It is also sometimes known as an Armstrong number, perfect digital invariant (Wolfram MathWorld)

To me, the reason that you fail to produce those numbers is because you have defined the Armstrong Number incorrectly.

If an Armstrong number is a number such that the sum of its digits raised to the third power is equal to the number itself, then I am sure that there are only 5 Armstrong numbers that does exist in this world. Practically, when the number of digit grow, the sum of raising to the third power of each digit won't able to produce larger enough result to be equal to the number.

For example:
99999 = 9^3 + 9^3 + 9^3 + 9^3 + 9^3 = 3645.

The above example has proved that even we have the largest number in each digit we still cannot produce larger enough result to be equal to its number.

#include<stdio.h>
#include<conio.h>
#include<math.h>

void main()
{
 int n1=1,a,n2,i=1,r,dig=0;
 clrscr();
 while(i<=10)
 {
  a=0;
  n2=n1;
  do
  {
   n2=n2/10;
   dig++;
  }while(n2>0);
  n2=n1;
  while(n2>0)
  {
   r=n2%10;
   a=a+pow((double)r,(double)dig);
   n2=n2/10;
  }
  if(a==n1)
  {
   printf("\n%d",n1);
   i++;
   n1++;
  }
  else
   n1++;
 }
 getch();
}

The program is not even running..
Can somebody tell me where I went wrong?

The problem that your code doesn't run properly is because you keep increase the dig without reseting it. To solve this, you can simply reset the dig to 0 in the beginning of the loop.

while(i<=10) {
   a=0;
   dig=0; // reset it to 0
   n2=n1;

   do {
       n2 = n2 / 10;
       dig++;
   } while (n2 > 0);
....
....
}

One more thing, next time, you should try to choose better name for your variable. It is idea good to name your variable that could express its purpose. To be honest, your code is very hard to read since there are n1, n2, a, b which look so similar to each other.

In addition to invisal's post:
Don't compute p raised to the power dig with floating point arithmetic pow function. It's too expensive. Better write your own simple integer pow function, for example:

int ipow(int k, int n)
{
    int kn = k;
    while (n-->1)
        kn *= k;
    return kn;
}

It's far from the fastest method but it's better than pow(). Think about using table (array) of powers (there are only ten digits for base 10 ;)).

Think about better condition for the last loop. No need to continue calculations if the partial sum of powers is greater than the number (it's not one of Armstrong numbers).

Look at for loops in C textbook: your while loops are for loops simulations.

Use "%d\n", not "\n%d" format to print the next number.

If you want to calculate Armstrong Numbers with more than three digits, it is important to re-iterate the loop uptil the Number of Digits in that Integer. It is also commonly known as Narcissistic Numbers. Here, the loop calculates till the end of the Number of Digits in that given integer. Here, they have described a very good example and a perfectly executable code for Narcissistic Numbers: http://www.codingalpha.com/narcissistic-number-c-program/

This question has already been answered. Start a new discussion instead.