Форум программистов, компьютерный форум CyberForum.ru

Создание числа из разрядности (простейший способ) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
4ance
1 / 1 / 0
Регистрация: 02.11.2010
Сообщений: 78
02.11.2010, 20:46     Создание числа из разрядности (простейший способ) #1
Здравствуйте. Имеется задача. Элементарная, на циклы\ветвления:
Определите, сколько слагаемых надо взять в сумме 1+2+3..., чтобы получить m - значное число, состоящее из одинаковых цифр. Тесты и результаты: 1) m = 2. n = 10; Число 55. n = 11; Число 66. 2) m = 3. n = 36; Число 666.
Решил её не полностью, если вводимое - число х, искомое - параметры m и n (не учёл идентичность цифр в числе):

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
36
37
38
39
40
// EqualNumbers.cpp : Определите, сколько слагаемых надо взять в сумме 1+2+3..., чтобы получить m - значное число, состоящее из одинаковых цифр
// Тесты и результаты: 1) m = 2. n = 10; Число 55. n = 11; Число 66. 2) m = 3. n = 36; Число 666.
 
#include "stdafx.h"
#include <conio.h>
#include <locale.h>
 
int x, y; //x - число (вводится)
int m=0, n=0, s; // s - сумма членов
 
int _tmain(int argc, _TCHAR* argv[])
{
  setlocale(LC_ALL, "russian" );  
  // Вывод информации о программе
  printf("Программа вычисления числа n суммы 1+2+3... m-значного числа, состоящего из одинаковых цифр\n");
  printf("Введите целое число для определения искомых параметров m и n\n");
  scanf("%d",&x);
  // выделим дополнительную ячейку памяти для введённого числа, тк будем использовать его в 2х циклах
  y = x;
  // Превый цикл while считает количеств цифр в числе
  while (x !=0)
  {
      m++;
      x /=10;
  }
 
  //Второй цикл while считается сумму s членов n прогресси до тех пор пока сумма s не превзойдёт число x 
  while (s < y)
  {
      n++;
      s += n;
  }
 
  // Вывод результата
  printf("\n\nКоличество шагов в последовательности n = %d", n);
  printf("\n\nЧисло цифр в числе m = %d", m);
  printf("\n\nНажмите любую клавишу\n");
  _getch();
  return 0;
}
Да и в принципе решал её вообще неправильно, так как вводимым - должна быть разрядность числа m, а число шагов прогрессии n и само число x - искомым. Не пойму, как начинать решение - по искомому m надо задавать if (цифры числа идентичны) { считать число шагов n}? Так же алгоритм собирания числа из идентичных цифр - не могу допетрить, хотя обратный - посчитать количество цифр в числе - легок - остаток от деления на 10. Поможите, а?)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.11.2010, 20:46     Создание числа из разрядности (простейший способ)
Посмотрите здесь:

C++ определение разрядности
C++ Простейший алгоритм перевода числа из 10 системы счисления в 16 ричную систему счисления
Программа ждет ввода числа и в зависимости от количества цифр в числе выдает сообщение об их разрядности: трехзначное, пятизначное и т.д C++
C++ Рекурсивная функция вычисления разрядности числа в двоичном виде
Увеличение разрядности C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
02.11.2010, 21:21     Создание числа из разрядности (простейший способ) #2
4ance, это арифметическая прогрессия
Sn = n*(n+1) / 2;

Добавлено через 16 минут
а вводится толлько количество разрядов и все?
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
02.11.2010, 22:27     Создание числа из разрядности (простейший способ) #3
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
36
37
38
#include <iostream>
#include <sstream>
#include <сmath>
 
std::string toString(int val){
    std::ostringstream oss;
    oss<< val;
    return oss.str();
}
 
bool bitequal(std::string str){
    for (int i = 1; i < str.size(); ++i)
        if (str[i-1] != str[i]) return false;
    return true;
}
 
 
 
int main()
{
    int x = 0;
    std::cout << "Enter Number ";
    std::cin >> x;
 
    if (!bitequal(toString(x))){
        std::cout << "Bits different";
        return EXIT_FAILURE;
    }
 
    int n = toString(x).size(); //разрядность
    std::cout << std::endl << "Count Bits = " << n << std::endl;
 
    int d = 1+(-4)*(-(x+x));
    int sh = pow(static_cast<float>(d),0.5); //определяем количество слагаемых
    std::cout << std::endl << "Count step = " << sh / 2;  //RESULT
 
    return 0;
}
и почти без циклов получилось
Миниатюры
Создание числа из разрядности (простейший способ)  
4ance
1 / 1 / 0
Регистрация: 02.11.2010
Сообщений: 78
03.11.2010, 09:36  [ТС]     Создание числа из разрядности (простейший способ) #4
Цитата Сообщение от PointsEqual Посмотреть сообщение
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
36
37
38
#include <iostream>
#include <sstream>
#include <сmath>
 
std::string toString(int val){
    std::ostringstream oss;
    oss<< val;
    return oss.str();
}
 
bool bitequal(std::string str){
    for (int i = 1; i < str.size(); ++i)
        if (str[i-1] != str[i]) return false;
    return true;
}
 
 
 
