Как найти трехзначные числа в массиве

Помогите пожалуйста. У меня имеется массив из чисел от 0 до 1000.Как найти трехзначное число на паскале?

AntonioK's user avatar

AntonioK

3,17920 серебряных знаков43 бронзовых знака

задан 17 апр 2014 в 7:44

ЕкатеринаКораблева's user avatar

  • Делаем цикл по всему массиву чисел
  • Проверяем внутри каждого цикла, оно трехзначное или нет.

Чтобы проверить оно трехзначное или нет, надо чтобы оно было от 100 до 999, т.е. проверить чтобы оно было больше и равно 100 и меньше и равно 999.

ответ дан 17 апр 2014 в 8:29

IVsevolod's user avatar

IVsevolodIVsevolod

6,7144 золотых знака26 серебряных знаков51 бронзовый знак

3 / 3 / 2

Регистрация: 10.09.2013

Сообщений: 210

1

Найти в символьном массиве трёхзначные числа

15.06.2014, 17:32. Показов 4559. Ответов 17


Студворк — интернет-сервис помощи студентам

Дали задание на практике.
В нём надо прочесть из файла символьный массив и найти количество трёхзначных чисел в нём. Если количество нечётно – вывести на экран массив в обратном порядке.
И в этом нахождении трёхзначных чисел основная проблема: я даже не представляю, как это делать. Нам такое не читали, а задание дали.

Кто-нибудь, хоть подайте идею, как это сделать.

Заранее спасибо



0



150 / 137 / 35

Регистрация: 29.07.2012

Сообщений: 709

15.06.2014, 17:38

2

Строка в файле: ыва афы а 214 павыф п 234 аы875аф

Действие 1: Разбейте строку на слова
Действие 2: Создайте процедуру проверки каждого слова, в C++ есть такие функции как isDigit.
Действие 3: Далее уже нужные вам условия(подсчет, и т.п)



0



cooller

571 / 539 / 280

Регистрация: 25.12.2013

Сообщений: 1,456

15.06.2014, 17:39

3

Монтгомери, вот метод, которой проверяет является ли число трехзначным

C++
1
2
3
4
5
6
7
8
9
bool check_number(int number)
{
    size_t count(0);
    while(number!=0){
        number/=10;
        count++;
    }
    return count == 3;
}

но перед этим разбейте строку на слова, и если слово является числом, проверяйте



0



2761 / 1915 / 569

Регистрация: 05.06.2014

Сообщений: 5,571

15.06.2014, 17:56

4

Монтгомери, вот метод, которой проверяет является ли число трехзначным

bool check_number(int number){return number>=100&&number<=999;}
Впрочем, ТС надо было текст анализировать.

Кто-нибудь, хоть подайте идею, как это сделать.

Универсальный ответ на вопрос “как что-то найти и/или заменить в тексте” – регулярные выражения. Теперь и в стандартной библиотеке!



0



3 / 3 / 2

Регистрация: 10.09.2013

Сообщений: 210

15.06.2014, 18:11

 [ТС]

5

Т.е. только разбивать на слова? В если входной массив выглядит, к примеру, так: fasd224a54dasd5764s ? На этот случай есть варианты?
Я пробовал посимвольно проверять, но что-то фантазия у меня буксовала, и я так и не придумал, как это осуществить.

Тогда следующий вопрос: как разделить строку на слова?

Добавлено через 14 минут
Я нашёл только strtok, но массив идёт “сплошняком”, без каких-либо разделителей, так что strtok не подошёл.



0



cooller

571 / 539 / 280

Регистрация: 25.12.2013

Сообщений: 1,456

15.06.2014, 18:16

6

Монтгомери, вот пример, программа разбивает строку на слова

C++
1
2
3
4
5
6
7
8
9
10
#include<iostream>
#include<string>
#include<sstream>
int main()
{
    std::string str= "word1 word2",word;
    std::stringstream s(str);
    while(s>>word)
        std::cout<<word<<"n";
}



0



3 / 3 / 2

Регистрация: 10.09.2013

Сообщений: 210

15.06.2014, 18:21

 [ТС]

7

Эмм… А можете объяснить, как это работает?



0



2761 / 1915 / 569

Регистрация: 05.06.2014

Сообщений: 5,571

15.06.2014, 18:21

8

В если входной массив выглядит, к примеру, так: fasd224a54dasd5764s ?

Найти все последовательности символов удовлетворяющие следующим условиям:
1) Начало последовательности совпадает с началом массива ИЛИ последовательности предшествует символ не являющийся цифрой.
2) Последовательность включает в себя три цифры.
3) Конец последовательности совпадает с концом массива ИЛИ за последовательностью идет символ не являющийся цифрой.

