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

Đề tài: [C] Xử lý (+ - * /) các số lớn (hàng trăm chữ số chẳng hạn)

  1. #1
    Ngày gia nhập
    11 2006
    Bài viết
    6

    Mặc định [C] Xử lý (+ - * /) các số lớn (hàng trăm chữ số chẳng hạn)

    Tớ muốn thực hiện các phép tính với các số lớn (số chữ số có thể hàng trăm). Các bạn gợi ý cho tớ 1 chút. Thanks!!!

  2. #2
    Ngày gia nhập
    11 2006
    Bài viết
    633

    Dùng string để lưu 1 con số khi nhập vào rồi cắt lấy từng ký số để chuyển nó sang 1 mảng số. Cuối cùng là thực hiện các phép + - * / trên từng ký số theo phương pháp mà chúng ta đã học từ lớp 1. Đối với + - thì dễ chứ * với / thì khó lắm đó. Ví dụ như cộng số 123456789 và số 987654321 thì ta nhập 2 số này vào 1 biến string rồi chuyển từng ký số sang 2 cái mảng:
    a = [1][2][3][4][5][6][7][8][9]
    b = [9][8][7][6][5][4][3][2][1]
    cuối cùng thực hiện phép tính trên từng ký số.

  3. #3
    Ngày gia nhập
    08 2006
    Nơi ở
    TpHCM
    Bài viết
    202

    chuỗi cũng là mảng số mà còn chuyển sang mảng nào nữa

  4. #4
    Ngày gia nhập
    11 2006
    Bài viết
    633

    chuỗi cũng là mảng số mà còn chuyển sang mảng nào nữa
    Bạn nên phân biệt rõ rang là chuỗi gì, nói chuỗi chung chung thì rất khó hiểu, ở đây tôi nói chuỗi string (khái niệm này ko có trong C, C++ mới có) là 1 chuỗi ký tự, chuyển sang thành 1 mảng ký số cho việc tính toán nhẹ nhàng hơn.

  5. #5
    Ngày gia nhập
    11 2006
    Bài viết
    633

    Vô tình tìm được trên 1 trang web khác, bài làm = Pascal:
    Đề: nhận một biểu thức (formula) từ bàn phím tính toán biểu thức đó.
    Vd: formula:= " ((a+b)*(c+d))/f "; với a,b,c,d,f là constants.
    Các phép toán được sử dụng mở rộng là ARCTAN, ABS, COS, SQR , SQRT, SIN, LN, EXP, ACOS, ASIN, ROUND, TRUNC, INT, LOGTEN.
    Các phép toán thông thường +, -, *, / dĩ nhiên chương trình phải thực hiện được.

    (Bài tập lớn số 7 môn lập trình Pascal trường ĐH DL Kỹ Nghệ)
    Đáp án đề nghị:
    1. Xây dựng unit Pcalc:

    {$X+}
    {$F+}
    Unit pcalc;

    interface

    Function Compute_Formula (var p:integer; var str:string; var error:boolean): real;

    implementation

    const
    LnTenInv = 0.4342944819032520;

    PROCEDURE StrDelete(VAR s : String; index : Integer; count : byte);
    BEGIN
    if index > length(s) then exit else
    if index + count > succ(length(s)) then s[0]:= chr(index) else
    begin
    Move(s[Index + count],s[Index],succ(length(s)) - index - count);
    Dec(s[0], Count);
    end;
    END;

    Procedure StrConcat(var S : string; source : string);
    var index : integer;
    begin
    index := succ(length(s));
    if length(s)+length(Source) > 255 then dec(source[0],length(s)+length(source)-255);
    Move(s[Index],
    s[Index+length(source)],
    succ(length(s))-Index);
    Move(source[1], s[Index], length(source));
    Inc(s[0], length(source));
    end;

    Procedure StrConcatBefore(source : String; var S : String);
    begin
    if length(s) + length(source) > 255 then dec(s[0],length(s)+length(Source)-255);
    Move(s[1],
    s[succ(length(source))],
    length(s));
    Move(source[1], s[1], length(source));
    Inc(s[0], length(source));
    end;


    FUNCTION LogTen( X: real ) : real;

    BEGIN

    IF X <= 0.0 THEN
    LogTen := 0.0
    ELSE
    LogTen := LN( X ) * LNTenInv;

    END;

    FUNCTION ASin(x:real):real;
    VAR O, OSquare : real;
    BEGIN O := ABS(x);
    IF O <= 1.0 THEN
    BEGIN
    IF O = 1.0 THEN BEGIN
    IF x < 0.0 THEN ASin := -0.5 * pi
    ELSE ASin := 0.5 * pi
    END
    ELSE ASin := ArcTan(x / SQR(1.0 - Sqr(x)))
    END
    ELSE ASIN := 0;
    END;


    FUNCTION ACos(x:real):real;
    BEGIN ACos := (0.5 * pi) - ASin(x)
    END;

    PROCEDURE StrInsert(source : String; VAR s : String; index : byte);
    BEGIN
    if length(s)+length(Source) > 255 then dec(s[0],length(s)+length(source)-255);
    if index > length(s) then index := succ(length(s));
    Move(s[Index],
    s[Index+length(source)],
    succ(length(s))-Index);
    Move(source[1], s[Index], length(source));
    Inc(s[0], length(source));
    END;

    Function StripChar(st:string; c:char) : string; external;
    {$L strip.obj}

    Function Compute_Formula (var p:integer; var str:string; var error:boolean): real;

    var r : real;
    i, breakpoint : integer;
    ch : char;

    (*****)

    Procedure Eval(var formula:string; var value:real; var breakpoint:integer);

    const numbers : set of char = ['0'..'9','.'];
    var p, i : Integer;
    ch : char;

    (*****)

    Procedure NextP;
    begin
    repeat
    inc(p);
    if p <= length(formula) then ch := formula[p] else ch := #13;
    until (ch <> ' ');
    breakpoint := p;
    end;

    (*****)

    Function expr : real;

    var e : real;
    operator : char;

    (*****)

    Function smplexpr : real;

    var s : real;
    operator : char;

    (*****)

    Function term : real;

    var t : real;

    (*****)

    Function s_fact : real;

    (*****)

    Function fct : real;

    var fn : string[20];
    l, start : integer;
    f : real;

    (*****)

    Procedure Process_as_number;

    var code : integer;

    begin
    start := p;
    repeat
    nextp;
    until not (ch in numbers);

    if ch = '.' then
    repeat
    nextp;
    until not (ch in numbers);

    if ch = 'E' then
    begin
    nextp;
    repeat
    nextp;
    until not (ch in numbers);
    end;

    Val(copy(formula,start,p-start),f,code);
    end;

    (*****)

    Procedure Process_as_new_expr;
    begin
    nextp;
    f := expr;
    if ch = ')' then nextp
    else breakpoint := p;
    end;

    (*****)

    Procedure Process_as_standard_function;

    (*****)

    function fact(i : integer) : real;
    begin
    if i > 0 then
    fact := i * fact(i-1)
    else fact := 1;
    end;

    begin {Process_as_standard_function}

    if copy(formula,p,3) = 'ABS' then
    begin
    inc(p,2);
    nextp;
    f := fct;
    f := abs(f);
    end
    else
    if copy(formula,p,4) = 'SQRT' then
    begin
    inc(p,3);
    nextp;
    f := fct;
    f := sqrt(f);
    end
    else
    if copy(formula,p,3) = 'SQR' then
    begin
    inc(p,2);
    nextp;
    f := fct;
    f := sqr(f);
    end
    else
    if copy(formula,p,4) = 'FRAC' then
    begin
    inc(p,3);
    nextp;
    f := fct;
    f := frac(f);
    end
    else
    if copy(formula,p,5) = 'TRUNC' then
    begin
    inc(p,4);
    nextp;
    f := fct;
    f := trunc(f);
    end
    else
    if copy(formula,p,5) = 'ROUND' then
    begin
    inc(p,4);
    nextp;
    f := fct;
    f := round(f);
    end
    else
    if copy(formula,p,6) = 'LOGTEN' then
    begin
    inc(p,5);
    nextp;
    f := fct;
    f := LOGTEN(f);
    end
    else
    if copy(formula,p,3) = 'INT' then
    begin
    inc(p,2);
    nextp;
    f := fct;
    f := int(f);
    end
    else
    if copy(formula,p,3) = 'TAN' then
    begin
    inc(p,2);
    nextp;
    f := fct;
    f := sin(f)/cos(f);
    end
    else
    if copy(formula,p,4) = 'ASIN' then
    begin
    inc(p,3);
    nextp;
    f := fct;
    f := asin(f);
    end
    else
    if copy(formula,p,4) = 'ACOS' then
    begin
    inc(p,3);
    nextp;
    f := fct;
    f := acos(f);
    end
    else
    if copy(formula,p,3) = 'SIN' then
    begin
    inc(p,2);
    nextp;
    f := fct;
    f := sin(f);
    end
    else
    if copy(formula,p,3) = 'COS' then
    begin
    inc(p,2);
    nextp;
    f := fct;
    f := cos(f);
    end
    else
    if copy(formula,p,6) = 'ARCTAN' then
    begin
    inc(p,5);
    nextp;
    f := fct;
    f := arctan(f);
    end
    else
    if copy(formula,p,2) = 'LN' then
    begin
    inc(p);
    nextp;
    f := fct;
    f := ln(f);
    end
    else
    if copy(formula,p,3) = 'EXP' then
    begin
    inc(p,2);
    nextp;
    f := fct;
    f := exp(f);
    end
    else
    if copy(formula,p,4) = 'FACT' then
    begin
    inc(p,3);
    nextp;
    f := fct;
    f := fact(trunc(f));
    end
    else
    breakpoint := p;
    end;

    begin {fct}

    if ch in numbers then Process_as_number
    else if ch = '(' then Process_as_new_expr
    else Process_as_Standard_function;

    fct := f;
    end;

    begin {s_fact}

    if ch = '-' then
    begin
    nextp;
    s_fact := -fct;
    end
    else
    s_fact := fct;
    end;

    begin {term}

    t := s_fact;
    while ch = '~' do
    begin
    nextp;
    t := exp(ln(t) * s_fact);
    end;
    term := t;
    end;

    begin {smplexpr}

    s := term;
    while ch in ['*','/'] do
    begin
    operator := ch;
    nextp;
    case operator of
    '*' : s := s * term;
    '/' : s := s / term;
    end;
    end;

    smplexpr := s;
    end;

    begin {expr}

    e := smplexpr;
    while ch in ['+','-'] do
    begin
    operator := ch;
    nextp;
    case operator of
    '+' : e := e + smplexpr;
    '-' : e := e - smplexpr;
    end;
    end;

    expr := e;
    end;

    begin {eval}

    for i := 1 to length(formula) do formula[i] := upcase(formula[i]);

    if formula[1] = '.' then strconcatbefore('0',formula);
    if formula[1] = '+' then strdelete(formula,1,1);

    p := pos('PI',formula);

    while p <> 0 do
    begin
    strdelete(formula,p,2);
    strinsert('3.1415926536',formula,p);
    p := pos('PI',formula);
    end;

    p := 0;
    nextp;
    value := expr;

    error := (ch <> #13);

    breakpoint := p;
    end;

    begin {compute_formula}
    str := stripchar(str,' ');
    eval(str,r,p);
    compute_formula := r;
    dec(p,1);
    if p < 1 then p := 1;
    end;

    end.

    2. File liên kết Strip viết bằng asm:

    .model tpascal
    .code

    stripchar proc far
    public stripchar
    arg inpst : dword, char : byte : 2 returns outst : dword
    local counter : word

    push ds
    lds si,inpst
    les di,outst
    mov counter,0
    lodsb
    cmp al,0
    je done
    mov cl,al
    xor ch,ch
    stosb
    looper:
    lodsb
    cmp al,char
    je bottomofloop
    stosb
    inc counter
    bottomofloop:
    loop looper
    done:
    mov ax,counter
    les di,outst
    stosb
    pop ds
    ret
    stripchar endp
    ends;
    end

    3. Kiểm tra bằng chương trình thực tế:

    var : formula : string;
    code : Integer;
    error : boolean;
    answer : real;

    begin
    formula := '(2+3)/(3+7)';
    Answer := Compute_Formula(code,formula,error);
    if error then
    begin
    Writeln('Error : ',formula);
    Writeln(Replicate(' ',pred(p) + 8 ),'^');
    end
    else
    writeln(formula,' = ',result);
    end;

  6. #6
    No Avatar
    tutiendung Khách

    Mặc định [C] Xử lý (+ - * /) các số lớn (hàng trăm chữ số chẳng hạn)

    Em mới học lập trình không biết các hàm kiểu n mũ 2 hoặc 2 mũ n thì thế nào.Các bạn có file nói về những hàm toán học này kô.Giúp mình nhé.

  7. #7
    Ngày gia nhập
    11 2006
    Bài viết
    633

    Em mới học lập trình không biết các hàm kiểu n mũ 2 hoặc 2 mũ n thì thế nào
    Dùng hàm pow(x,y) == x^y
    Nếu cảm thấy ko thích thì tự tạo hàm pow theo ý riêng của mình.

  8. #8
    Ngày gia nhập
    06 2007
    Bài viết
    5

    Post Mình cũng đang nghiên cứu vấn đề này đây

    Mình đang làm bài này nhưng cách của mình co vẻ khó hơn 1 chút nếu thích bạn cùng mình cùng thảo luận.Mình dùng mảng kiể chả để lưu hai danh sách sau đó mình đưa từng mảng vào 2 danh sách liên kết kép.
    - Thứ nhất mình vừa ôn lại được các thao tác trên ds
    - Thứ 2 thuật toán mình xây dựng để tính + - * / cũng ko khác trên mảng là mấy
    Nếu thích bạn có thể mail cho mình bobbleboy1203@gmail.com. Mình cùng thảo luận ok?

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

  1. code bài toán cổ trăm trâu trăm cỏ trên C/C++. Kiểm tra giúp mình
    Gửi bởi tuanlt10 trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 7
    Bài viết cuối: 26-12-2012, 09:39 AM
  2. Có những ngày em chẳng yêu anh...
    Gửi bởi lylt_helios trong diễn đàn Giải trí - Thư giãn
    Trả lời: 0
    Bài viết cuối: 15-12-2012, 07:00 PM
  3. Ý kiến Chẳng hiểu topic vì sao lại bị xóa!
    Gửi bởi ngocthanhstar trong diễn đàn Ý kiến, đề xuất và khiếu nại
    Trả lời: 2
    Bài viết cuối: 14-07-2012, 05:57 PM
  4. Lập trình C++ cho mình hỏi cái ép kiểu này cái,sao chẳng ép đựoc ấy
    Gửi bởi thienthanoze trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 5
    Bài viết cuối: 07-07-2012, 06:06 PM
  5. Các tạo 1 chương trình lập trình windows với MFC ( HELLO WORLD chẳng hạn)
    Gửi bởi thanhga0210 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 1
    Bài viết cuối: 17-07-2011, 09:42 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