Check whether an array of strings can correspond to a particular number X
Last Updated :
01 Nov, 2023
Given an integer X and an array of strings str which represents numbers in any base ranging from [2, 36], the task is to check whether all the strings can be converted into X by assigning each string the desired base from 2 to 36, such that decimal base equivalent of the string is X.
Examples:
Input: str = {10000, 20, 16}, X = 16
Output: Yes
Explanation:
Every number in array is equal to 16 when converted to Decimal base, if following bases are selected:
(10000)2 = (16)10
(20)8 = (16)10
(16)10 = (16)10
Input: str = {10100, 5A, 1011010}, X = 90
Output: Yes
Every number in array is equal to 90 when converted to Decimal base, if following bases are selected:
(10100)3 = (90)10
(5A)16 = (90)10
(1011010)2 = (90)10
Approach: The idea is to convert every number of the array into decimal-base by assigning it to a base from 2 to 36 and then check for each of the converted numbers that it is equal to X or not.
The step-by-step algorithm for the above approach is described below –
- Initialize the count to 0 for checking the count of numbers those are equal to X when converted.
- Run a loop to iterate over the numbers of the array and then for each of the numbers –
- Run another loop from 2 to 36 to assign base to the number and find the decimal equivalent of the number.
- If the decimal equivalent of the number is equal to X, then increment the count by 1 and break the loop for not assigning any other base to the same number.
- If the count of the numbers that are convertible to X is equal to the length of the array, then the array can correspond to the number X.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int val( char c)
{
if (c >= '0' && c <= '9' )
return ( int )c - '0' ;
else
return ( int )c - 'A' + 10;
}
int toDeci(string str, int base)
{
int len = str.size();
int power = 1;
int num = 0;
int i;
for (i = len - 1; i >= 0; i--) {
if (val(str[i]) >= base) {
return -1;
}
num += val(str[i]) * power;
power = power * base;
}
return num;
}
void checkCorrespond(vector<string> str,
int x){
int counter = 0;
int n = str.size();
for ( int i = 0; i < n; i++) {
for ( int j = 2; j <= 36; j++) {
if (toDeci(str[i], j) == x) {
counter++;
break ;
}
}
}
if (counter == n)
cout << "YES"
<< "\n" ;
else
cout << "NO"
<< "\n" ;
}
int main()
{
int x = 16;
vector<string> str =
{ "10000" , "20" , "16" };
checkCorrespond(str, x);
return 0;
}
|
Java
class GFG{
static int val( char c)
{
if (c >= '0' && c <= '9' )
return ( int )c - '0' ;
else
return ( int )c - 'A' + 10 ;
}
static int toDeci(String str, int base)
{
int len = str.length();
int power = 1 ;
int num = 0 ;
int i;
for (i = len - 1 ; i >= 0 ; i--) {
if (val(str.charAt(i)) >= base) {
return - 1 ;
}
num += val(str.charAt(i)) * power;
power = power * base;
}
return num;
}
static void checkCorrespond(String[] str,
int x){
int counter = 0 ;
int n = str.length;
for ( int i = 0 ; i < n; i++) {
for ( int j = 2 ; j <= 36 ; j++) {
if (toDeci(str[i], j) == x) {
counter++;
break ;
}
}
}
if (counter == n)
System.out.print( "YES"
+ "\n" );
else
System.out.print( "NO"
+ "\n" );
}
public static void main(String[] args)
{
int x = 16 ;
String[] str =
{ "10000" , "20" , "16" };
checkCorrespond(str, x);
}
}
|
Python3
def val(c):
if (c > = '0' and c < = '9' ):
return int (c)
else :
return c - 'A' + 10
def toDeci(strr, base):
lenn = len (strr)
power = 1
num = 0
for i in range (lenn - 1 , - 1 , - 1 ):
if (val(strr[i]) > = base):
return - 1
num + = val(strr[i]) * power
power = power * base
return num
def checkCorrespond(strr, x):
counter = 0
n = len (strr)
for i in range (n):
for j in range ( 2 , 37 ):
if (toDeci(strr[i], j) = = x):
counter + = 1
break
if (counter = = n):
print ( "YES" )
else :
print ( "NO" )
x = 16
strr = [ "10000" , "20" , "16" ]
checkCorrespond(strr, x)
|
C#
using System;
class GFG{
static int val( char c)
{
if (c >= '0' && c <= '9' )
return ( int )c - '0' ;
else
return ( int )c - 'A' + 10;
}
static int toDeci(String str, int Base)
{
int len = str.Length;
int power = 1;
int num = 0;
int i;
for (i = len - 1; i >= 0; i--) {
if (val(str[i]) >= Base) {
return -1;
}
num += val(str[i]) * power;
power = power * Base;
}
return num;
}
static void checkCorrespond(String[] str,
int x){
int counter = 0;
int n = str.Length;
for ( int i = 0; i < n; i++) {
for ( int j = 2; j <= 36; j++) {
if (toDeci(str[i], j) == x) {
counter++;
break ;
}
}
}
if (counter == n)
Console.Write( "YES"
+ "\n" );
else
Console.Write( "NO"
+ "\n" );
}
public static void Main(String[] args)
{
int x = 16;
String[] str =
{ "10000" , "20" , "16" };
checkCorrespond(str, x);
}
}
|
Javascript
<script>
function val(c)
{
if (c >= '0' && c <= '9' )
return c - '0' ;
else
return c - 'A' + 10;
}
function toDeci(str, base)
{
let len = str.length;
let power = 1;
let num = 0;
let i;
for (i = len - 1; i >= 0; i--) {
if (val(str[i]) >= base) {
return -1;
}
num += val(str[i]) * power;
power = power * base;
}
return num;
}
function checkCorrespond(str, x){
let counter = 0;
let n = str.length;
for (let i = 0; i < n; i++) {
for (let j = 2; j <= 36; j++) {
if (toDeci(str[i], j) == x) {
counter++;
break ;
}
}
}
if (counter == n)
document.write( "YES"
+ "<br/>" );
else
document.write( "NO"
+ "<br/>" );
}
let x = 16;
let str =
[ "10000" , "20" , "16" ];
checkCorrespond(str, x);
</script>
|
Performance Analysis:
- Time Complexity: O(N).
- Auxiliary Space: O(1).
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...