Validation of credit card number
I don't like this:


do
{
    printf("Card number: ");
    scanf("%lld", &amp;no);
}

while(no&lt;10);



That blank line makes it look like the while (); is a separate (possibly infinite) loop.  I recommend writing the while keyword straight after the closing brace, like this:

do {
    printf("Card number: ");
} while (scanf("%lld", &amp;no) != 1);


(I've also changed the test so that we don't access an uninitialised no if the scanf() fails - it's still flawed, though, as any permanent stdin failure will lead to an infinite loop).



It's not clear why we have d_1, d_2, ..., etc. when all we do with them is to copy them into array members - why not just assign to the array members directly?



Instead of dividing no by successively bigger numbers each time, we could modify it as we go, like this:

d_16 = no % 10;
no /= 10;
d_15 = no % 10 * 2;
no /= 10;
d_14 = no % 10;


It's starting to become clear how to transform this into a loop.  The missing part is whether to multiply by 2 at each step; we can tell whether the loop index is even or odd, by considering it modulo 2.

Once we are considering the digits in a loop, we can perform the addition as we go, meaning that we no longer need all those local variables.