int main()
{
    int x = 0;
    std::cout << "Enter Number ";
    std::cin >> x;
 
    if (!bitequal(toString(x))){
        std::cout << "Bits different";
        return EXIT_FAILURE;
    }
 
    int n = toString(x).size(); //разрядность
    std::cout << std::endl << "Count Bits = " << n << std::endl;
 
    int d = 1+(-4)*(-(x+x));
    int sh = pow(static_cast<float>(d),0.5); //определяем количество слагаемых
    std::cout << std::endl << "Count step = " << sh / 2;  //RESULT
 
    return 0;
}
и почти без циклов получилось
Благодарен за помощь, но данное решение я всё равно буду переделывать (программу я сделаю своим способом, мне бы что из чего должно выходить понять) , тк сейчас наша тема - циклы, до функций и процедур ещё далеко, то бишь задача легко решается одними ветвлениями с циклами(только вчера была первая пара по программированию на C++, до этого - только паскаль в школе). int n = toString(x).size(); int sh = pow(static_cast<float>(d),0.5) - используют библиотеку <sstream>, судя по всему... я просто не могу это понять сейчас)
Ну и в программе вводимое - х - число, а вводить надо только разрядность m, а число x и колво шагов n - получаешь на выходе, с количеством шагов я разобрался, а простой способ для получения числа из разрядности - так и не нашёл.
Теперь по поводу Sn = n*(n+1) / 2 - выдирание первой цифры из массива числа?
Насчёт <iostream> библиотеки - cin и cout мне говорили менее функциональны нежели printf и scanf...
Почему её везде используют?
isaak
101 / 38 / 9
Регистрация: 17.10.2010
Сообщений: 634
03.11.2010, 12:16     Создание числа из разрядности (простейший способ) #5
Подскажите пожалуйста как будет выглядеть код на VS 2008, то у меня компилятор ругается:
Error 1 fatal error C1083: Cannot open include file: 'сmath': No such file or directory c:\users\администратор\documents\visual studio 2008\projects\c++\console\p647\p647\p647.cpp 3 p647
Заранее огромное спасибо
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
03.11.2010, 12:38     Создание числа из разрядности (простейший способ) #6
Цитата Сообщение от isaak Посмотреть сообщение
сmath'
попробуй заменить на
C++
1
math.h
Добавлено через 14 минут
Цитата Сообщение от 4ance Посмотреть сообщение
простой способ для получения числа из разрядности - так и не нашёл.
val - разрядность

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void nnu(int val){
    int tmp = 1;
    for (int i = 0; i < val-1; ++i)
        tmp *= 10;
    int bits = tmp;
 
 
    for (int i = 1; i < 10; ++i){
        int k = 0;
        int res = bits*i;
        for (int j = 1; j < val; ++j){
            tmp /=10;
            res += (tmp * i);
        }
        cout<<res<<" ";
        tmp = bits;
    }
}
функция выдаст все числа с одинаковыми цифрами, разрядности val
isaak
101 / 38 / 9
Регистрация: 17.10.2010
Сообщений: 634
03.11.2010, 12:42     Создание числа из разрядности (простейший способ) #7
PointsEqual заменил как вы написали <cmath> на <math.h> теперь ругается:

Warning 1 warning C4018: '<' : signed/unsigned mismatch c:\users\администратор\documents\visual studio 2008\projects\c++\console\p647\p647\p647.cpp 12 p647
Error 2 error C2666: 'pow' : 6 overloads have similar conversions c:\users\администратор\documents\visual studio 2008\projects\c++\console\p647\p647\p647.cpp 34 p647

PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
03.11.2010, 12:45     Создание числа из разрядности (простейший способ) #8
Цитата Сообщение от isaak Посмотреть сообщение
Error 2 error C2666: 'pow' : 6 overloads have similar conversions c:\users\администратор\documents\visual studio 2008\projects\c++\console\p647\p647\p647.cpp 34 p647

C++
1
int sh = pow(static_cast<float>(d),0.5);
замените на
C++
1
int sh = pow(static_cast<double>(d),0.5);
isaak
101 / 38 / 9
Регистрация: 17.10.2010
Сообщений: 634
03.11.2010, 12:54     Создание числа из разрядности (простейший способ) #9
Огромное спасибо PointsEqual очень помогли
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2010, 14:03     Создание числа из разрядности (простейший способ)
Еще ссылки по теме:

Такой способ создание экземпляра класса хорошо или плохо? C++
простейший синтаксический анализатор(Распознавание числа) C++
C++ Будет ли работать такой способ получения псевдослучайного числа?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4ance
1 / 1 / 0
Регистрация: 02.11.2010
Сообщений: 78
03.11.2010, 14:03  [ТС]     Создание числа из разрядности (простейший способ) #10
Цитата Сообщение от PointsEqual Посмотреть сообщение
val - разрядность

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void nnu(int val){
    int tmp = 1;
    for (int i = 0; i < val-1; ++i)
        tmp *= 10;
    int bits = tmp;
 
 
    for (int i = 1; i < 10; ++i){
        int k = 0;
        int res = bits*i;
        for (int j = 1; j < val; ++j){
            tmp /=10;
            res += (tmp * i);
        }
        cout<<res<<" ";
        tmp = bits;
    }
}
функция выдаст все числа с одинаковыми цифрами, разрядности val
Какие красивые строчки! Задача решена, хоть и не я её сделал) Остается надеяться, что я не в каждой задаче окажусь беспомощен!
Yandex
Объявления
03.11.2010, 14:03     Создание числа из разрядности (простейший способ)
Ответ Создать тему
Опции темы

Текущее время: 04:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru