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

Конвертация числа в строку и обратно, условие исключения, разность. - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Строка http://www.cyberforum.ru/cpp-beginners/thread190095.html
Столкнулся с проблемой: заменить все латинские буквы на *. как же задать в ифе (если итый элемент есть в буквах-исключениях) s='*'; как это сделать, кроме s=A || s=B || s=C......
C++ Почему на экран выводится цифры в формате с E (4.34e)? Добрый день! Есть следующая функция #include <iostream> using namespace std; double* test(char *A){ char ch_year ; char ch_month ; http://www.cyberforum.ru/cpp-beginners/thread190092.html
Как создать динамический массив размерностью m на n? C++
подскажите, а то я только n на n создавать умею)
не могу сделать лабораторки по инфе на языке C++ C++
помогите не получаются лабы по инфе!!! Посмотрите кто может помочь я 8 вариант! просто сроки поджимают а надо сдать 7 лабораторок по инфе!!! студент 1 курса Прикрепляйте файлы к сообщениям.
C++ Лабораторная работа по С++.Не поняла циклы http://www.cyberforum.ru/cpp-beginners/thread190066.html
дана последовательность n из вещественных чисел. Определить, образуют ли они возрастающую последовательность?
C++ Перевод числа из 10 с.с. в 8 с.с. не пойму как создать программу по переводу числа из 10 с.с. в 8 с.с. . Дали несколько задач на расчётно-графическую работу,а учитель толком не объясняет,хотя дата сдачи - через неделю. подробнее

Показать сообщение отдельно
Напильнег
480 / 120 / 10
Регистрация: 30.09.2010
Сообщений: 473
17.11.2010, 22:33     Конвертация числа в строку и обратно, условие исключения, разность.
Цитата Сообщение от norge_goth Посмотреть сообщение
было бы неплохо замерить скорость выполнения и компиляции моего и вашего кода, у кого какие идеи как это сделать(компилятор mingw)?
Зачем замерять скорость компиляции, представить не могу, а скорость работы... Нашел я таки способ загрузить серого даже на современном компьютере, вот так (Visual C++):
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#include "stdafx.h"
 
#include <stdio.h>
#include <windows.h>
 
int count_for_k_Etalon00(int k)
{
  int count=0;
  
  int a, b, c, d;
  int diff;
 
  for (a=1; a<10; a++)
    for (b=1; b<10; b++)
      for (c=1; c<10; c++)
        for (d=1; d<10; d++)
          if ((b!=a)&&(c!=a)&&(c!=b)&&(d!=a)&&(d!=b)&&(d!=c)) {
            diff=(((a*10+b)*10+c)*10+d)-(((d*10+c)*10+b)*10+a);
            if (diff==k) {
              //printf("%d%d%d%d\n", a, b, c, d);
              count++;    
            }
          }
 
  return count;
}
 
int count_for_k_norge_goth00(int k)
{
    int count=0;
 
    int a, b, c, d; // число позиции 4-го числа abcd
    int num, rev_num;
    int difference;
    char line[5];
 
    difference=k;
 
    for (a = 1; a <= 9; ++a)
        for (b = 1; b <= 9; ++b) {
            if (b == a) continue;
 
            for (c = 1; c <= 9; ++c) {
                if (c == b || c == a) continue;
 
                for (d = 1; d <= 9; ++d) {
                    if (d == c || d == b || d == a) continue;
                    {
                            // вычисляем основное число
                            sprintf(line, "%d%d%d%d", a, b, c, d);
                            sscanf(line, "%d", &num);
 
                            // вычисляем обратное число
                            sprintf(line, "%d%d%d%d", d, c, b, a);
                            sscanf(line, "%d", &rev_num);
 
                            if ((num - rev_num) == difference) {
                                count++;  
                            }
                    }
                }
            }
        }
 
    return count;
}
 
int count_for_k_Napilneg00(int k)
{
  int count=0;
  
  int num, rev_num; 
  int a, b, c, d;
 
  num=rev_num=0;
  for (a=1; a<10; a++) {
    num+=1000; rev_num+=1;
    {;} {
      for (b=1; b<10; b++) {
        num+=100; rev_num+=10;
        if ((b!=a)) {
          for (c=1; c<10; c++) {
            num+=10; rev_num+=100;
            if ((c!=a)&&(c!=b)) {
              for (d=1; d<10; d++) {
                num+=1; rev_num+=1000;
                if ((d!=a)&&(d!=b)&&(d!=c)) {
                  if (rev_num==(num-k)) count++;
                }
              }
              num-=9; rev_num-=9000;
            }
          }
          num-=90; rev_num-=900;
        }
      }
      num-=900; rev_num-=90;
    }
  }
  num-=9000; rev_num-=9;
 
  return count;
}
 
int main()
{
  char s[128];
 
  int c4k[10000];
  int k;
 
  int start, end;
 
//Filling by etalon values
  for (k=0; k<10000; k++) {
    c4k[k]=count_for_k_Etalon00(k);
  }
 
//Strictly testing
  for (int nfunc=0; nfunc<=2; nfunc++) {
    int (*f)(int);
 
    switch (nfunc) {
      case 0: 
        printf("%20s: ", "Etalon00");
        f=&count_for_k_Etalon00;
        break;
      case 1: 
        printf("%20s: ", "norge_goth00");
        f=&count_for_k_norge_goth00;
        break;
      case 2: 
        printf("%20s: ", "Napilneg00");
        f=&count_for_k_Napilneg00;
        break;
      default:
        printf("Error func num\n");
        goto quit;
    }
  
    start=GetTickCount();
  
    for (k=0; k<10000; k++) {
      if ((*f)(k)!=c4k[k]) {
        printf("error for k=%d\n", k);
        goto next;
      }
    }
 
    end=GetTickCount();
          
    printf("%.3f sec\n", (end-start)/1000.0);
 
  next:
    ;
  }
 
quit:
  gets(s);
  
  return 0;
}
В качестве эталона для сравнения взята самая тупая реализация, в которой все проверки и подсчеты происходят во внутреннем цикле, причем считаются числа с помощью умножений по схеме Горнера. Вот результат (надо заметить - ошеломляющий):
C++
1
2
3
            Etalon00: 0.953 sec
        norge_goth00: 214.172 sec
          Napilneg00: 0.515 sec
Итаг, код любителя делать замечания по поводу оформления кода в полной ж..., что в общем-то было предсказуемо, хоть и не до такой степени. Мой код, правда, не дает ожидаемого принципиального выигрыша, но у него есть резерв повышения эффективности, поработаем еще.
 
Текущее время: 18:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru