Düzgün nömrə

Çətinlik səviyyəsi Ağır
Tez-tez soruşulur Amazon Facebook LinkedIn Kahin
Riyaziyyat SimBaxılıb 31

Ci Düzgün nömrə bir simli verdiyimiz problem, etibarlı bir onluq sayına təfsir edilə biləcəyini yoxlayın.

Verilən bir sətrin etibarlı bir onluq sayı kimi təfsir olunmasına diqqət yetirilməlidir. Aşağıdakı simvollardan ibarət olmalıdır:

  • Nömrələr 0-9
  • Göstərici - “e”
  • Müsbət / mənfi işarəsi - “+” / ”-“
  • Ondalık nöqtə - “.”

Bununla birlikdə, bu simvolların sırası və konteksti də giriş üçün əhəmiyyətlidir sim etibarlı bir onluq ədədi olmaq.

misal

Input:
0
 0.1 
abc
1 a
2e10
 -90e3   
 1e
e3
 6e-1
 99e2.5 
53.5e93
 --6 
-+3
95a54e53

Output:
Valid decimal number
Valid decimal number
Invalid decimal number
Invalid decimal number
Valid decimal number
Valid decimal number
Invalid decimal number
Invalid decimal number
Valid decimal number
Invalid decimal number
Valid decimal number
Invalid decimal number
Invalid decimal number
Invalid decimal number

Etibarlı nömrə üçün həll növləri

  1. Simli Qenerasiya
  2. Regex

Simli Qenerasiya

Yanaşma

Fikir, hər bir giriş simli simvolunu keçmək və aşağıdakı qaydalara riayət olunduğunu yoxlamaqdır.

  1. Sıradakı bütün aparıcı və arxadakı boşluqları atlayın.
  2. Bir sətir 'e' / 'E' dən ibarətdirsə, eksponent simvolu. Sonra giriş sətirini nəzərdən keçirin [exp1] E [exp2] olan iki fərqli hissəyə,
    • exp1, sətrin eksponent simvolundan əvvəl gələn hissəsidir.
    • exp2, sətrin eksponent simvolundan sonra gələn hissəsidir.
  3. exp1 ya tam, ya da ondalık rəqəm olmalıdır (məs: 124.12 -> ədədin ardınca nöqtə, nöqtə ardınca nömrə).
  4. exp2 bir tam olmalıdır.
  5. yalnız iki növ arifmetik işarəyə icazə verilir (bunlar '+' və '-') və ifadədə belə işarələr varsa, əvvəl qoyulmalıdır exp1 exp2.
  6. İfadə ardıcıl iki arifmetik simvoldan ibarət ola bilməz.
  7. Rəqəmlərdən, etibarlı hesab rəmzlərindən və ya eksponent simvoldan başqa hər hansı bir xarakter, giriş sətirində varsa, giriş sətri etibarlı bir onluq sayı kimi qəbul edilə bilməz.
  8. əgər sətir eksponent simvoldan ibarət deyilsə, onda yalnız 1,6 və 7 şərtlərini nəzərə al.

1-7-dəki bütün qaydalar təmin edilərsə, giriş sətiri etibarlı bir ifadə kimi yozula bilər.

Həyata keçirilməsi

Düzgün Sayı üçün C ++ Proqramı
#include <iostream>
#include <bits/stdc++.h>
using namespace std;

bool isSpace(char c){ return c==' ';}       // check if given character is space
bool isSign(char c){ return c=='+'||c=='-';} // check if given character is valid sign
bool isDot(char c){ return c=='.';}         // check if given character is dot
bool isNum(char c){ return c<='9'&&c>='0';} // check if given character is valid number
bool isE(char c){ return c=='e'||c=='E';}   // check if given character is exponential sign

bool isNumber(string num)
{
    int i = 0;
    int length = num.length();
    
    bool hasNum = false;

    // Skip all the prefix spaces
    while (i<length && isSpace(num[i])) i++;

    // Check the next char if it's a +/- sign
    if (i<length && isSign(num[i])) i++;

    // Characters exceeding the sign should be a set of numbers
    while (i<length && isNum(num[i]) ) {hasNum = true; i++;}

    // After processing the number part, a dot('.') appears
    if (i<length && isDot(num[i])) i++;

    // Check the numbers after a dot '.'
    while (i<length && isNum(num[i])) {hasNum = true; i++;}

    // Check the 'e' / 'E'
    if (hasNum && i<length && isE(num[i])) 
    {
        hasNum = false; i++;
        // skip the sign after e/E
        if (i<length && isSign(num[i])) i++;
    }

    // Check the numbers after 'e' / 'E' and sign
    while (i<length && isNum(num[i])) {hasNum = true; i++;}

    // Skip all the trailing spaces
    while (i<length && isSpace(num[i])) i++;

    /* After processing the main decimal number and trailing spaces, 
    if more Characters are left then the number is not Valid or
    if the string doesn't consist of numbers*/
    return i == length && hasNum;
}

int main()
{
    int n = 14;
    string num;
    
    while(n--)
    {
        /* input should accept a string with whitespaces */
        getline(cin,num);
        if(isNumber(num))
        cout<<"Valid decimal number"<<endl;
        else
        cout<<"Invalid decimal number"<<endl;
    }
    
    return 0;
}
0
 0.1 
abc
1 a
2e10
 -90e3   
 1e
