Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 17 kết quả

Đề tài: bài toán thử : send+more=money. Giúp mình

  1. #1
    Ngày gia nhập
    03 2009
    Bài viết
    16

    Mặc định bài toán thử : send+more=money. Giúp mình

    Bạn nào có cách lập trình hay cho bài này không ? SEND + MORE = MONEY
    Mỗi chữ tương ứng với một số khác nhau
    tìm các số tương ứng với các chữ cái đó. Giải bình thường thì dễ ko có gì đáng nói nhưng lập trình bài này thì sao đây ?

  2. #2
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,007

    thật ra bài toán này rất đơn giản,
    Cái mà mọi người hay sai lầm nhất lại là ở chỗ bước 1 của việc giải quyết vấn đề : tìm hiểu chính xác yêu cầu,
    gặp bài này ta nên đơn giản hóa vấn đề đi, sẽ thấy ngay.
    Vì muộn rồi nên langman xin phép trình bày luôn : chúng ta sẽ demo đơn giản như sau
    PHP Code:
    #include <iostream>
    using namespace std;

    void main()
    {
        
    int s,e,n,d,m,o,r,y;
        for(
    s=1;s<10;s++)
            for(
    e=0;e<10;e++)
                for(
    n=0;n<10;n++)
                    for(
    d=0;d<10;d++)
                        for(
    m=1;m<10;m++)
                            for(
    o=0;o<10;o++)
                                for(
    r=0;r<10;r++)
                                    for(
    y=0;y<10;y++)
                                        if (
    s*1000+e*100+n*10++m*100+o*100+r*10+e==m*10000+o*1000+n*100+10*e+y)
                                            
    cout<<..... // viet cac gia tri do ra

    Đã được chỉnh sửa lần cuối bởi langman : 17-03-2010 lúc 02:41 AM.
    ^_,^

    Facebook : https://www.facebook.com/langmaninternet

    Bùi Tấn Quang

  3. #3
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Bổ sung tí : langman "mò" 100 triệu trường hợp, giống y như ý tưởng của mình. Nhưng bạn quên mất loại bỏ những trường hợp các biến bằng nhau ( vì đề bài yêu cầu là mỗi ký tự là một chữ số khác nhau mà ). Nếu bộ nhớ lớn thì nên lưu kết quả "mò" ra rồi sau đó filter lại, đừng kiểm tra trong vòng for vì sẽ làm chi phí tăng lên đáng kể.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  4. #4
    Ngày gia nhập
    12 2009
    Bài viết
    190

    PHP Code:
    #include <iostream>
    #include <conio.h>
    using namespace std;

    int bonChuSo int aint bint cint d )
    {
        return 
    1000 100 10 d;
    }

    int namChuSo int aint bint cint dint e )
    {
        return 
    10000 1000 100 10 e;
    }

    bool trung int sint eint nint dint mint oint rint y )
    {
        
    int a[8];
        
    int ij;
        
        
    a[0] = s;    a[4] = m;
        
    a[1] = e;    a[5] = o;
        
    a[2] = n;    a[6] = r;
        
    a[3] = d;    a[7] = y;
        
        for ( 
    08i++ )
            for ( 
    1<= 8j++ )
                if ( 
    a[i] == a[j] )
                    return 
    false;
        return 
    true;
    }

    int main()
    {
        
    int sendmory;
        
    int sendmoremoney;
        
        for ( 
    110s++ )
            for ( 
    010e++ )
                for ( 
    010n++ )
                    for ( 
    010d++ )
                        for ( 
    110m++ )
                            for ( 
    010o++ )
                                for ( 
    010r++ )
                                    for ( 
    010y++ )
                                    {
                                        
    send  bonChuSosen);
                                        
    more  bonChuSomor);
                                        
    money namChuSo money);
                                        if ( 
    send more == money )
                                            if ( 
    trung sendmor) )                                    
                                                
    cout << send << endl << more  << endl << "======" << endl << money << endl;                 
                                    }
                                            
        
    _getch();
        return 
    0;

    Tớ không hiểu rõ ý meoconlongvang lắm. Có phải ý bạn là lưu hết các bộ ( send, more, money ) thỏa mãn lại rồi sau đó kiểm tra điều kiện kia ??? Có thể giải thích dùm tớ tại sao kiểm tra ngay trong vòng lặp chi phí lại tăng lên ko ???

  5. #5
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,007

    @ mèo : em có mò đâu, em lập cái mò thôi, hj hj
    cái đó em làm demo mà , sơ bộ là như thế, hj hj

    @ bác pannaruto : thì ở đây số lượng vòng lặp rất lớn, nên cứ mỗi 1 động tác nhỏ cũng tạo nên delay rất lớn....

    update code :
    + đã tính đến việc kiểm tra khác nhau hay ko
    + code ngắn hơn


    C++ Code:
    1. #include <iostream>
    2. using namespace std;
    3. #define m(y,i,a) for(y=i;y<a;y++)
    4. #define z(n) m(a[n],0,10)
    5. int a[8],i,j;
    6. int check()
    7. {
    8.     m(i,0,7)m(j,i+1,8)if(a[i]==a[j]) return 0;
    9.     return 1;
    10. }
    11. void main()
    12. {
    13.     m(a[0],1,10)z(1)z(2)z(3)m(a[4],1,10)z(5)z(6)z(7)
    14.         if (a[0]*1000+a[1]*91+a[3]+a[6]*10==a[2]*90+a[4]*9000+a[5]*900+a[7]&&check())
    15.        cout<<a[0]<<a[1]<<a[2]<<a[3]<<"+"<<a[4]<<a[5]<<a[6]<<a[1]<<"="<<a[4]<<a[5]<<a[2]<<a[1]<<a[7]<<endl;
    16.     system("pause");
    17. }
    ^_,^

    Facebook : https://www.facebook.com/langmaninternet

    Bùi Tấn Quang

  6. #6
    Ngày gia nhập
    12 2009
    Nơi ở
    internet 2/2010
    Bài viết
    2

    Mặc định bài toán thử : send+more=money. Giúp mình

    Test chưa vậy nhỉ cái này có duy nhất một kết quả thôi mà

    Hix tui chạy trên TC ra rất nhiều kết quả chắc bộ cài lỗi rùi. Chạy trên VS2008 thì đúng rùi tui chỉ làm đơn giản thế này thôi

    C++ Code:
    1. // money.cpp : Defines the entry point for the console application.
    2. //
    3.  
    4. #include "stdafx.h"
    5. #include <iostream>  
    6. using namespace std;  
    7. void main()
    8. {
    9.     int s,e,n,d,m,o,r,y;
    10.     for(s=1;s<10;s++)
    11.     for(e=0;e<10;e++)
    12.     {
    13.         if (e==s) continue;
    14.         for(n=0;n<10;n++)
    15.         {
    16.             if  (n==e||n==s) continue;
    17.             for(d=0;d<10;d++)
    18.             {
    19.                 if (d==n||d==e||d==s) continue;
    20.                 for(m=1;m<10;m++)
    21.                 {
    22.                     if (m==d||m==n||m==e||m==s) continue;
    23.                     for(o=0;o<10;o++)
    24.                     {
    25.                         if (o==m||o==d||o==n||o==e||o==s) continue;
    26.                         for(r=0;r<10;r++)
    27.                         {
    28.                             if (r==o||r==m||r==d||r==n||r==e||r==s) continue;
    29.                             for(y=0;y<10;y++)
    30.                             {
    31.                                 if (y==r||y==o||y==m||y==d||y==n||y==e||y==s) continue;
    32.                                 if (s*1000+e*100+n*10+d +m*1000+o*100+r*10+e==m*10000+o*1000+n*100+10*e+y)
    33.                                     cout<<s<<e<<n<<d<<"+"<<m<<o<<r<<y<<"="<<m<<o<<n<<e<<y;
    34.                             }
    35.                         }
    36.                     }
    37.                 }
    38.             }
    39.         }
    40.     }  
    41. }

  7. #7
    Ngày gia nhập
    03 2010
    Nơi ở
    My Home
    Bài viết
    772

    Tớ nghĩ đây chỉ là giải pháp tình thế cho 1 bài toán duy nhất.
    Hiện tớ đang nghĩ cách giải bài toán tổng quát.
    C Code:
    1. string1 + string2 = string3;
    2.  
    3. bool equation(char* str1, char* str2, char* str3)
    4. {
    5.       bool result = false;
    6.        //process
    7.        ...
    8.        return  result;
    9. }

  8. #8
    Ngày gia nhập
    01 2010
    Bài viết
    3

    CHo em hỏi cái thư viện stdafx.h là gì mà em chạy trong dev-c không được :S

  9. #9
    Ngày gia nhập
    03 2010
    Nơi ở
    My Home
    Bài viết
    772

    Giới thiệu giải thuật của mình như sau:

    Giải thuật của mình tổng quát, giải cho mọi INPUT dạng: string1 + string2 = result

    Có thể phát triển lên string1 + string2 + ... + stringn = string_result;


    C Code:
    1. #include <conio.h>
    2. #include <stdio.h>
    3. #include <map>
    4.  
    5. #define MAX_CHAR        10
    6. using namespace std;
    7. char range_of_domain[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
    8. typedef map<char, char> character_map;
    9.  
    10.  
    11. int equation_analys(char* str1, char* str2, char* str3, character_map& map_counter);
    12. void Try(char *mother, char *child, bool *is_set, int max, int child_num, int current, character_map map, char* term1, char* term2, char* term3);
    13. int pơwer(int x, int n);
    14. void equation_process(char* term1, char* term2, char* result);
    15.  
    16. int equation_analys(char* str1, char* str2, char* str3, character_map& map)
    17. {  
    18.    
    19.     int len1 = strlen(str1);
    20.     int len2 = strlen(str2);
    21.     int len3 = strlen(str3);
    22.    
    23.     for(int i = 0; i < len1; i++)
    24.         map[str1[i]] = str1[i];
    25.     for(int i = 0; i < len2; i++)
    26.         map[str2[i]]= str2[i];
    27.     for(int i = 0; i < len3; i++)
    28.         map[str3[i]]= str3[i];
    29.     return map.size();
    30. }
    31.  
    32.  
    33. int power(int x, int n)
    34. {
    35.     if(x == 0)
    36.         return 0;
    37.     int result = 1;
    38.     for(int i = 0; i < n; i++)
    39.         result *= x;
    40.     return result;
    41. }
    42.  
    43.  
    44. void Try(char *domain, char *child, bool *is_set, int max, int child_num, int current, character_map map, char* term1, char* term2, char* term3)
    45. {
    46.     if (current == child_num)
    47.     {
    48.         character_map::iterator it = map.begin();
    49.         for(int i = 0; i < child_num; i++)
    50.         {          
    51.             it->second = child[i];  
    52.             ++it;
    53.         }
    54.         int len1 = strlen(term1);
    55.         int len2 = strlen(term2);
    56.         int len3 = strlen(term3);
    57.  
    58.         char* res1 = new char[len1 + 1];
    59.         memset(res1, 0, len1 + 1);
    60.  
    61.         char* res2 = new char[len2 + 1];
    62.         memset(res2, 0, len2 + 1);
    63.  
    64.         char* res3 = new char[len3 + 1];        
    65.         memset(res3, 0, len3 + 1);
    66.  
    67.         for(int i = 0; i < len1; i++)
    68.         {
    69.             character_map::iterator it = map.find(term1[i]);
    70.             res1[i] = it->second;
    71.         }
    72.         for(int i = 0; i < len2; i++)
    73.         {
    74.             character_map::iterator it = map.find(term2[i]);
    75.             res2[i] = it->second;
    76.         }
    77.         for(int i = 0; i < len3; i++)
    78.         {
    79.             character_map::iterator it = map.find(term3[i]);
    80.             res3[i] = it->second;
    81.         }
    82.        
    83.         int addend1, addend2, result;
    84.  
    85.         sscanf(res1, "%d", &addend1);
    86.         sscanf(res2, "%d", &addend2);
    87.         sscanf(res3, "%d", &result);
    88.         if(len1 - 1)
    89.             if(addend1 < power(10, len1 - 1))
    90.                 goto L1;
    91.         if(len2 - 1)
    92.             if(addend2 < power(10, len2 - 1))
    93.                 goto L1;
    94.         if(len3 - 1)
    95.             if(result < power(10, len3 - 1))
    96.                 goto L1;
    97.         if(addend1 + addend2 == result)
    98.         {
    99.             printf("\nresult:\n");
    100.             printf("%d + %d = %d\n", addend1, addend2, result);
    101.         }
    102.  
    103. L1:     delete[] res1;
    104.         delete[] res2;
    105.         delete[] res3;
    106.         return;
    107.     }
    108.  
    109.     for (int l = 0; l < max; l++)
    110.     {
    111.         if (!is_set[l])
    112.         {          
    113.             child[current] = domain[l];
    114.             is_set[l] = true;
    115.             Try(domain, child, is_set, max, child_num, current + 1, map, term1, term2, term3);
    116.             is_set[l] = false;
    117.            
    118.         }
    119.     }
    120. }
    121.  
    122. void equation_process(char* term1, char* term2, char* result)
    123. {
    124.     printf("%s + %s = %s\n", term1, term2, result);
    125.     if(strlen(term1) * strlen(term2) * strlen(result) == 0)
    126.     {
    127.         printf("wrong input equation\n");
    128.         return;
    129.     }
    130.     character_map map_char_value;
    131.     bool is_set[MAX_CHAR];
    132.     memset(is_set, 0, sizeof(is_set));      
    133.    
    134.     int number_char = equation_analys(term1, term2, result, map_char_value);
    135.     if(number_char > MAX_CHAR || number_char <= 0)
    136.     {
    137.         printf("wrong input equation\n");
    138.         return;
    139.     }
    140.     char* value_set = new char[number_char];
    141.     Try(range_of_domain, value_set, is_set, MAX_CHAR, number_char, 0, map_char_value, term1, term2, result);    
    142.     delete[] value_set;
    143. }
    144.  
    145. int main(int argc, char* argv[])
    146. {  
    147.     char* term1 = "SEND";
    148.     char* term2 = "MORE";
    149.     char* result = "MONEY";
    150.    
    151.     equation_process(term1, term2, result);
    152.    
    153. L2: printf("\nfinished! Press ESC to exit\n");
    154.  
    155.     while(1)
    156.     {
    157.         if(kbhit())
    158.         {
    159.             if(getch() == 0x1B)
    160.                 break;
    161.         }
    162.     }
    163.     return 0;
    164. }
    Đã được chỉnh sửa lần cuối bởi namdq2k : 18-03-2010 lúc 11:30 AM.

  10. #10
    Ngày gia nhập
    09 2008
    Bài viết
    5

    có bác nào giải thích rõ hơn giùm mình về cái đề bài này ko?

    thanks nhiều

Các đề tài tương tự

  1. Money::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::
    Gửi bởi hoang201222 trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 20-12-2012, 01:45 PM
  2. Lập trình C Lỗi con trỏ chỉ vào ô nhớ không tồn tại gây lỗi MS "send | don't send"? Giúp em với!
    Gửi bởi dhp11591 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 02-08-2012, 11:40 AM
  3. Định dạng lại Format cho kiểu money
    Gửi bởi nhuan07 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 6
    Bài viết cuối: 14-09-2011, 11:19 PM
  4. Hiển thị định dang 'money' ra textbox với lập trình C#
    Gửi bởi doquangtuan trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 3
    Bài viết cuối: 08-01-2011, 01:35 PM
  5. MS SQL Lỗi Định dạng lại kiểu Money trong SQL theo ý muốn như thế nào?
    Gửi bởi angellenger trong diễn đàn Thắc mắc Microsoft SQL Server & Microsoft Access
    Trả lời: 2
    Bài viết cuối: 23-07-2010, 03:03 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn