C Exercises: Check whether a given number with base b is a Niven number or not
Write a C program to check whether a given number with base b (2 <= b<= 10) is a Niven number or not.
From Wikipedia,
In recreational mathematics, a harshad number (or Niven number) in a given number base, is an integer that is divisible by the sum of its digits when written in that base. Harshad numbers in base n are also known as n-harshad (or n-Niven) numbers. Harshad numbers were defined by D. R. Kaprekar, a mathematician from India. The word "harshad" comes from the Sanskrit harṣa (joy) + da (give), meaning joy-giver. The term “Niven number” arose from a paper delivered by Ivan M. Niven at a conference on number theory in 1977. All integers between zero and n are n-harshad numbers.
The number 18 is a harshad number in base 10, because the sum of the digits 1 and 8 is 9 (1 + 8 = 9), and 18 is divisible by 9 (since 18/9 = 2, and 2 is a whole number).
Test Data
Input: base 10: Number 3
Output: 3 is a Niven Number
Input: base 10: Number 18
Output: 18 is a Niven Number
Input: base 10: Number 15
Output: 15 is not a Niven Number
Sample Solution:
C Code:
#include <stdio.h>
#include <string.h>
// Function to perform addition of two numbers represented as arrays
void add(char m[], char n[], int* m_len, int n_len) {
int i, k;
int j = 0;
// Addition of digits until the length of the shorter number
for (i = 0; i < *m_len && i < n_len; i++) {
k = m[i] + n[i] + j;
m[i] = k % 10;
j = k / 10;
}
// Continue addition for the remaining digits of the longer number
for (; i < *m_len; i++) {
k = m[i] + j;
m[i] = k % 10;
j = k / 10;
}
// If there's a carry after addition, update the length and carry the digit
for (; i < n_len; i++) {
k = n[i] + j;
m[i] = k % 10;
j = k / 10;
(*m_len)++;
}
// If there's still a carry after all additions, add the carry as a new digit
if (j) {
m[i] = j;
(*m_len)++;
}
}
// Function to perform multiplication of a number represented as an array by an integer
void mult(char n[], int m, int* len) {
int i, j, k;
j = 0;
// Multiply each digit of the number by 'm'
for (i = 0; i < *len; i++) {
k = n[i] * m + j;
j = k / 10;
n[i] = k % 10;
}
// If there's a carry after multiplication, extend the number length with the carry
for (; j; j /= 10) {
n[i] = j % 10;
(*len)++;
i++;
}
}
// Function to perform division of a number represented as an array by an integer
char div(char n[], int m, int len) {
int i, j;
j = 0;
// Perform division by taking each digit and calculating the remainder
for (i = len - 1; i >= 0; i--) {
j = j % m;
j *= 10;
j += n[i];
}
return j % m;
}
// Main function
int main() {
int base, d, i, j;
char num[4][1024];
int len[4];
// Input base and number, perform Niven number check
printf("Input the base and the number (separated by a space) (0 to exit):\n");
scanf("%d", &base);
// Continue until base is not 0
while (base) {
getchar();
scanf("%s", num[0]);
len[1] = strlen(num[0]);
d = 0;
// Reverse the input number and calculate its digit sum
for (i = 0; i < len[1]; i++) {
num[1][len[1] - 1 - i] = num[0][i] - '0';
d += num[1][len[1] - 1 - i];
num[0][i] = 0;
num[2][i] = 0;
}
num[0][0] = 1;
len[0] = 1;
len[2] = 1;
// Calculate the Niven number
for (i = 0; i < len[1]; i++) {
for (j = 0; j < len[0]; j++) {
num[3][j] = num[0][j];
}
len[3] = len[0];
mult(num[3], num[1][i], len + 3);
add(num[2], num[3], len + 2, len[3]);
mult(num[0], base, len);
}
// Check if it's a Niven number or not and display the result
if (div(num[2], d, len[2])) {
printf("It is not a Niven number.\n");
} else {
printf("It is a Niven number.\n");
}
// Input the base again to continue or exit
scanf("%d", &base);
}
return 0;
}
Sample Output:
Input the base and the number(separated by a space)(0 to exit): 10 3 0 It is a Niven number.
Flowchart:
![Flowchart: Check whether a given number with base b is a Niven number or not](https://www.w3resource.com/w3r_images/c-numbers-exercise-flowchart-38.png)
C Programming Code Editor:
Contribute your code and comments through Disqus.
Previous: Write a program in C to check if a number is Keith or not(with explanation).
Next: C String Exercises Home
What is the difficulty level of this exercise?
Test your Programming skills with w3resource's quiz.
- Weekly Trends and Language Statistics
- Weekly Trends and Language Statistics