Дальше сами справитесь? И выучите регулярные выражения. Тогда ответ выше будет очевиден.



0



3 / 3 / 2

Регистрация: 10.09.2013

Сообщений: 210

15.06.2014, 18:34

 [ТС]

9

Я впервые услышал о регулярных выражениях сейчас от вас. А типы char и string нам вообще дали в духе “есть такие вот зверушки”, но что с ними делать так и не сказали. И тут вдруг практика с заданиями, которые мы и не могли решить, используя прочитанный нам на лекциях материал.
Нам давали только массивы, циклы и функции. И работать я умею только с арифметичесими типами.

Так что я до сих пор не представляю, что надо делать дальше -_- Те три условия понятны, но как их реализовать я всё ещё не понимаю.



0



Croessmah

Неэпический

17811 / 10583 / 2043

Регистрация: 27.09.2012

Сообщений: 26,622

Записей в блоге: 1

15.06.2014, 18:41

10

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>
#include <cctype>
 
 
bool is_digit ( char x )
{
   return isdigit ( x ) ;
}
bool is_not_digit ( char x )
{
   return !isdigit ( x ) ;
}
 
 
int main ( )
{
   std::string str = "fasd224a54dasd5764s" ;
   std::vector < std::string > vec ;
   for (
        std::string::const_iterator it = std::find_if(str.begin(),str.end(),is_digit) ,
        itEnd = str.end() ;
        it != itEnd ;
        it = std::find_if(it,itEnd,is_digit)
       ) {
      std::string::const_iterator itTemp = std::find_if(it,itEnd, is_not_digit ) ;
     if ( std::distance (it,itTemp) == 3 )
         vec.push_back(std::string(it,itTemp)) ;
      it=itTemp ;
   }
   for ( std::vector < std::string >::const_iterator it = vec.begin() , itEnd = vec.end() ; it!=itEnd ; ++it )
      std::cout << *it << std::endl ;
}



0



2761 / 1915 / 569

Регистрация: 05.06.2014

Сообщений: 5,571

15.06.2014, 18:45

11

Нам давали только массивы, циклы и функции. И работать я умею только с арифметичесими типами.

char и есть арифметический тип со знаком. Символы идут в том же порядке как и в алфавите (‘a’+1==’b’). Проверка того что символ – цифра осуществляется предельно тупо – C>=’0’&&C<=’9′.



1



Монтгомери

3 / 3 / 2

Регистрация: 10.09.2013

Сообщений: 210

15.06.2014, 19:26

 [ТС]

12

А такой вариант будет работать?:

C++
1
2
3
4
5
6
7
8
9
10
11
char *s; 
int three-digit_numbers /*кол-во трёхзначных чисел*/, snum /*сумма цифр числа*/ 
// ввод массива 
for(i=0;/*сюда надо узнать размерность массива*/;i++) 
{if(s[i]>='1'&&s[i]<='9') //находим цифру, с неё начинаем проверять 
while(s[i]>='0'&&s[i]<='9') 
{snum++; i++;}; 
/* i++ чтобы переходить на следующий виток внутреннего цикла, 
а потом, во внешнем цикле, пропустить все элементы, проверенные во внутреннем */ 
if(snum==3) three-digit_numbers++; 
snum=0;}



0



Renji

2761 / 1915 / 569

Регистрация: 05.06.2014

Сообщений: 5,571

15.06.2014, 19:39

13

Не

C++
1
2
while(s[i]>='0'&&s[i]<='9') 
{snum++; i++;};

а

C++
1
2
for(;s[i]>='0'&&s[i]<='9'&&i<размер_массива;++i)
    ++snum;

Плюс three-digit_numbers и snum использованы без инициализации. В остальном должно работать.



1



3 / 3 / 2

Регистрация: 10.09.2013

Сообщений: 210

15.06.2014, 21:17

 [ТС]

14

А, точно, совсем забыл про размерность массива. Спасибо.
А вот почему преинкремент? Определение я помню, но почему здесь именно они, а не постинкремент?



0



2761 / 1915 / 569

Регистрация: 05.06.2014

Сообщений: 5,571

15.06.2014, 21:28

15

Постинкремент увеличивает значение переменной (одна ячейка памяти) и возвращает ее изначальное значение (вторая ячейка памяти). Преинкремент увеличивает переменную и возвращает ее новое значение (одна ячейка памяти). То есть, логически работает чуточку проще.

После того как компилятор выполнит оптимизацию разницы скорее всего не будет никакой, так что замена выполнена чисто для психологического комфорта.



1



3 / 3 / 2

Регистрация: 10.09.2013

Сообщений: 210

