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

Задача "Три Буквы" - C++

Восстановить пароль Регистрация
 
Toshik_
1 / 1 / 0
Регистрация: 17.08.2013
Сообщений: 91
12.10.2013, 09:56     Задача "Три Буквы" #1
На доске в одну строку написано решение примера на сложение двух целых чисел. Cлева от знака равенства «=» записаны два целых числа, разделенных символом «+», справа записано целое число являющееся их суммой.
В записи равенства некоторые цифры от 1 до 9 заменили одной из трех букв — «A», «B» или «C». Каждая буква заменяет одинаковые цифры. Разные буквы соответствуют разным цифрам. Буквами могли заменить не все соответствующие им цифры.
Напишите программу, проводящую обратную замену букв на цифры, получающую верное равенство.
Входные данные:
Три строки, соответствующие первому и второму слагаемым и их сумме, содержащие цифры и символы «A», «B», «C». Длина каждой строки от 1 до 5 символов.
Гарантируется, что входные данные являются корректными.
Выходные данные:
В первой строке выводятся разделенные пробелами значения цифр, соответствующих символам «A», «B», «C» соответственно.
Во второй строке выводится строка, соответствующая восстановленной записи примера.
Если возможно несколько вариантов решения задачи, то выводится любой из них.
Верный ответ может отличаться от эталона.
Входные данные
A54C
C2A
ABB4
Выходные данные (вариант)
3
6
1
3541+123=3664
Помогите написать код! Сам алгоритм я знаю, реализацию не могу сделать
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.10.2013, 09:56     Задача "Три Буквы"
Посмотрите здесь:

C++ В текстовом файле заменить все лова начинающиеся с буквы "а" на первое место, которое начинается с буквы "с"
Ввести символьную строку и заменить все буквы "а" на буквы "б" и наоборот, как заглавные, так и строчные. C++
C++ Необработанное исключение в "0x76f015de" в "контрольная 1 задача 2.exe": 0xC0000005: Нарушение прав доступа при чтении "0x334e2c64"
C++ Определить количество слов, которые содержат ровно четыре буквы "о", "О"
Задача со строками (вывести слово, которое содержит ровно три буквы "и") C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
12.10.2013, 11:57     Задача "Три Буквы" #2
Toshik_, Ну это задачка на перебор. Ты должен перебрать все возможные числа для букв АBC, от допустим у тебя есть А = 3, B=7, C= 9. У тебя есть выражение 375+9=384 - его нужно найти, у тебя есть реальное выражение AB5+C=A84; Как это можно сделать определить АBC? Да все очень просто простым перебором.
просто в циклах перебирай все возможные комбинации и подставляй в выражение, когда выражение будет истинна то тогда ты нашол нужные значения для АB и C.

В принципе простая задачка.
D3fend0r
17 / 17 / 1
Регистрация: 14.09.2013
Сообщений: 37
12.10.2013, 13:59     Задача "Три Буквы" #3
Цитата Сообщение от Toshik_ Посмотреть сообщение
Помогите написать код! Сам алгоритм я знаю, реализацию не могу сделать
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
#include <iostream>
#include <vector>
#include <sstream>
 
using namespace std;
 
 
//////////////////////////////////////FUNCTIONS////////////////////////////////////////
int StringToNumber ( const string &Text );
bool Convert_Expr(string mem1,string mem2, string sum, char a, char b, char c);
int Convert(string &str, char a, char b, char c);// Convert a one member of the expression
void Find_Solution(string mem1,string mem2, string sum);
 
 
int StringToNumber ( const string &Text )//Text not by const reference so that the function can be used with a 
{                               //character array as argument
    stringstream ss(Text);
    int result;
    return ss >> result ? result : 0;
}
 
bool Convert_Expr(string mem1,string mem2, string sum, char a, char b, char c)
{
    int m1=Convert(mem1,a,b,c);
    int m2=Convert(mem2,a,b,c);
    int s=Convert(sum,a,b,c);
    return (m1+m2)==s;
}
 
int Convert(string &str, char a, char b, char c)
{
    for(int i=0;i<str.size();++i)
    {
        switch(str[i])
        {
        case 'A': str[i]=a; break;
        case 'B': str[i]=b; break;
        case 'C': str[i]=c; break;
        }
    }
    return StringToNumber(str);
}
 
 
void Find_Solution(string mem1,string mem2, string sum)
{
    for(int i=0;i<10;++i)
    {
        for(int j=0;j<10;++j)
        {
            if(i!=j)
            {
                for(int k=0;k<10;++k)
                {
                    if(k!=i && k!=j)
                    {
                        if(Convert_Expr(mem1,mem2,sum,'0'+i,'0'+j,'0'+k))
                        {                           
                            cout<<i<<endl<<j<<endl<<k<<endl;
                            cout<<Convert(mem1,'0'+i,'0'+j,'0'+k)<<" + "<<Convert(mem2,'0'+i,'0'+j,'0'+k)<<" = "<<Convert(sum,'0'+i,'0'+j,'0'+k)<<endl;
                            return;
                        }
                    }
                }
            }
        }
    }
}
 
int main()
{
    string mem1,mem2,sum;
    
    cout<<"Please enter a first summand"<<endl;
    cin>>mem1;
 
    cout<<"Please enter a second summand"<<endl;
    cin>>mem2;
 
    cout<<"Please enter a sum"<<endl;
    cin>>sum;
    cout<<endl<<endl;
    Find_Solution(mem1,mem2,sum);
    
    system("PAUSE");
}
Toshik_
1 / 1 / 0
Регистрация: 17.08.2013
Сообщений: 91
12.10.2013, 16:24  [ТС]     Задача "Три Буквы" #4
Цитата Сообщение от ninja2 Посмотреть сообщение
Toshik_, Ну это задачка на перебор. Ты должен перебрать все возможные числа для букв АBC, от допустим у тебя есть А = 3, B=7, C= 9. У тебя есть выражение 375+9=384 - его нужно найти, у тебя есть реальное выражение AB5+C=A84; Как это можно сделать определить АBC? Да все очень просто простым перебором.
просто в циклах перебирай все возможные комбинации и подставляй в выражение, когда выражение будет истинна то тогда ты нашол нужные значения для АB и C.

В принципе простая задачка.
Я бы и сделал методом перебора, но я не могу сделать так чтобы пользователь вводил данные, затем он находил где цифры а где буквы и перебирал....
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
12.10.2013, 17:33     Задача "Три Буквы" #5
Цитата Сообщение от Toshik_ Посмотреть сообщение
Я бы и сделал методом перебора, но я не могу сделать так чтобы пользователь вводил данные, затем он находил где цифры а где буквы и перебирал....
Можно как то так сделать:
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
#include <iostream>
#include <cstdlib>
#include <string>
#include <sstream>
#include <regex>;
using namespace::std;
 
int main()
{
    string s1="AB5+C=A84";
    cout <<"vvedite stroky (AB5+C=A84) ... ";
    getline(cin,s1);
 
    int A(10);
    int B(10);
    int C(10);
    string s;
    int flag(0);
    
    for(A=0;A<10&&flag==0;A++)
    {
        for(B=0;B<10&&flag==0;B++)
        {
            if(B==A)continue;
            for(C=0;C<10&&flag==0;C++)
            {
                if(C==A||C==B)continue;
                //Делаем подстановку цифр вместо букв
                s=s1;
                string sn; sn=char(A+'0');
                s=regex_replace(s,regex("A"),sn);
                sn=char(B+'0');
                s=regex_replace(s,regex("B"),sn);
                sn=char(C+'0');
                s=regex_replace(s,regex("C"),sn);
                
                //считаем выражение
                smatch sm;
                if(regex_search(s,sm,regex("^(\\d+).(\\d+)=(\\d+)$")))
                {
                    int one, two, three;
                    stringstream ss;
                    ss <<sm[1].str(); ss >>one; ss.clear();
                    ss <<sm[2].str(); ss >>two; ss.clear();
                    ss <<sm[3].str(); ss >>three; ss.clear();
                
                    if(one+two==three) flag=1;
                }
            }
        }
    }
    
    if(flag==1)
    {
        cout <<"s= "<<s<<endl;
        cout <<"A= "<<A<<" B= "<<B<<" C= "<<C<<endl;
    }
    else
        cout <<"not fined"<<endl;
 
    return 0;
}
Yandex
Объявления
12.10.2013, 17:33     Задача "Три Буквы"
Ответ Создать тему
Опции темы

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