e3
 6e-1
 99e2.5 
53.5e93
 --6 
-+3
95a54e53
Valid decimal number
Valid decimal number
Invalid decimal number
Invalid decimal number
Valid decimal number
Valid decimal number
Invalid decimal number
Invalid decimal number
Valid decimal number
Invalid decimal number
Valid decimal number
Invalid decimal number
Invalid decimal number
Invalid decimal number
Düzgün Sayı üçün Java Proqramı
import java.util.*;
import java.lang.*;
import java.io.*;


class TutorialCup
{
    static boolean isSpace(char c){ return c==' ';}       // check if given character is space
    static boolean isSign(char c){ return c=='+'||c=='-';} // check if given character is valid sign
    static boolean isDot(char c){ return c=='.';}         // check if given character is dot
    static boolean isNum(char c){ return c<='9'&&c>='0';} // check if given character is valid number
    static boolean isE(char c){ return c=='e'||c=='E';}   // check if given character is exponential sign
  
  static boolean isNumber(String num)
    {
        int i = 0;
        int length = num.length();
        
        boolean hasNum = false;
    
        // Skip all the prefix spaces
        while (i<length && isSpace(num.charAt(i))) i++;
    
        // Check the next char if it's a +/- sign
        if (i<length && isSign(num.charAt(i))) i++;
    
        // Characters exceeding the sign should be a set of numbers
        while (i<length && isNum(num.charAt(i))) {hasNum = true; i++;}
    
        // After processing the number part, a dot('.') appears
        if (i<length && isDot(num.charAt(i))) i++;
    
        // Check the numbers after a dot '.'
        while (i<length && isNum(num.charAt(i))) {hasNum = true; i++;}
    
        // Check the 'e' / 'E'
        if (hasNum && i<length && isE(num.charAt(i))) 
        {
            hasNum = false; i++;
            // skip the sign after e/E
            if (i<length && isSign(num.charAt(i))) i++;
        }
    
        // Check the numbers after 'e' / 'E' and sign
        while (i<length && isNum(num.charAt(i))) {hasNum = true; i++;}
    
        // Skip all the trailing spaces
        while (i<length && isSpace(num.charAt(i))) i++;
    
        /* After processing the main decimal number and trailing spaces, 
        if more Characters are left then the number is not Valid or
        if the string doesn't consist of numbers*/
        return i == length && hasNum;
    }
  
  public static void main (String[] args) throws java.lang.Exception
  {
    int n = 14;
        String num;
        
        Scanner sc = new Scanner(System.in);
        while(n-- > 0)
        {
            /* input should accept a string with whitespaces */
            num = sc.nextLine();
            if(isNumber(num))
            System.out.println("Valid decimal number");
            else
            System.out.println("Invalid decimal number");
        }
  }
}
0
 0.1 
abc
1 a
2e10
 -90e3   
 1e
e3
 6e-1
 99e2.5 
53.5e93
 --6 
-+3
95a54e53
Valid decimal number
Valid decimal number
Invalid decimal number
Invalid decimal number
Valid decimal number
Valid decimal number
Invalid decimal number
Invalid decimal number
Valid decimal number
Invalid decimal number
Valid decimal number
Invalid decimal number
Invalid decimal number
Invalid decimal number

Mürəkkəblik təhlili

  1. Zamanın mürəkkəbliyi: T (n) = O (n), n = giriş sətrinin uzunluğu.
  2. Kosmik Mürəkkəblik: A (n) = O (1)

Regex

Yanaşma

Etibarlı ondalık rəqəm sətri, sətir işləmə hissəsinin yaxınlaşma hissəsində müzakirə olunduğu kimi etibarlı simvolların sabit bir nümunəsinə malikdir. Buna görə a regex etibarlı ondalık sətir üçün və giriş sətri ilə uyğunlaşdıraraq giriş sətirinin ondalık sayı kimi etibarlılığını yoxlayın.

Həyata keçirilməsi

Java Proqramı
import java.util.*;
import java.lang.*;
import java.io.*;

class TutorialCup
{
  static boolean isNumber(String num)
    {
        // trim the leading and trailing spaces and match the input string with a predefined regex
        return num.trim().matches("[+-]?(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?");
    }
  
  public static void main (String[] args) throws java.lang.Exception
  {
    int n = 14;
        String num;
        
        Scanner sc = new Scanner(System.in);
        while(n-- > 0)
        {
            /* input should accept a string with whitespaces */
            num = sc.nextLine();
            if(isNumber(num))
            System.out.println("Valid decimal number");
            else
            System.out.println("Invalid decimal number");
        }
  }
}
0
 0.1 
abc
1 a
2e10
 -90e3   
 1e
e3
 6e-1
 99e2.5 
53.5e93
 --6 
-+3
95a54e53
Valid decimal number
Valid decimal number
Invalid decimal number
Invalid decimal number
Valid decimal number
Valid decimal number
Invalid decimal number
Invalid decimal number
Valid decimal number
Invalid decimal number
Valid decimal number
Invalid decimal number
Invalid decimal number
Invalid decimal number

Mürəkkəblik təhlili

  1. Zamanın mürəkkəbliyi: T (n) = O (n), n = giriş sətrinin uzunluğu.
  2. Kosmik Mürəkkəblik: A (n) = O (1)

References

Translate »