15.06.2014, 22:05

 [ТС]

16

И снова благодарю



0



221 / 166 / 47

Регистрация: 17.07.2012

Сообщений: 587

16.06.2014, 09:21

17

Цитата
Сообщение от Renji
Посмотреть сообщение

for(;s[i]>=’0’&&s[i]<=’9’&&i<размер_массива;++i)
* * ++snum;

кстати это же неверно по-моему!
надо условие выхода за границу ставить вперед, до проверки “на цифру”.



0



2761 / 1915 / 569

Регистрация: 05.06.2014

Сообщений: 5,571

16.06.2014, 13:31

18

Да, действительно, косяк.



0



Improve Article

Save Article

Like Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    Like Article

    Given an array containing digits[], where each element is a single digit integer. The array may contain duplicates. The task is to find all the unique integers that follow the given requirements:

    • The integer consists of the concatenation of three elements from digits in any arbitrary order.
    • The integer does not have leading zeros.

    Examples:

    Input: digits[] = {2, 1, 3, 0}
    Output: {102, 103, 120, 123, 130, 132, 201, 203, 210, 213, 230, 231, 301, 302, 310, 312, 320, 321}
    Explanation: The above are the three digit numbers formed.  

    Input: digits[] = {3, 7, 5}
    Output: [357, 375, 537, 573, 735, 753 ]

    Approach: This problem can be solved by using Frequency Map. Find count of all elements in given digits array. Follow the steps below to solve the given problem.

    • Check for all numbers between 100 to 999 whether they can be formed by the digits present in the digits vector.
    • Use 2 maps for the same. If the number can be made, then add it to the answer.
    • In the end, return the answer.

    Below is the implementation of the above approach:

    C++

    #include <bits/stdc++.h>

    using namespace std;

    vector<int> find3DigitNumbers(vector<int>&

                                      digits)

    {

        vector<int> count(10, 0);

        for (auto& d : digits)

            count[d]++;

        vector<int> res;

        for (int num = 100; num < 999; num++) {

            vector<int> currCount(10, 0);

            int temp = num;

            while (temp) {

                currCount[temp % 10]++;

                temp /= 10;

            }

            bool flag = true;

            for (int i = 0; i < 10; i++) {

                if (currCount[i] > count[i]) {

                    flag = false;

                    break;

                }

            }

            if (flag) {

                res.push_back(num);

            }

        }

        return res;

    }

    void printAnswer(vector<int>& v1)

    {

        for (int i = 0; i < v1.size(); i++) {

            cout << v1[i] << " ";

        }

        cout << endl;

    }

    int main()

    {

        vector<int> v1 = { 2, 1, 3, 0 };

        vector<int> ans = find3DigitNumbers(v1);

        printAnswer(ans);

        return 0;

    }

    Java

    import java.io.*;

    import java.lang.*;

    import java.util.*;

    class GFG {

      static void find3DigitNumbers(int digits[], List<Integer> res)

      {

        int count[] = new int[10];;

        for (int i = 0; i < digits.length; i++)

          count[digits[i]]++;

        for (int num = 100; num < 999; num++) {

          int currCount[] = new int[10];

          int temp = num;

          while (temp > 0) {

            currCount[temp % 10]++;

            temp /= 10;

          }

          Boolean flag = true;

          for (int i = 0; i < 10; i++) {

            if (currCount[i] > count[i]) {

              flag = false;

              break;

            }

          }

          if (flag == true) {

            res.add(num);

          }

        }

      }

      static void printAnswer(List<Integer> res)

      {

        for(int i = 0;  i < res.size(); i++)

          System.out.print(res.get(i) + " ");

      }

      public static void main (String[] args)

      {

        int arr[] = { 2, 1, 3, 0 };

        List<Integer> ans=new ArrayList<Integer>();

        find3DigitNumbers(arr, ans);

        printAnswer(ans);

      }

    }

    Python3

    def find3DigitNumbers(digits):

        count = [0] * 10

        for d in digits:

            count[d] += 1

        res = []

        for num in range(100, 999):

            currCount = [0] * 10

            temp = num

            while (temp):

                currCount[temp % 10] += 1

                temp = temp // 10

            flag = True

            for i in range(10):

                if (currCount[i] > count[i]):

                    flag = False

                    break

            if (flag):

                res.append(num)

        return res

    def printAnswer(v1):

        for i in range(len(v1)):

            print(v1[i], end=" ")

        print('')

    v1 = [2, 1, 3, 0]

    ans = find3DigitNumbers(v1)

    printAnswer(ans)

    C#

    using System;

    using System.Collections;

    class GFG {

      static void find3DigitNumbers(int []digits, ArrayList res)

      {

        int []count = new int[10];;

        for (int i = 0; i < digits.Length; i++)

          count[digits[i]]++;

        for (int num = 100; num < 999; num++) {

          int []currCount = new int[10];

          int temp = num;

          while (temp > 0) {

            currCount[temp % 10]++;

            temp /= 10;

          }

          bool flag = true;

          for (int i = 0; i < 10; i++) {

            if (currCount[i] > count[i]) {

              flag = false;

              break;

            }

          }

          if (flag == true) {

            res.Add(num);

          }

        }

      }

      static void printAnswer(ArrayList res)

      {

        for(int i = 0;  i < res.Count; i++)

          Console.Write(res[i] + " ");

      }

      public static void Main ()

      {

        int []arr = { 2, 1, 3, 0 };

        ArrayList ans=new ArrayList();

        find3DigitNumbers(arr, ans);

        printAnswer(ans);

      }

    }

    Javascript

    <script>

           function find3DigitNumbers(

               digits) {

               let count = new Array(10).fill(0);

               for (let d of digits)

                   count[d]++;

               let res = [];

               for (let num = 100; num < 999; num++) {

                   let currCount = new Array(10).fill(0);

                   let temp = num;

                   while (temp) {

                       currCount[temp % 10]++;

                       temp = Math.floor(temp / 10);

                   }

                   let flag = true;

                   for (let i = 0; i < 10; i++) {

                       if (currCount[i] > count[i]) {

                           flag = false;

                           break;

                       }

                   }

                   if (flag) {

                       res.push(num);

                   }

               }

               return res;

           }

           function printAnswer(v1) {

               for (let i = 0; i < v1.length; i++) {

                   document.write(v1[i] + " ");

               }

               document.write('<br>')

           }

           let v1 = [2, 1, 3, 0];

           let ans = find3DigitNumbers(v1);

           printAnswer(ans);

       </script>

    Output

    102 103 120 123 130 132 201 203 210 213 230 231 301 302 310 312 320 321 

     
     Time Complexity: O(N)
    Auxiliary Space: O(N) 

    Last Updated :
    10 Aug, 2022

    Like Article

    Save Article

    Привет. Программа компилируется, но не работает предполагаю, что возможно массив также генерируется не так, как должен.
    Задается динамический массив из N элементов и заполняется случайными числами. Отсортировать и найти максимальное трехзначное число, сумма цифр которого равна введенному числу k. Числа в массиве от 0 до 100000.

    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    
    //Функция по суммированию чисел
    int SumDigits ( int L )
     
    {
     
    int d, sum = 0;
    while ( L != 0 )
     
      {
     
      d = L % 10;
      sum = sum + d;
      L = L / 10;
     
      }
     
    return sum;
     
    }
     
    int main()
    {
    float *mass, tmp;
    float k, s, max, res=0;
    int i, j, N;
     
    printf("Zadayte chislo kn");
    scanf("%lg",&k);
    printf("Zadayte kolichestvo elementov massivan");
    scanf("%d", &N);
     
    mass = (float*)malloc(N*sizeof(float));
    //резервируем память под массив
     
    for (i = 0; i< N; i++)
    {
     
        mass [i] = rand ()%100001;
    }
    //заполняем массив случайными числами от 0 до 100 000
    
    //<-сортировка
     
    for(i=0;i<N;i++)
    {
        for(j=i;j<N;j++)
            {
                if(mass[i]>mass[j])
                    {
                        tmp=mass[i];
                        mass[i]=mass[j];
                        mass[j]=tmp;
                    }
            }
    }
    
    for(i=0;i<N;i++)
    {
        if((mass[i]>=100 || mass[i]<=999) && SumDigits(mass[i])==k)
        {
               res++;
        
     //       //res - переменная, в которой запоминаем было ли вообще число, подходящее под условие
              max=mass[i];    
      //        //запоминаем последнее число
        }
    }
    
    printf("Your result is %d", max);
    printf("Vsego ih bilo %d", res);
       getch();
       free(mass);
       return 0;
    }

    Поиск трёхзначных чисел в массиве чисел

    Автор вопроса: ЕкатеринаКораблева

    Помогите пожалуйста. У меня имеется массив из чисел от 0 до 1000.Как найти трехзначное число на паскале?

    Источник

    Ответы (1 шт):

    Автор решения: IVsevolod

    • Делаем цикл по всему массиву чисел
    • Проверяем внутри каждого цикла, оно трехзначное или нет.

    Чтобы проверить оно трехзначное или нет, надо чтобы оно было от 100 до 999, т.е. проверить чтобы оно было больше и равно 100 и меньше и равно 999.

    → Ссылка

    Добавить комментарий