Home > OS >  How to see if integer has a specific digit in it in C
How to see if integer has a specific digit in it in C

Time:01-08

I need to build a program, that would write all numbers from 0 to 100, but will place an * instead of any number that contains the digit 3 or can be divided by 3. This is what I have so far. How can I make it work?

#include <stdio.h>

main() {
  int i, c;
  c = 100;
  for (i = 0; i <= c; i  ) {
    if (i % 3 == 0) {
      printf("*");
    }
    if (i)
      printf("%d\n", i);
  }
}

CodePudding user response:

place an * instead of any number that contains the digit 3 or can be divided by 3.

OP's code took care of the "can be divided by 3" with i % 3 == 0.

How about a little divide and conquer for the "contains the digit 3"? Put a function in there.

if (contains_the_digit(i, 3) || (i % 3 == 0)) {
  printf("*\n");
} else {
  printf("%d\n", i);
}

Now what is left is to define contains_the_digit(int i, int digit)

Mathematically (nice and efficient):

bool contains_the_digit_via_math(int i, int digit) {
  do {
    if (abs(i % 10) == digit) { // Look at the least digit, abs() to handle negative `i`
      return true;
    }
    i /= 10; // Now look at the upper decimal digits
  } while (i);  
  return false;
}

Or textually:

bool contains_the_digit_via_string(int i, int digit) {
  char buf[30];  // Something certainly big enough
  sprintf(buf, "%d", i);
  return strchr(buf, digit   '0') != NULL; 
}

Or use your imagination for other ideas.


  • The key is to take your problems and reduce them to smaller ones with helper functions: divide and conquer.

CodePudding user response:

  1. Concert the number to a string
  2. Replace '3' with '*' within that string

i.e.

int to_be_converted =12345612343242432; // Or summat else
char num[100]; // Should be more than enough
sprintf(num, "%d", to_be_converted);

for (int i =0; num[i]; i  ) {
   if (num[i] -- '3') num[i] = '*';
}
printf("Here you go %s", num);

That should do the trick

Just ad the bit to go through the numbers and check if divisible by 3. I leave that to the reader.

CodePudding user response:

Seeing you forgot to add the return type int to your int main(), I think this is a good time to learn to write your own function!

In this case, you want a function that can check whether the last digit of a number is a 3 when you represent that number as base-10. That's easy! The function should look like (you need to #include <stdbool.h> at the beginning of your file, too):

bool ends_in_decimal_3(int number) {
  // figure out a way to find the difference 
  // between number, rounded to multiples of 10
  // and the original number. If that difference==3, 
  // then this ends in 3 and you can `return true;`
}

Armed with that function, you can see whether your i itself ends in 3, or whether i/10 ends in 3 and so on. Remembering that division / in C between ints always rounds down is a good trick to do that, and also an important hint on how to implement your rounding in ends_in_decimal_3.

  •  Tags:  
  • Related