Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Trang 1 của 2 12 CuốiCuối
Kết quả 1 đến 10 của 16

Chủ đề: N=48 in ra N=4+8=12

  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    N=48 in ra N=4+8=12

    Đề bài :Nhập 1 số nguyên dương có 2 chữ số Xuất ra màn hình tổng các chữ số của N
    VD : N=48 in ra N=4+8=12
    Bài làm của mình thì chạy OK nhập được số có nhiều hơn 2 chữ số. Nhưng đề bài giới hạn nhập số có 2 chữ số.Giúp mình nhé cảm ơn !
    Mã:
    #include<iostream>
    using namespace std;
    int main()
    {   
        int tong=0;
        do
        {
            int N;
            tong=0;
            cout<<"
    Nhap N: ";
            cin>>N;
            while(n)
            {
               tong+=N%10;
               N/=10;                
            }
            cout<<"
    Tong la:"<<tong;
        }while(tong>10);
             system("pause");
        return 0;
    }

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Mã:
    #include<iostream>using namespace std;void nhap(int *n){     int i;     do{              cout<<"
    Moi ban nhap so co 2 chu so: ";              cin>>i;     } while(i<=9||i>=100);     *n=i;     return;}int Tong(int n){     int tong=0;     tong = (n<20)? 1+ n - 10:((n<30)? 2+ n - 20:(n<40)? 3+ n-30:(n<50)? 4+ n-40:(n<60)? 5 + n-50:(n<70)?6+n-60:(n<80)?8+n-70:(n<90)?8+n-80:9+n-90);     return tong;}int main(){       int n;    nhap(&n);    cout<<"
    Tong="<<Tong(n)<<endl;    system("pause");    return 0;}

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Cảm ơn KiênQuach nhiều.

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Mã:
    #include <iostream>using namespace std;int main(){char Ten[100];int Cu,Moi, Gia;int Tien;cout<<"Ten khach hang la :"<<endl;cin>>Ten;cout<<"Nhap so dien cu"<<endl;cin>>Cu;cout<<"Nhap so dien moi"<<endl;cin>>Moi;cout<<"Nhap Gia ban 1kwh"<<endl;cin>>Gia Tien=(Moi-Cu)*Gia;cout<<"VND"<<"So tien dien phai tra la :"<<Tien;system ("pause");}

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi kienquach
    Haizzzzzzzzzzzzz. nó dài nhưng nó nhanh. bạn ak. bạn đừng tưởng cứ ngắn là tốt. bạn có biết rằng bạn sử dụng phép chia tốn thời gian ko. cái chia lấy phần dư tớ nghĩ ai cũng biết.
    Chậc chậc, "cao nhân" 1 phép chia vẫn nhanh hơn cái đống if-else đấy bạn ạ!

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi doicanhden
    Chậc chậc, "cao nhân" 1 phép chia vẫn nhanh hơn cái đống if-else đấy bạn ạ!
    ai bảo đấy là if else, bạn nhìn lại đi. bạn dùng while ko kiểm tra điều kiện ak. bạn thử tính phép cộng trừ với phép chia xem cái nào nhanh hơn.

  7. #7
    Trích dẫn Gửi bởi kienquach
    ai bảo đấy là if else, bạn nhìn lại đi. bạn dùng while ko kiểm tra điều kiện ak. bạn thử tính phép cộng trừ với phép chia xem cái nào nhanh hơn.
    Lại "tinh tướng", haizzz. Vậy bạn gọi cấu trúc lệnh " ? : " là gì? Dịch sang mã ASM thì nó có giống với if-else mà bạn thường biết không? Mà bài này chẳng cần kiểm tra điều kiện gì cả, cũng chẳng cần lặp, do đề chỉ yêu cầu tổng hai chữ số. Chỉ cần 1 hàm đơn giản như sau:

    Mã:
    int sum(unsigned int num) {    return (num / 10 + num % 10);}
    Suy nghĩ kĩ trước khi comment lại.
    Đây là hàm của bạn sau khi dịch sang ASM (mã máy dùng GCC4.7 Compiler options: -O3 -march=native)


    Mã:
    ;int Tong(int n);{;     int tong=0;;     tong = (n<20)? 1+ n - 10:((n<30)? 2+ n - 20:(n<40)? 3+ n-30:(n<50)? 4+ n-40:(n<60)? 5 + n-50:(n<70)?6+n-60:(n<80)?8+n-70:(n<90)?8+n-80:9+n-90);;     return tong;;}Tong(int):    cmp edi, 19    jle .L12    cmp edi, 29    jg  .L4    lea eax, [rdi-18]    ret.L4:    cmp edi, 39    jle .L13    cmp edi, 49    jg  .L6    lea eax, [rdi-36]    ret.L12:    lea eax, [rdi-9]    ret.L13:    lea eax, [rdi-27]    ret.L6:    cmp edi, 59    jle .L14    cmp edi, 69    jg  .L8    lea eax, [rdi-54]    ret.L14:    lea eax, [rdi-45]    ret.L8:    cmp edi, 79    jg  .L9    lea eax, [rdi-62]    ret.L9:    lea eax, [rdi-72]    cmp edi, 89    lea edx, [rdi-81]    cmovg   eax, edx    ret
    Đây là hàm của tôi.

    Mã:
    ;int sum(unsigned int num) {;    return (num / 10 + num % 10);;}sum(unsigned int):    mov eax, edi    mov edx, -858993459    mul edx    shr edx, 3    lea eax, [rdx+rdx*4]    add eax, eax    sub edi, eax    lea eax, [rdi+rdx]    ret
    Dùng công cụ online: __http://gcc.godbolt.org/

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Mã:
    Tong(int):    cmp edi, 19    jle .L12    cmp edi, 29    jg  .L4    lea eax, [rdi-18]    ret.L4:    cmp edi, 39    jle .L13    cmp edi, 49    jg  .L6    lea eax, [rdi-36]    ret.L12:    lea eax, [rdi-9]    ret.L13:    lea eax, [rdi-27]    ret.L6:    cmp edi, 59    jle .L14    cmp edi, 69    jg  .L8    lea eax, [rdi-54]    ret.L14:    lea eax, [rdi-45]    ret.L8:    cmp edi, 79    jg  .L9    lea eax, [rdi-62]    ret.L9:    lea eax, [rdi-72]    cmp edi, 89    lea edx, [rdi-81]    cmovg   eax, edx    ret
    toàn là cmp và jump theo điều kiện thế này thì nhanh làm sao được. Thực hiện xong khối này lại chuyển tới khối khác trong mỗi khối lại có lệnh jump theo điều kiện như là do while hay repeat until thế thì mướt rồi

  9. #9
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi kienquach
    Mã:
    void nhap(int *n) // Đâu cần truyền vào  *n, &n được rồi {     int i; // Khai báo thêm cái này làm gì vậy ?     do{              cout<<"
    Moi ban nhap so co 2 chu so: ";              cin>>i;     } while(i<=9||i>=100);     *n=i;  // Rồi lại phải chuyển về ?     return;  // Hàm void không cần Return bạn à !!!}int Tong(int n){     int tong=0;     tong = (n<20)? 1+ n - 10:((n<30)? 2+ n - 20:(n<40)? 3+ n-30:(n<50)? 4+ n-40:(n<60)? 5 + n-50:(n<70)?6+n-60:(n<80)?8+n-70:(n<90)?8+n-80:9+n-90);     return tong; // Dòng lệnh trên quá dài, thuật toán thì không tốt }
    Mình sửa code lại :

    Mã:
    #include<iostream>using namespace std;void nhap(int &n){     do{              cout<<"
    Moi ban nhap so co 2 chu so: ";              cin>>n;       }while(n <= 9||n >= 100);}int TongChuSo(int n) // Ham nay dung cho ca Truong hop nay tong quat luon{     int tong = 0;     while(n > 0)        {           tong += n % 10;           n /= 10;        }     return tong;}int main(){    int n;    nhap(n);    cout<<"
    Tong= "<<TongChuSo(n)<<endl;    system("pause");    return 0;}

  10. #10
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi truongnguyen89
    Mình sửa code lại :

    Mã:
    #include<iostream>using namespace std;void nhap(int &n){     do{              cout<<"
    Moi ban nhap so co 2 chu so: ";              cin>>n;       }while(n <= 9||n >= 100);}int TongChuSo(int n) // Ham nay dung cho ca Truong hop nay tong quat luon{     int tong = 0;     while(n > 0)        {           tong += n % 10;           n /= 10;        }     return tong;}int main(){    int n;    nhap(n);    cout<<"
    Tong= "<<TongChuSo(n)<<endl;    system("pause");    return 0;}
    Haizzzzzzzzzzzzz. nó dài nhưng nó nhanh. bạn ak. bạn đừng tưởng cứ ngắn là tốt. bạn có biết rằng bạn sử dụng phép chia tốn thời gian ko. cái chia lấy phần dư tớ nghĩ ai cũng biết.

 

 
Trang 1 của 2 12 CuốiCuối

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •