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

Найти длину такого первого идентификатора в строку, в котором произведение всех четных цифр максимально - C++

Восстановить пароль Регистрация
 
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
23.08.2011, 16:15     Найти длину такого первого идентификатора в строку, в котором произведение всех четных цифр максимально #1
решите плиз кому не трудно очень нужно...
Задана последовательность идентификаторов, разделенных сериями пробелов. Последовательность задана строкой символов (string) заканчивается символом ‘*’.
2.Найти длину такого первого идентификатора в котором произведение всех четных цифр максимально.

 Комментарий модератора 
Именуйте темы осмысленно! Название темы должно максимально полно отражать её содержимое.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2011, 16:15     Найти длину такого первого идентификатора в строку, в котором произведение всех четных цифр максимально
Посмотрите здесь:

C++ Найти число последовательности, у которого количество одинаковых цифр максимально
C++ Найти произведение четных цифр этого числа. Верно ли, что число содержит данную цифру А более двух раз
C++ Найти числа из интервала от 1 до N-1, для которых произведение всех цифр совпадает с суммой
Посчитать произведение цифр десятичной записи первого числа, кратного 3 C++
C++ Найти число на отрезке [x;y], произведение цифр которого максимально
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
23.08.2011, 17:58     Найти длину такого первого идентификатора в строку, в котором произведение всех четных цифр максимально #2
приведи пример файла, что в нём?
nameless
Эксперт C++
 Аватар для nameless
289 / 288 / 14
Регистрация: 16.06.2009
Сообщений: 486
23.08.2011, 18:04     Найти длину такого первого идентификатора в строку, в котором произведение всех четных цифр максимально #3
lexflax, фиг его знает, если правильно тебя понял, то примерно так:

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <algorithm>
#include <numeric>
#include <vector>
#include <boost/algorithm/string/split.hpp>
#include <boost/algorithm/string/classification.hpp>
 
struct Multiply {
private:
   std::size_t index;
   
public:
   Multiply() : index(1) {  }
   int operator()(int number_one, int number_two) {
      if (!(index++ % 2)) {
         return number_one * number_two;
      } 
      
      return number_one;
   }
};
 
struct Generate {
private:
   std::string::const_iterator p;
 
public:
   Generate(std::string::const_iterator ptr) : p(ptr) {  }
   int operator()() {
      return (*p++ - '0');
   }
};
 
int main() {
   std::string str_numbers = "23434   87568576 1234    3435414 24257   43435 123864872365000*";
   std::vector <std::string> v_str;
   int max_number = 0;
   std::string res;
   
   boost::split(v_str, str_numbers, boost::is_any_of(" *"), boost::token_compress_on);
   
   std::for_each(v_str.begin(), v_str.end(), [&max_number, &res](const std::string& str) {
      std::vector <int> v_nums(str.size());
      std::generate(v_nums.begin(), v_nums.end(), Generate(str.begin()));
      int number = std::accumulate(v_nums.begin(), v_nums.end(), 1, Multiply());
      if (number > max_number) {
         max_number = number;
         res = str;
      }
   } );
   
   std::cout << res.size() << std::endl;
 
   return 0;
}
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
23.08.2011, 18:51     Найти длину такого первого идентификатора в строку, в котором произведение всех четных цифр максимально #4
Немного проще:
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
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <sstream>
#include <iterator>
 
typedef long long  T_num;
 
T_num  mul_even_digs(T_num n){
  T_num  res = 1;
  for(; n; n /= 10)
    if( !((n % 10) % 2) )
      res *= n % 10;
  return res;
}
 
int main(){
  std::string str("23434   87568576 1234    3435414 24257   43435 1238648723690*");
  std::istringstream ist(str);
  std::istream_iterator<T_num> bg(ist), fn;
  std::vector <T_num> nums(bg, fn);
  std::cout << floor(log10(*std::max_element(nums.begin(), nums.end(), [](T_num a, T_num b) -> bool{
    return mul_even_digs(a) < mul_even_digs(b);
  })) + 1);
  return 0;
}
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
24.08.2011, 00:14     Найти длину такого первого идентификатора в строку, в котором произведение всех четных цифр максимально #5
Вот вариант, без вектора стринга.
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
#include <string.h>
#include <stdio.h>
 
int n_length(const char* str) {
   int len, ch;
   for(len = 1; *str; *str++) {
         if(!((ch = *str - 0x30)%2))
              len *= ch;
   }
   return len;
}
 
int  main(void) {
     char str[]      = "2111 132822 45679 44443 88 742229*";
 
     char  buf[32] = { '\0' }, *tok;
     int   imax   = 0, tmp;
 
     for(tok = strtok(str, " *"); tok; tok = strtok(NULL, " *")) {
             tmp = n_length(tok);
             if(tmp > imax) {
                     imax = tmp;
                     strncpy(buf, tok, strlen(tok) + 1u);
            }
     }
     if( *buf ) 
          printf("ID: %s\n", buf);
 
     getchar();
     return 0;
}
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
24.08.2011, 12:31     Найти длину такого первого идентификатора в строку, в котором произведение всех четных цифр максимально #6
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
#include <stdio.h>
 
#define is_digit(val) ((((val) >= '0') && ((val) <= '9')) ? 1 : 0)
 
unsigned long get_tok_sum(char *_in, char** point, const char stop_sym) {
    unsigned long res = 1;
    char *p = _in;
 
    if( 0 == _in ) return res;
 
    while( *p != stop_sym && !is_digit(*p) ) p++;
 
    while( is_digit(*p) ) {
        if( ++s % 2 == 0 )
            res *= (*p - '0');
        p++;
    }
    *point = p;
    return res;
}
 
int main() {
 
    char str[]      = "2111 132822 45679 44443 88 999999*";
    char *p = str;
    unsigned long max = 0;
    unsigned long tmp = 0;
    
 
    while( *p != '*' ) {
        tmp = get_tok_sum(p, &p, '*');
        max = max > tmp ? max : tmp;
    }
 
    printf("%u\n", max);
    return 0;
}
или так:
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
#include <stdio.h>
 
#define is_digit(val) ((((val) >= '0') && ((val) <= '9')) ? 1 : 0)
 
unsigned long get_max_tok(char *_in, const char stop_sym) {
    unsigned long res = 0;
    unsigned long new_res = 0;
    char *p = _in;
 
    if( 0 == _in || *_in == stop_sym ) return res;
 
    while( *p != stop_sym && !is_digit(*p) ) p++;
 
    while( is_digit(*p) ) {
        res += (*p - '0');
        p++;
    }
    new_res = get_max_tok(p, stop_sym);
    return (res > new_res) ? res : new_res;
}
 
int main() {
 
    char str[]      = "2111 132822 99999999 45679 44443 88 999999 435234 3456 3546 3546 3456 34563 456 3456 *";
    char *p = str;
 
    printf("%u\n", get_max_tok(p, '*'));
    return 0;
}
Добавлено через 11 минут
а, не заметил в условии про четные цифры и произведение
тогда просто добавить:
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
#include <stdio.h>
 
#define is_digit(val) ((((val) >= '0') && ((val) <= '9')) ? 1 : 0)
 
unsigned long get_max_tok(char *_in, const char stop_sym) {
    unsigned long res = 1;
    unsigned long new_res = 0;
    unsigned long s = 0;
    char *p = _in;
 
    if( 0 == _in || *_in == stop_sym ) return res;
 
    while( *p != stop_sym && !is_digit(*p) ) p++;
 
    while( is_digit(*p) ) {
        if( ++s % 2 == 0 )
            res *= (*p - '0');
        p++;
    }
    new_res = get_max_tok(p, stop_sym);
    return (res > new_res) ? res : new_res;
}
 
int main() {
 
    char str[]      = "15151515 999999*";
    char *p = str;
 
    printf("%u\n", get_max_tok(p, '*'));
    return 0;
}
в первый вариант так же переделать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.09.2011, 15:31     Найти длину такого первого идентификатора в строку, в котором произведение всех четных цифр максимально
Еще ссылки по теме:

C++ Найти сумму и произведение всех четных элементов в массиве
C++ Найти сумму и произведение всех четных элементов массива
C++ Найти максимально длинную строку

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

Или воспользуйтесь поиском по форуму:
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
04.09.2011, 15:31  [ТС]     Найти длину такого первого идентификатора в строку, в котором произведение всех четных цифр максимально #7
nameless,Задана последовательность идентификаторов, разделенных сериями пробелов. Последовательность задана строкой символов (string) заканчивается символом ‘*’.
2.Найти длину такого первого идентификатора в котором произведение всех четных цифр максимально. А можно тоже задание но попроще описать? вот что такое индентификатор в моей задаче? я думал это буква но тогда причем тут произведение цифр? откуда тогда цифры возмутся
Yandex
Объявления
04.09.2011, 15:31     Найти длину такого первого идентификатора в строку, в котором произведение всех четных цифр максимально
Ответ Создать тему
Опции темы

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