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

Ошибка в программе! - C++

Восстановить пароль Регистрация
 
diana92
4 / 4 / 1
Регистрация: 25.10.2009
Сообщений: 36
27.11.2009, 22:32     Ошибка в программе! #1
найти минимальное положительное целое число Q такое, что произведение цифр числа Q в точности равняется N.
Выведите целое число Q. Если такого числа не существует, выведите −1.
Прогу я написала, тока никак не получается сделать так, чтоб еслиб Q не сущ выводило бы -1
Пожалуйста помогите

вот код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# include <iostream>
using namespace std;
int main ()
{
    int N;
    cin>>N;
    int Q,z,m;
    for (Q=0;Q<1000l;Q++)
    {
        z=Q%10;
        m=Q/10;
        if(z*m==N)
        {
            cout<<Q;
            break;
        }
        else
            continue;
    }
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2009, 22:32     Ошибка в программе!
Посмотрите здесь:

Ошибка в программе C++
C++ ошибка в программе
Ошибка в программе C++
C++ Ошибка в программе
C++ Ошибка в программе
ошибка в программе C++
ошибка в программе C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
RazorQ
 Аватар для RazorQ
576 / 343 / 9
Регистрация: 06.02.2009
Сообщений: 1,386
27.11.2009, 23:03     Ошибка в программе! #2
как вариант, можно не выводить число сразу, а сохранять в массив. Потом оценивать и выводить нужное (-1 или Q)
manfeese
 Аватар для manfeese
128 / 127 / 16
Регистрация: 04.01.2009
Сообщений: 415
28.11.2009, 01:12     Ошибка в программе! #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
#include <iostream>
#include <conio.h>
 
using namespace std;
 
int GetProz(int N)
{
 int s=0;
 
Next:
 int k=0;
 for (int i = 2; i<10 ; i++)
   if ((N%i)==0) {  k = i; break; }
 
 if (!k) return -1;
 
 s+=k;
  if (N/k>=10)
   {
    N/=k;
    s*=10;
    goto Next;
   }
 else return s*10+N/k;
}
 
 
int main ()
{
        int N;
        cin>>N;
        cout<<GetProz(N);
 
        getch();
        return 0;
}
Добавлено через 1 час 38 минут
Сам свою функцию решил исправить, а то немного не то возвращала!
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
int GetProz(int N)
{
 int s[10],res=0, index=0,k;
 
Next:
 k=0;
 for (int i = 9; i>=2 ; i--)
   if ((N%i)==0) {  k = i; break; }
 
 if (!k) return -1;
 
 s[index++]=k;
 if ((N/=k)>=10) goto Next;
 else s[index]=N;
 
 for (int i=0; i<=index-1; i++)
  for (int j=i; j<=index; j++)
    if (s[j]>s[j+1])
    {
     s[j]^=s[j+1];
     s[j+1]^=s[j];
     s[j]^=s[j+1];
    }
 
 for (int i=0; i<=index; i++ , res*=10) res+=s[i];
 res/=10;
 return res;
}
Том Ардер
Модератор
 Аватар для Том Ардер
3642 / 2261 / 274
Регистрация: 15.06.2009
Сообщений: 3,972
28.11.2009, 01:33     Ошибка в программе! #4
Логика вывода результата примерно такая:
если число существует
вывести Q
иначе
вывести (-1)
Т.е. решение должно установить значение некоторой булевской переменной.

Алгоритм получается такой:

Ввести N
Сущ = ложь
Для каждого Q в заданном интервале значений И пока Сущ = ложь
Определить цифры
Вычислить произведение цифр
Сравнить это произведение и 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
#include <iostream>
using namespace std;
 
void Digits(int q);
int MultiplyDigits();
 
int main()
{
    bool    bExists = false;
    int     Q = 1,
            QMax = 10001;  // чтобы цикл когда-нибудь закончился
    int     N;
 
    cout << "Input N: ";
    cin >> N;
 
    while( Q < QMax && !bExists )
    {
        Digits( Q );  // определить цифры аргумента
 
        int md = MultiplyDigits();  // перемножить найденные цифры
 
        bExists = (md == N);
 
        Q++;
    }
 
    if( bExists )
    {
        cout << "Solution = " << Q;
    }
    else
    {
        cout << -1;
    }
 
    return 0;
}
Реализация двух функции, разбирающих число на цифры и вычисляющих произведение этих цифр, предлагается читателям в качестве упражнения
(На форуме уже столько раз решали эту задачу - определить цифры числа)

В исходной программе серьёзная ошибка - в строках 10-12 неправильно находятся цифры числа, если оно из 3-х и более цифр.
manfeese
 Аватар для manfeese
128 / 127 / 16
Регистрация: 04.01.2009
Сообщений: 415
28.11.2009, 01:57     Ошибка в программе! #5
По-моему в данном случае алгоритм методом перебора не самый эффективный! Так как, при большом N, получаемая комбинация будет значительно больше N. К примеру числу 15000 будут соответствовать такое 355558.

Проще само число N разложить на множители (каждый не более 10) начиная "сверху", а затем отсортировать полученную последовательность по возрастанию! Вот вам и результат!

Добавлено через 2 минуты
Выкладываю полность рабочую прогу, а то были еще ошибки
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
#include <iostream>
#include <conio.h>
 
using namespace std;
 
int GetProz(int N)
{
 int s[10],res=0, index=0,k;
 
Next:
 k=0;
 for (int i = 9; i>=2 ; i--)
   if ((N%i)==0) {  k = i; break; }
 
 if (!k) return -1;
 
 s[index++]=k;
 if ((N/=k)>=10) goto Next;
 else s[index]=N;
 
 for (int i=0; i<=index; i++)
  for (int j=0; j<=index-1; j++)
        if (s[j]>s[j+1])
        {
         s[j]^=s[j+1];
         s[j+1]^=s[j];
         s[j]^=s[j+1];
        }
 
 for (int i=0; i<=index; i++ , res*=10) res+=s[i];
 res/=10;
 return res;
}
 
int main ()
{
    int N;
    cin>>N;
    cout<<GetProz(N);
    getch();
    return 0;
}
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
28.11.2009, 06:49     Ошибка в программе! #6
Выкладываю тоже свой код. Алгоритм основан, на том что:
если N раскладывать на простые множители, и окажется что один из простых множителей больше 9 (т.е. не является однозначным), то решений не будет. Поэтому раскладываем число N на множители, начиная с 2 и до 9 (отражено при выводе значений):
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 <iostream.h>
#include <conio.h>
 
int main ()
{
        int n, i, s[10], index=0;
        bool fl=false;
        cin>>n;
        while(!fl && n>9)
        {
            for(i=9;i>1 && n>9 ;i-- )
                if(n%i==0)
                {
                    s[index]=i;
                    index++;
                    n/=i;
                }
            if(i==1)
                fl=true;
        }
        if(fl)
            cout<<"-1";
        else
        {
            s[index]=n;
            for(i=index; i>=0; i--)
                cout<<s[i];
        }
        cout<<endl;
        return 0;
}
manfeese
 Аватар для manfeese
128 / 127 / 16
Регистрация: 04.01.2009
Сообщений: 415
28.11.2009, 15:40     Ошибка в программе! #7
valeriikozlov, походу мы мыслим одинаково.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
28.11.2009, 15:59     Ошибка в программе! #8
manfeese, точно
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2009, 18:04     Ошибка в программе!
Еще ссылки по теме:

C++ Ошибка в программе
Ошибка в программе C++
C++ Ошибка в программе
Ошибка в программе C++
C++ Ошибка в программе

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

Или воспользуйтесь поиском по форуму:
manfeese
 Аватар для manfeese
128 / 127 / 16
Регистрация: 04.01.2009
Сообщений: 415
28.11.2009, 18:04     Ошибка в программе! #9
И еще более упрощенный вариант функции!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int GetProz(int N)
{
 int s[10],res=0, index=0,k;
 
Next:
 k=0;
 for (int i = 9; i>=2 ; i--)
   if ((N%i)==0) {  k = i; break; }
 
 if (!k) return -1;
 
 s[index++]=k;
 if ((N/=k)>=10) goto Next;
 else s[index]=N;
 
 for (int i=index; i>=0; i-- , res*=10) res+=s[i];
 return res/10;
}
Yandex
Объявления
28.11.2009, 18:04     Ошибка в программе!
Ответ Создать тему
Опции темы

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