Từ 1 tới 4 trên tổng số 4 kết quả

Đề tài: Dịch đoạn code này từ C++(C) sang C#

  1. #1
    Ngày gia nhập
    07 2010
    Bài viết
    25

    Mặc định Dịch đoạn code này từ C++(C) sang C#

    Nguyên văn:

    Trích dẫn Nguyên bản được gửi bởi teaser Xem bài viết
    Điền dấu +/- vào giữa các chữ số: 123456789 (theo đúng thứ tự) để tạo thành 1 biểu thức có giá trị = N.
    Với n là 1 số nguyên dương cho trước. Hãy nêu tất cả các đáp án có thể.

    VD: với N=12 một trong những đáp án là: 123+ 45- 67- 89 = 12
    Đây là cách giải của bạn onminh nhưng là = ngôn ngữ C++(hay C mình cũng ko rõ) nên rất khó hiểu với mình

    Trích dẫn Nguyên bản được gửi bởi onminh Xem bài viết
    Code:
    1. Hàm insert() đưa xâu "123456789" về xâu "1*2*3*4*5*6*7*8*9" 
    2. Vị trí các dấu * có thể:  
         - giữ nguyên dấu *: hiểu là các số được viết liền nhau, 1*2 = 12. 
         - Thay bởi dấu +: hiểu là phép trừ, 1-2 = -1. 
         - Thay bởi dấu +: hiểu là phép cộng, 1+2=3.  
         Việc hiểu này dành cho hàm eval(). 
    3. Hàm Try() được cài đặt đệ quy phù hợp với giải thuật quay lui.  
    Nó lần lượt thử các vị trí có dấu * bởi 3 khả năng trên. 
     Với mỗi phép thử của nó, hàm eval() được gọi để evaluate giá trị của xâu, 
     tương ứng với biểu thức do hàm removemultsign() trả về. 
     Nếu khớp với giá trị sum mong muốn thì printf ra thôi. 
     Thực chất của quay lui được thực hiện bởi câu lệnh str[k] = ch; đó.

    Code:
    #include <stdio.h> 
    #include <stdlib.h>
    #define max 100
    
    int isdigit(char ch) {return '0' <= ch && ch <= '9';}
    int isoperator(char ch) {return ch == '+' ? 1: -1;}
    int ismultsign(char ch) {return ch == '*';}
    
    long eval(char *str)
    {
        long val = 0;
        char sign = '+';
        long temp = 0;
        int k = 0;
        char *ptr = str;
        while (*ptr)
            {
                if (isdigit(*ptr))
                    temp = temp*10 + *ptr - '0';
                else if(!ismultsign(*ptr))
                    {
                        val = val + isoperator(sign)*temp;
                        temp = 0;
                        sign = *ptr;
                    }
                ptr ++;
            }
        
        return val + isoperator(sign)*temp;
    }
    
    char *insert(char *str)
    {
        char *temp = (char *) malloc(2*max);
        char *ptr = str;
        int k = 0;
        while (*ptr)
            {
                k+=2;
                temp[k-2] = *ptr;
                temp[k-1] = '*';
                ptr ++;
            }
        temp[k-1] = 0;
        return temp;
    }
    
    char *removemultsign(char *str)
    {
        char *temp = (char *) malloc (max);
        char *ptr = temp;
        while (*str)
            {
                if(!ismultsign(*str))
                    {
                        *ptr = *str;
                        ptr++;
                    }
                str++;
            }
        *ptr = 0;
        return temp;
    }
    
    
    void Try(char *str, int k, int sum)
    {   
        if (*(str+k))
            for (int j = 0; j < 3; j++)
                {
                    char ch = str[k];
                    if (j==1) str[k] = '-';
                    else if (j==2) str[k] = '+';
                    long num = eval(str);
                    if (num == sum) 
                        {
                            char *temp = removemultsign(str);
                            printf("\n%s = %d\n",temp, sum);
                            free (temp);
                        }
                    Try(str,k+2,sum);
                    str[k] = ch;
                }
    }
    
    void main() 
    { 
        char str[] = "123456789";
        char *ptr = insert(str);
        Try(ptr,1,12);
        free (ptr);
    }
    Mong bạn nào giúp mình dịch đoạn code này sang C#, hoặc có thể giảng giải ý tưởng đoạn code này là thế nào, mình sẽ cố gắng làm sang C#

    Mình cám ơn trước
    Con đường rõ ràng nhất bao giờ cũng là con đường chông gai nhất

  2. #2
    Ngày gia nhập
    07 2010
    Bài viết
    25

    Ai giúp mình với
    Con đường rõ ràng nhất bao giờ cũng là con đường chông gai nhất

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

    Mình ko hiểu gì cả, convert đại qua c#. Chạy được hay ko thì hên xui nha.

    Visual C# Code:
    1. using System;
    2.  
    3. namespace ConsoleApplication1
    4. {
    5.     class Program
    6.     {
    7.         const int max = 100;
    8.  
    9.         static bool isdigit(char ch) { return '0' <= ch && ch <= '9'; }
    10.         static int isoperator(char ch) { return ch == '+' ? 1 : -1; }
    11.         static bool ismultsign(char ch) { return ch == '*'; }
    12.  
    13.         static long eval(string str)
    14.         {
    15.             long val = 0;
    16.             char sign = '+';
    17.             long temp = 0;
    18.             string ptr = str;
    19.             while (ptr.Length > 0)
    20.             {
    21.                 if (isdigit(ptr[0]))
    22.                     temp = temp * 10 + ptr[0] - '0';
    23.                 else if (!ismultsign(ptr[0]))
    24.                 {
    25.                     val = val + isoperator(sign) * temp;
    26.                     temp = 0;
    27.                     sign = ptr[0];
    28.                 }
    29.                 ptr = ptr.Substring(1);
    30.             }
    31.  
    32.             return val + isoperator(sign) * temp;
    33.         }
    34.  
    35.         static string insert(string str)
    36.         {
    37.             char []temp = new char [2 * max];
    38.             string ptr = str;
    39.             int k = 0;
    40.             while (ptr.Length > 0)
    41.             {
    42.                 k += 2;
    43.                 temp[k - 2] = ptr[0];
    44.                 temp[k - 1] = '*';
    45.                 ptr = ptr.Substring(1);
    46.             }
    47.            
    48.             temp[k - 1] = '\0';
    49.             return new string(temp);
    50.         }
    51.  
    52.         static string removemultsign(string str)
    53.         {
    54.             char []temp = new char [max];
    55.             int ptr = 0;
    56.             int i = 0;
    57.             while (str[i] != '\0')
    58.             {
    59.                 if (!ismultsign(str[i]))
    60.                 {
    61.                     temp[ptr] = str[i];
    62.                     ptr++;
    63.                 }
    64.                 i++;
    65.             }
    66.             temp[ptr] = '\0';
    67.             return new string(temp);
    68.         }
    69.  
    70.         static void Try(char[] str, int k, int sum)
    71.         {
    72.             if (str[k] != '\0')
    73.                 for (int j = 0; j < 3; j++)
    74.                 {
    75.                     char ch = str[k];
    76.                     if (j == 1) str[k] = '-';
    77.                     else if (j == 2) str[k] = '+';
    78.                     long num = eval(new string(str));
    79.                     if (num == sum)
    80.                     {
    81.                         string temp = removemultsign(new string(str));
    82.                         Console.WriteLine(temp + " = " + sum.ToString());
    83.                     }
    84.  
    85.                     Try(str, k + 2, sum);
    86.                     str[k] = ch;
    87.                 }
    88.         }
    89.  
    90.         static void Main(string[] args)
    91.         {
    92.             string str = "123456789";
    93.             char []ptr = insert(str).ToCharArray();
    94.             Try(ptr,1,12);
    95.             Console.ReadKey();
    96.         }
    97.  
    98.     }
    99. }
    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
    07 2010
    Bài viết
    25

    Trích dẫn Nguyên bản được gửi bởi meoconlongvang Xem bài viết
    Mình ko hiểu gì cả, convert đại qua c#. Chạy được hay ko thì hên xui nha.
    Rất cám ơn bạn
    Tuy ko chính xác 100% nhưng chỉ cần chỉnh sửa đôi chút là mình có kết quả như ý muốn

    Cám ơn bạn 1 lần nữa
    Con đường rõ ràng nhất bao giờ cũng là con đường chông gai nhất

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

  1. Lập trình C++ Chuyển đổi code C++ sang code C
    Gửi bởi nemono1 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 0
    Bài viết cuối: 25-05-2013, 03:39 PM
  2. Chuyển code sang code ngắn hơn trong LINQ
    Gửi bởi tinhthanhiepsi9x trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 14-04-2012, 11:19 AM
  3. chuyển code từ VB6 sang C# [Code gì?]
    Gửi bởi anhtai116 trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 4
    Bài viết cuối: 13-12-2011, 08:52 PM
  4. Chuyển code Nested Dolls từ C sang code pascal
    Gửi bởi longago trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 1
    Bài viết cuối: 04-01-2011, 08:54 AM
  5. Chuyển code C++ sang code C, giúp mình với?
    Gửi bởi rong3sao trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 03-04-2009, 09:28 AM

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