Количество чисел в строке
Написать программу на c++ в с стиле с++ (не си) программу которая подсчитывает количество и цифры, и числа в строке. Я только знаю как подсчитывать цифры в строке, как написать что бы виделись так же и целочисленный числа?
#include #include using namespace std; int main() Лом Можно, с некоторыми оговорками, например, так:
#include #include #include using namespace std; int main() < string str; int s = 0; cout cout 0) < s = 0; long num; while (!iss.eof()) < iss >> num; s++; > > cout
Лом А если уж совсем по хардкорному, то так:
#include #include #include using namespace std; int main() < string str; cout cout
Лом Я тут еще подумал над задачкой и родился вариант более оптимальный, чем первый:
size_t d = 0, // количество цифр n = 0; // количество чисел bool in_digit = false; for (unsigned int i = 0; i < str.length(); i++) < if (isdigit(str[i])) < d++; if (!in_digit) < n++; in_digit = true; >> else < in_digit = false; >>
И проверил эти три реализации по скорострельности. Visual Studio 2017 Community.
Если компилить без оптимизации, самый бытрый — последний вариант, самый медленный — хардкорный.
Если компилить с оптимизацией, самый быстрый — последний вариант, самый медленный — первый.
Т.е. если запилить ручками, то все-таки быстрее получается, чем с использованием алгоритмов из STL.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Количество цифр
Время от времени перед программистом стает задача нахождения количества цифр в числе. Есть много способов решения этой задачи. В статье мы рассмотрим наиболее популярные из них.
Длина строки
Это очень простой вариант определения количества цифр, заключается в переводе числа в строковое представление с последующим определением длины строки.
public int CountDigitByString(int n) < return Math.Abs(n).ToString().Length; >
Такой метод компактный и интуитивно понятный, однако он сильно проигрывает в быстродействии другим вариантам.
Десятичный логарифм
Использование десятичного логарифма для определения количества цифр в числе, позволяет производить вычисление за линейное время.
public int CountDigitsByLog10(int n) < return (n == 0) ? 1 : (int)Math.Log10(Math.Abs(n)) + 1; >
Сравнение
Самый быстрый из приведенных методов.
private static readonly int[] Numbers = new [] < 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 >; public int CountDigitsByCompare(int n) < n = Math.Abs(n); for (var i = 0; i < Numbers.Length; i++) < if (n < Numbers[i]) < return i + 1; > > return 10; >
Деление нацело
С использованием цикла
public int CountDigitsByDiv(int n) < var count = (n == 0) ? 1 : 0; while (n != 0) < n /= 10; count++; > return count; >
Рекурсивно
public int CountDigitsByDivRecursive(int n) < return (n 9) ? 1 : CountDigitsByDivRecursive(n / 10) + 1; >
Разбивка числа на отдельные цифры
Разбив число на отдельные цифры, мы получаем возможность нахождения:
- количества цифр;
- количества четных и нечетных;
- количества различных(уникальных) цифр числа;
- суммы цифр числа.
public Listint> IntToDigit(int n) < n = Math.Abs(n); var digits = new Listint>(); while (n > 0) < int digit = n % 10; n /= 10; digits.Add(digit); > return digits; >
Количество четных
public int EvenCount(int n) < var digits = IntToDigit(n); var count = 0; foreach (var d in digits) < if (d % 2 == 0) < count++; >> return count; > //сокращенная форма записи с использованием Linq public int EvenCountLinq(int n) < return IntToDigit(n).Count(x => x % 2 == 0); >
Количество нечетных
public int OddCount(int n) < var digits = IntToDigit(n); var count = 0; foreach (var d in digits) < if (d % 2 != 0) < count++; >> return count; > public int OddCountLinq(int n) < return IntToDigit(n).Count(x => x % 2 != 0); >
Количество различных цифр в числе
public int CountUniqueDigits(int n) < var a = new int[9]; foreach (var d in IntToDigit(n)) < a[d]++; >var countUnique = 0; foreach (var x in a) < if (x > 0) < countUnique++; >> return countUnique; >
Сумма цифр числа
public int SumDigits(int n) < var sum = 0; foreach (var d in IntToDigit(n)) < sum += d; >return sum; > //использование Linq сокращает запись public int SumDigitsLinq(int n) < return IntToDigit(n).Sum(); >
Найти количество цифр в числе
уважаемые эксперты подскажите в чем проблема. начал изучать язык С и надо было переписать программу которая встречалась в паскале с использованием рекурсии. Переписал, а что то видимо не так сделал. вот два кода подскажите пожалуйста в чем ошибка
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 36 37
uses crt; var m:integer; n:longint; function schet(n:longint; var m:integer):integer; begin if n div 10 = 0 then begin inc(m); schet:=m; end else begin n:=n div 10; inc(m); schet:=schet(n,m); end; end; procedure input_data(var n:longint); begin writeln('Введите число:'); readln(n); end; procedure output_data(schet:integer); begin writeln('Количество цифр в введенном вами числе: ', schet); readkey; end; begin clrscr; writeln('Данная программа считает количество цифр в введенном пользователем числе.'); input_data(n); output_data(schet(n,m)); end.
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
#include #include int schet(int n, int m) { if((n%10)==0) { m++; schet==m; } else { n=n%10; m++; schet==schet(n,m); } return schet; }; void main() { clrscr(); int n,m; printf("Введите число: "); scanf("%d", &n); schet(n,m); printf("Количество цифр в введенном вами числе: %d", schet); getch(); }
Как вывести количество чисел в c
Напишите программу, которая выводит квадраты нечетных целых чисел от 1 до предела который вводит пользователь.
#include int main() < int n <>; // предельное наибольшее число std::cout > n; // вводим число for (int i ; i >
Пример работы программы:
Enter a limit: 7 1: 1 3: 9 5: 25 7: 49
Упражнение 2
Напишите программу, в которой в цикле do-while пользователь вводит по одному символу, а программа подсчитывает количество введенных символов. Когда пользователь вводит точку, ввод заканчивается, и программа выводит пользователю число введенных символов (не включая финальную точку)
#include int main() < unsigned count <>; char ch <>; do < std::cin >> ch; // считываем по одному символу ++count; // увеличиваем счетчик символов > while (ch != '.'); // повторяем ввод, пока не будет введена точка // исключаем точку из подсчета, уменьшая счетчик --count; std::cout
Пример работы программы:
world. Characters count: 5
Упражнение 3
Напишите программу, в которой в цикле while пользователь вводит произвольное количество чисел, а программа вычисляет их сумму. После каждого ввода спрашивайте пользователя, закончил ли он ввод чисел. Если пользователь ввел "y" или "Y", то ввод чисел завершается, после чего программа должна вывести сумму всех введенных чисел и их среднее арифметическое.
#include int main() < unsigned count <>; // количество введенных чисел int sum <>; // для хранения суммы чисел while (true) < std::cout > n; sum += n; // увеличиваем сумму на введенное число ++count; // увеличиваем счетчик введенных чисел char yesno <>; std::cout > yesno; if (yesno == 'y' || yesno == 'Y') break; // если ввели y или Y, выходим из цикла > // выводим сумму чисел std::cout (sum) / count)
Пример работы программы:
Enter a number: 1 Finish (y/n)? n Enter a number: 2 Finish (y/n)? n Enter a number: 3 Finish (y/n)? y sum: 6 average: 2