Hiển thị các bài đăng có nhãn C++. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn C++. Hiển thị tất cả bài đăng
P163SUMH - ROUND 3H - Xúc xắc

P163SUMH - ROUND 3H - Xúc xắc

Link Sub: https://www.spoj.com/PTIT/problems/P163SUMH/
Người Gửi: Dương Lee

  • Problem:

Tí và Tèo đang chơi xúc xắc, mỗi người chọn ra một con số từ 1 đến 6 và sẽ tung xúc xắc để xem giá trị của con xúc xắc gần với con số của người nào hơn. Giá trị x gọi là gấn số a hơn số b nếu |x – a| < |x – b|  
Giờ đây bạn biết 2 con số mà Tí và Tèo đã chọn, hãy tính xem có bao nhiêu giá trị của xúc xắc mà gần số của Tí hơn, bao nhiêu giá trị mà khoảng cách tới 2 con số đã chọn như nhau và bao nhiêu giá trị mà nó gần với số của Tèo hơn và in ra kết quả lần lượt theo thứ tự như trên.
Input
Một dòng duy nhất gồm 2 số nguyên a, b (1 <= a, b <= 6)
Output
Kết quả bài toán.
Example:
Input
2 5
Output:
3 0 3

  • Solution:

Bài này chỉ việc đếm thôi, chạy hết tất cả các trường hợp có thể có của xúc xắc (1->6) và đếm những trường hợp nào gần a hơn, trường hợp nào gần b hơn và bằng nhau.

  • Code:

C:

https://ideone.com/I2191f
#include <stdio.h>
#include <math.h>

int main()
{
    int a, b;
    scanf("%d%d", &a, &b);
    int ganA=0, ganB=0, bang=0;
    for (int i=1; i<=6; i++)
    {
        if (abs(a-i)<abs(b-i)) ganA++;
        else if (abs(a-i)>abs(b-i)) ganB++;
        else bang++;
    }
    printf("%d %d %d", ganA, bang, ganB);
    return 0;
}

C++:

...

JAVA:

...

Python:

...
P151SUMB - ROUND 1B - Đong gạo

P151SUMB - ROUND 1B - Đong gạo

Link Sub: https://www.spoj.com/PTIT/problems/P151SUMB/
Người Gửi: Dương Lee

  • Problem:

Tuyenlv7 bị mẹ giao cho nhiệm vụ đó là đong gạo để mang lên nhà trọ. Anh được mẹ đưa cho 2 loại bịch, là loại 5 kg và 3 kg. Tuyenlv7 sẽ phải đong đủ số gạo mà mẹ cho vào 2 loại bịch trên.  
Ví dụ mẹ cho 18 kg thì Tuyenlv7 có thể đong bằng 3 bịch 5kg + 1 bịch 3kg hoặc 6 bịch 3 kg.  
Hãy giúp anh ấy đong với số lượng bịch ít nhất có thể, nếu không thể đong được, in ra -1.
Input
Dòng duy nhất chứ số N là số gạo mẹ Tuyenlv7 cho ( 0 < N < 5000).
Output
In ra đáp án của bài toán.
Example:
Input
18
Output:
4

  • Solution:

Vì các bao chứa gạo đều là số nguyên tố, vậy nên với m(kg) gạo nếu chia được ta luôn có:
m = i*3 + j*5
->CT1: j = (m-i*3)/5 (hoặc CT2: i = (m-j*5)/3) (trong đó i là số bao 3kg, j là số bao 5 kg)
Với công thức trên ta chỉ cần for() với từng trường hợp của  i (hoặc j) và xét thêm điều kiện j nguyên (hoặc i nguyên) đối với CT1 (hoặc CT2) là đã xét được đầy đủ các trường hợp có thể chia ra các Bao
Việc còn lại là chỉ cần xác định trường hợp nào là ít bao nhất bằng phép tính: số bao gạo = i+j

  • Code:

C:

https://ideone.com/Cpxb9T
#include <stdio.h>

int main()
{
    int N;
    scanf("%d", &N);
    
    int minB = 5000;
    for (int i=0; i<=(N/3); i++)
    {
        int kg = i*3;
        int kgRe = N - (kg);
        if (kgRe%5==0)
        {
            int B = i+kgRe/5;
            if (B<minB)
            {
                minB = B;
            }
        }
    }
    if (minB==5000)
        printf("-1");
    else
        printf("%d", minB);
    return 0;
}

C++:

...

JAVA:

...

Python:

...
P145PROC - ROUND 5C - Modulo

P145PROC - ROUND 5C - Modulo

Link Sub: http://www.spoj.com/PTIT/problems/P145PROC/
Người Gửi: Dương Lee

  • Problem:

Cho 2 số nguyên A và B, A modulo B là phần dư của A khi chia cho B. Ví dụ, 7, 14, 27 và 38 lần lượt là 1, 2 , 0 và 2 theo modulo 3.  
Cho trước một dãy số có 10 phần tử. Bạn hãy viết chương trình tính số lượng số giá trị khác nhau trong dãy sau khi lấy modulo 42.
Input
Gồm 10 số nguyên không âm <= 1000.
Output
Ghi ra một số nguyên duy nhất là số lượng giá trị có trong dãy số sau khi lấy MOD 42.
Example:
Input
1
2
3
4
5
6
7
8
9
10
Output:
10

Input
42
84
252
420
840
126
42
84
420
126
Output:
1
Input
39
40
41
42
43
44
82
83
84
85
Output:
6
  • Solution:

Cách đơn giản nhất để làm bài này đó là sử dụng mảng đánh dấu.
Nhận thấy rằng khi chia lấy dư cho 42 các giá trị chỉ nhận nguyên ở trong đoạn [0, 41]. Vậy nên ta tạo mảng dd[42]={0} (có ít nhất 42 phần tử đều bằng 0), mỗi lần tính toán ta đánh dấu dd[A%42]=1. Sau đó ta chỉ việc đếm xem trong mảng dd [0, 41] có bao nhiêu số đã được đánh dấu.
VD đối với 5 số:
1
1
3
3
42
-> dd[0]=1, dd[1]=1, dd[2]=0, dd[3]=1, dd[4]=0, dd[5] =0,...

  • Code:

C:

https://ideone.com/LUbcJe
#include <stdio.h>

int main ()
{
    int dd[43]={0};
    int A;
    for (int i=1; i<=10; i++)
    {
        scanf("%d", &A);
        dd[A%42]=1;
    }
    int dem = 0;
    for (int i=0; i<42; i++)
    {
        if (dd[i]==1)
            dem++;
    }
    printf ("%d", dem);
    return 0;
}

C++:

...

JAVA:

...

Python:

...
P146PROC - ROUND 6C - Bút màu

P146PROC - ROUND 6C - Bút màu

Link Sub: http://www.spoj.com/PTIT/problems/P146PROC/
Người Gửi: Dương Lee

  • Problem:

Tí nhờ mẹ đi mua bút màu để chuẩn bị cho giờ vẽ tranh trên lớp. Tí dặn mẹ mua 4 bút màu khác nhau, nhưng mẹ Tí lại quên mất, chỉ nhớ là mua 4 cái bút màu cho Tí.  
Về đến nhà, Tí bắt đền mẹ vì đã không mua đủ 4 màu cho Tí. Tí đòi mẹ ra hiệu sách mua thêm, để có đủ 4 màu vẽ cho ngày mai.  
Các bạn hãy tính xem mẹ Tí cần mua thêm ít nhất bao nhiêu chiếc bút màu?
Input
Một dòng duy nhất gồm 4 số nguyên s1, s2, s3, s4 (1<= s1, s2, s3, s4 <= 10^9) thể hiện màu của 4 chiếc bút mà mẹ vừa mới mua cho Tí.
Output
In ra số lượng bút màu ít nhất cần mua thêm cho Tí.
Example:
Input
1 7 3 3
Output:
1

Input
7 7 7 7
Output:
3
  • Solution:

Bài này thực chất là bạn đếm số các số khác nhau và kết quả = 4-số đó.

  • Code:

C:

https://ideone.com/FkgO2U
#include <stdio.h>

int main ()
{
    int n = 0;
    int arr[5];
    int tmp;
    for (int i=1; i<=4; i++)
    {
        scanf("%d", &tmp);
        int kt = 0;
        for (int i=1; i<=n; i++)
        {
            if (tmp==arr[i])
            {
                kt = 1;
                break;
            }
        }
        if (kt==0)
        {
            n++;
            arr[n]=tmp;
        }
    }
    printf ("%d", 4-n);
    return 0;
}

C++:

...

JAVA:

...

Python:

...
ALGOPRO5 - Lucky number

ALGOPRO5 - Lucky number

Link Sub: http://www.spoj.com/PTIT/problems/ALGOPRO5/
Người Gửi: Dương Lee

  • Problem:

Một số được cho là may mắn nếu nó chỉ gồm các chữ số 6 và 9.  
Cho số tự nhiên n ( 1 <= n <= 55), hãy tính xem có bao nhiêu số may mắn có tối đa n chữ số?
Input
Số n.
Output
Đáp án của bài toán.
Example:
Input
2
Output:
6

Input
1
Output:
2
  • Solution:

Bài này thực chất là có bao nhiêu số có độ dài không quá n chỉ có 6 và 9 :D

  • Code:

C:

https://ideone.com/VNOQQE
#include <stdio.h>

main () {
    int n;
    scanf ("%d",&n);
    long long ssmm, tsmm=0;
    for (int i=1; i<=n; i++) {
        ssmm=1;
        for (int j=1; j<=i; j++) {
            ssmm=ssmm*2;
        }
        tsmm=tsmm+ssmm;
    }
    printf ("%lld",tsmm);
}

C++:

...

JAVA:

...

Python:

...
P143PROJ - ROUND 3J - Quảng trường

P143PROJ - ROUND 3J - Quảng trường

Link Sub: http://www.spoj.com/PTIT/problems/P143PROJ/
Người Gửi: Dương Lee

  • Problem:

Quảng trường nhà hát thủ đô của Berland hình chữ nhật có kích thước n × m (m2). Nhân ngày lễ kỉ niệm thành phố, người ta quyết định lát quảng trường bằng các phiến đá grannite. Mỗi phiến đá có kích thước a × a (m2). Các cạch của phiến đá được lát song song với cạnh của quảng trường.
Cần ít nhất bao nhiêu phiến đá để lát kín quảng trường? Phần đá lát có thể lớn hơn diện tích quảng trường nhưng quảng trường phải được bao phu hết, và không được phép cắt các phiến đá ra.
Input
Dòng đầu tiên chứa 3 số nguyên n,  m và a (1 ≤  n, m, a ≤ 109).
Output
In ra số lượng phiến đá cần dùng.
Example:
Input
6 6 4
Output:
4

  • Solution:

- Bài này nếu lát vừa khít thì sẽ chia lấy số lượng đá lát thồi. 
- Nhưng nếu lát không vừa thì lấy phần nguyên và + 1 (Có nghĩa là lát tối đa số đá và lát thêm 1 hàng đá nữa cho vừa kín).

  • Code:

C:



JAVA:


P144PROI - ROUND 4I - Đoạn thẳng lớn nhất

P144PROI - ROUND 4I - Đoạn thẳng lớn nhất

Link Sub: http://www.spoj.com/PTIT/problems/P144PROI/
Người Gửi: Loo?

  • Problem:

Bạn được cho n đoạn thẳng trên tia Ox. Đoạn thứ i được bắt đầu từ điểm L[i] và kết thúc tại R[i]. Nhiệm vụ của bạn là tìm trong tập đoạn đã cho đoạn thẳng lớn nhất, bao trùm tất cả các tập đoạn còn lại.  
Hãy in ra chỉ số của đoạn thẳng đó, nếu không tồn tại thì in ra -1.
Đoạn [a,b] được gọi là bao trùm đoạn [c, d]  nếu a <= c <= d <= b.
Input
Dòng đầu tiên là số nguyên n(1 <= n <= 100).  
n dòng tiếp theo, mỗi dòng gồm 2 số nguyên L[i], R[i] (1<= L[i] <= R[i] <= 10^9) biểu diễn đoạn thứ i.  
Các đoạn được đánh số bắt đầu 1.
Output
In ra một số nguyên duy nhất là đáp án của bài toán. Input đảm bảo không có 2 đoạn thẳng nào trùng nhau.
Example:
Input
3
1 1
2 2
3 3
Output:
-1

Input
6
1 5
2 3
1 10
7 10
7 7
10 10
Output:
3
  • Solution:

Bao trùm tất cả có nghĩa là: Có một cặp left - right sao cho: left là nhỏ nhất và right là lớn nhất. Vậy thì chỉ cần tìm left min và right max là được. VD1: 1 1 2 3 left min = 1, right max = 3. Có nghĩa là phải có đoạn [1, 3] mới có thể bao trùm được tất cả. Nhưng không! Trên dãy kia không có đoạn [1, 3] nên in ra -1; VD2: 2 3 1 9 left min = 1, right max = 9. Có nghĩa là phải có đoạn [1, 9] mới có thể bao trùm được tất cả. Vâng! Trên dãy kia có đoạn [1, 9] nên ta sẽ in ra vị trí của [1 9];

  • Code:

C:



JAVA:


PTIT013A - Bài A - Số may mắn

PTIT013A - Bài A - Số may mắn

Link Sub: http://www.spoj.com/PTIT/problems/PTIT013A/
Người Gửi: Hikaru

  • Problem:

John rất thích con số 86 vì theo John đó là con số may mắn. Khi bắt gặp một số nguyên X John muốn kiểm tra xem trong dạng biểu diễn của nó kết thúc là số 86 hay không? Ví dụ số 111539786 kết thúc là  số 86, còn số 123456789 thì không. 
Nhiệm vụ của bạn là viết một chương trình đọc số nguyên X và kiểm tra xem trong dạng biểu diễn của nó kết thúc là số 86 hay không?

Input
Dữ liệu vào gồm nhiều bộ dữ liệu tương ứng với nhiều test. Dòng đầu tiên chứa một  số nguyên dương không lớn hơn 20 là số l ượng các bộ dữ liệu. Các dòng tiếp theo chứa các bộ dữ liệu.
Output
Với mỗi bộ dữ liệu, ghi ra trên một dòng câu trả lời, ghi số 1 nếu trong dạng biểu diễn của nó kết thúc là số 86, ghi số 0 trong trường hợp ngược lại.
Example:
Input
3
111539786
123456789
8686
Output:
1
0
1

  • Solution:

Bài này khá đơn giản khi các bạn chỉ cần lấy dư cho 100 và so sánh với 68.
Nếu không có thể nhập vào string và xử lí như trong code C++;

  • Code:
C:

https://pastebin.com/LZEG9j2w

#include <stdio.h>
 
int main () {
    int t;
    scanf ("%d", &t);
    for (int i=1; i<=t; i++) {
        long long n;
        scanf ("%lld", &n);
        if (n%100==86) printf ("1\n");
        else printf ("0\n");
    }
    return 0;
}


C++:

https://pastebin.com/Gw2LUJPw

#include <iostream>
#include <string>
using namespace std;
 
int main () {
    string s;
   
    int t;
    cin>>t;
    for (int i=1; i<=t; i++) {
        cin>>s;
        int len = s.length();
        if (s[len-1]=='6' && s[len-2]=='8') {
            cout<<"1"<<endl;
        } else cout<<"0"<<endl;
    }
    return 0;
}


JAVA:


BCTOHOP - Sinh tổ hợp (Cơ bản)

BCTOHOP - Sinh tổ hợp (Cơ bản)

Link Sub: http://www.spoj.com/PTIT/problems/BCTOHOP/
Người Gửi: Dương Lee

  • Problem:

Một tổ hợp chập k của n là một tập con k phần tử của tập n phần tử.
Chẳng hạn tập {1, 2, 3, 4} có các tổ hợp chập 2 là:
{1, 2}, {1, 3}, {1, 4}, {2, 3}, {2, 4}, {3, 4}
Vì trong tập hợp các phần thử không phân biệt thứ tự nên tập {1, 2} cũng là tập {2, 1}, do đó ta coi chúng chỉ là một tổ hợp.
Bạn hãy sinh hết tổ hợp chập của n phần tử, n phần tử gồm các số nguyên từ 1 đến n.
Các tập con in ra theo thứ tự từ điển. Ví dụ: {1, 2, 3, 4} < {1, 3, 2 4}.

Input
Một dòng duy nhất gồm 2 số nguyên n, k (1 <= k <= n <= 10)
Output
Mỗi một tổ hợp chập k in ra trên một dòng.
Example:
Input
4 2
Output:
1 2
1 3
1 4
2 3
2 4
3 4

  • Solution:

Code C: Sinh hoán vị thông thường; 
- Khởi tạo cấu hình ban đầu: 1 2 3 ... k; 
- Tìm vị trí mà tại đó phần tử [i] chưa đạt cấu hình cuối (!=n-k+i). Nếu không tìm thấy thì đã đạt cấu hình cuối (stop). 
- Tăng [i]++; và các phần tử sau nó [i+1]= [i]+1, [i+2]=[i]+2, ...

  • Code:
C:


C++:



JAVA:


BCQUEUE - Cấu trúc dữ liệu hàng đợi (queue) (Cơ bản)

BCQUEUE - Cấu trúc dữ liệu hàng đợi (queue) (Cơ bản)

Link Sub: http://www.spoj.com/PTIT/problems/BCQUEUE/
Người Gửi: Dương Lee

  • Problem:

Ban đầu cho một queue rỗng. Bạn cần thực hiện các truy vấn sau:
  1. Trả về kích thước của queue
  2. Kiểm tra xem queue có rỗng không, nếu có in ra “YES”, nếu không in ra “NO”.
  3. Cho một số nguyên và đẩy số nguyên này vào cuối queue.
  4. Loại bỏ phần tử ở đầu queue nếu queue không rỗng, nếu rỗng không cần thực hiện.
  5. Trả về phần tử ở đầu queue, nếu queue rỗng in ra -1.
  6. Trả về phần tử ở cuối queue, nếu queue rỗng in ra -1.

Input
Dòng đầu tiên chứa số nguyên n - lượng truy vấn (1 <= n <= 1000)  
N dòng tiếp theo, mỗi dòng sẽ ghi loại truy vấn như trên, với truy vấn loại 3 sẽ có thêm một số nguyên, không quá 10^6.
Output
In ra kết quả của các truy vấn.
Example:
Input
14
3 1
3 2
3 3
5
6
4
4
4
4
4
3 5
3 6
5
1
Output:
1
3
5
2

  • Solution:

Đây là bài cấu trúc dữ liệu cơ bản. 
Sơ lược qua: 
- Một queue gổm mảng giá trị, front (phần tử đầu tiên) và back (phần tử cuối cùng). 
- Hoạt động theo cơ chế FIFO: Vào trước tiên ra đầu tiên

  • Code:
C:



C++:



JAVA:


BCBIGNUM - Xử lý số nguyên lớn

BCBIGNUM - Xử lý số nguyên lớn

Link Sub: http://www.spoj.com/PTIT/problems/BCBIGNUM/
Người Gửi: Dương Lee

  • Problem:

Cho hai số nguyên dương A và B ( A & B có không quá 1000 chữ số )
Yêu cầu:  Tính A + B, A - B, A * B  
Chú ý: Khi kết quả là 0 các bạn phải in ra 0, nếu in -0 là sai  
Các chữ số 0 không có nghĩa ở đầu không được in ra. VD 013 thì phải in ra là 13, chữ số 0 ở đầu không có nghĩa  
Vì cách chấm ở đây là so sánh 2 FILE kết quả

Input
Dòng 1: số nguyên A  
Dòng 2: số nguyên B
Output
Dòng 1: Kết quả A + B  
Dòng 2: Kết quả A - B  
Dòng 3: Kết quả A * B
Example:
Input
10
11
Output:
21
-1
110

  • Solution:

Vì con số lên tới 1000 chữ số (Gần 10^1000) nên không thể lưu trữ dữ liệu và tính toán thông thường được. Ta phải chuyển về xử lý string. (1000 kí tự thì string xử lí thoải mái). B1: Xử lý chung: - Ta phải nhập vào A và B dưới dạng string - Chuyển nó về dạng Mảng các số đơn lẻ cùng độ dài (StrToNumArr) VD: A: 115 B: 45 -> Arr: 1 1 5 Brr: 0 4 5 B2: Với A+B. Ta sẽ cộng như cách cộng ở mẫu giáo: Cộng từng phần tử từ cuối về đầu i:(n-1 -> 0), Nếu phép công >10 thì lấy số cuối và nhớ 1 ở số tiếp theo. B3: Với A-B. - Đầu tiên xét xem A > B hay A < B (ss), A==B ->=0. - Lấy số lớn lớn trừ số bé theo quy tắc trừ ở mẫu giáo: Trừ từng phần tử từ cuối về đầu i:(n-1 -> 0). Nếu phép trừ <0 thì + thêm 10 và nhớ 1 ở số tiếp theo. - Sau khi tính xong thì lưu ý số in ra không có 0 ở đầu và phụ thuộc vào ss để xét xem có thêm dấu trừ đằng trước hay không. B4: Với A*B. - Sẽ cần thêm 2 mảng là Btg và Ctg với chiều dài =2*lenmax(A,B). - Nhân thông thường như tiểu học. Với mỗi dãy số của phép nhân từng phần tử sẽ được lưu vào Btg và cộng dồn vào Ctg (bằng hàm A+B bên trên).

  • Code:
C:

https://pastebin.com/r0QmcUx6

#include <stdio.h>
#include <string.h>
 
int StrToNumArr (char a[], char b[], int A[], int B[]) {
    int lenA = strlen (a);
    int lenB = strlen (b);
   
    int len;
    if (lenA>lenB) len=lenA;
    else len = lenB;
   
    lenA--;
    lenB--;
    for (int i=len-1; i>=0; i--) {
        if (lenA>=0) {
            A[i] = a[lenA]-'0';
            lenA--;
        } else A[i]=0;
       
        if (lenB>=0) {
            B[i] = b[lenB]-'0';
            lenB--;
        } else B[i]=0;
    }
    return len;
}
 
int SumBig (int A[], int B[], int len, int C[]) {
    for (int i=len-1; i>=0; i--) {
        if (i!=0) {
            int x = A[i]+B[i];
            C[i]=x%10;
            B[i-1]=B[i-1]+(x/10);
        } else C[i]=A[i]+B[i];
    }
    return len;
}
 
int ss (int A[], int B[], int len) {
    for (int i=0; i<len; i++) {
        if (A[i]>B[i]) return 1;
        else if (A[i]<B[i]) return -1;
    }
    return 0;
}
 
int MiBig (int A[], int B[], int len, int C[], int *dau) {
    int hs=ss (A, B, len);
    if (hs==0) return 0;
    *dau=hs;
    for (int i=len-1; i>=0; i--) {
        int x;
        if (hs==1) x=A[i]-B[i];
        else x=B[i]-A[i];
        if (i!=0) {
            if (x>=0) C[i]=x;
            else {
                C[i]=x+10;
                if (hs==1) B[i-1]=B[i-1]+1;
                else A[i-1]=A[i-1]+1;
            }
        } else {
            C[i]=x;
        }
    }
    for (int i=0; i<len; i++) {
        if (C[i]!=0) return (len-i);
    }
}
 
void sc (int A[], int B[], int len) {
    // Cop B -> A;
    for (int i=0; i<len; i++) {
        A[i]=B[i];
    }
}
 
int PrBig (int A[], int B[], int len, int C[]) {
    int Btg[2006];
    int Ctg[2006];
    int lenMax=2*len;
    for (int i=0; i<lenMax; i++) {
        Btg[i]=0;
        Ctg[i]=0;
    }
    for (int i=len-1; i>=0; i--) {
        lenMax--;
        int k=lenMax;
        for (int j=0; j<2*len; j++) {
            Btg[j]=0;
        }
        for (int j=len-1; j>=0; j--) {
            int x=Btg[k]+B[i]*A[j];
            Btg[k]=(x)%10;
            Btg[k-1]=(x)/10;
            k--;
        }
        SumBig (Ctg, Btg, 2*len, C);
        sc (Ctg, C, 2*len);
    }
    for (int i=0; i<2*len; i++) {
        if (C[i]!=0) return (2*len-i);
    }
    return 0;
}
 
int main () {
    char a[1001] = "";
    char b[1001] = "";
    scanf ("%s%s", a, b);
    int len;
   
   
   
    int As[1003];
    int Bs[1003];
    int Sum[1003];
    len = StrToNumArr (a, b, As, Bs);
    int lenSum = SumBig (As, Bs, len, Sum);
    for (int i=0; i<lenSum; i++) {
        printf ("%d", Sum[i]);
    }
    printf ("\n");
   
    int Am[1003];
    int Bm[1003];
    len = StrToNumArr (a, b, Am, Bm);
    int Mi[1003];
    int dau=1;
    int lenMi = MiBig (Am, Bm, len, Mi, &dau);
    if (lenMi==0) printf ("0");
    else {
        if (dau==-1) printf ("-");
        for (int i=len-lenMi; i<len; i++) {
            printf ("%d", Mi[i]);
        }
    }
    printf ("\n");
   
    int Ap[1003];
    int Bp[1003];
    len = StrToNumArr (a, b, Ap, Bp);
    int Pr[2006];
    int lenPr = PrBig (Ap, Bp, len, Pr);
    if (lenPr==0) printf ("0");
    else {
        for (int i=2*len-lenPr; i<2*len; i++) {
            printf ("%d", Pr[i]);
        }
    }
   
    return 0;
}

C++:

JAVA:


SUMDIV - Tổng ước

SUMDIV - Tổng ước

Link Sub: http://www.spoj.com/PTIT/problems/SUMDIV/
Người Gửi: Darkness

  • Problem:

Tính tổng các ước của số n (n≤10^12).

Input
Dòng đầu chứa số bộ test.  
Các dòng sau, mỗi dòng chứa 1 số nguyên dương n (n≤10^12).
Output
Mỗi test in trên 1 dòng chứa 1 số nguyên là tổng các ước của test tương ứng.
Example:
Input
2
5
6
Output:
6
12

  • Solution:

- Tìm các ước trong khoảng i:[1, sqrt(n)). 
- Với mỗi giá trị tìm được ta có 2 ước là i và n/i; 
Chú ý nếu là số chính phương thì ta có thêm một ước là sqrt (n).

  • Code:
C:



C++:



JAVA:


BCGCD - Ước chung lớn nhất, bội chung nhỏ nhất (Cơ bản)

BCGCD - Ước chung lớn nhất, bội chung nhỏ nhất (Cơ bản)

Link Sub: http://www.spoj.com/PTIT/problems/BCGCD/
Người Gửi: Dương Lee

  • Problem:

Tìm UCLN và BCNN của 2 số.

Input
Gồm nhiều test, mỗi test trên 1 dòng chứa 2 số nguyên dương không quá 2^31  
Bộ test kết thúc bởi dòng chứa 2 số 0.
Output
Mỗi test xuất ra trên 1 dòng chứa 2 số cách nhau bởi dấu cách lần lượt là UCLN và BCNN.
Example:
Input
2 4
6 9
0 0
Output:
2 4
3 18

  • Solution:

UCLN: Áp dụng phép chia lấy dư trong giải thuật Euclid. 
BCNN: Áp dụng công thức UCLN(a,b) = (a*b)/(BCNN(a,b)) trong giải thuật Euclid.

  • Code:
C:



C++:



JAVA:


BCSTACK - Cấu trúc dữ liệu ngăn xếp (stack) (Cơ bản)

BCSTACK - Cấu trúc dữ liệu ngăn xếp (stack) (Cơ bản)

Link Sub: http://www.spoj.com/PTIT/problems/BCSTACK/
Người Gửi: Dương Lee

  • Problem:

Bài này sẽ luyện cho bạn các thao tác cài đặt cấu trúc dữ liệu ngăn xếp (stack). 
Nếu đã cài đặt thành công, hãy tìm hiểu cách sử dụng container stack trong STL và cài đặt nó.  
Thao tác:  
-          1. ‘init’ : Khởi tạo stack rỗng.  
-          2. ‘push x’: Thêm phần tử x vào stack. (x là số nguyên dương không quá 10 mũ 9)  
-          3. ‘pop’: Nếu stack không rỗng lấy ra phần tử ở đỉnh stack.  
-          4. ‘top’: Trả về phần tử ở đỉnh stack. Nếu stack rỗng, trả về -1.  
-          5. ‘size:’ Trả về kích thước stack (số phần tử hiện tại của stack).  
-          6. ‘empty’: Kiểm tra stack rỗng hay không, nếu rỗng trả về 1, ngược lại là 0.  
-          7. ‘end’: Kết thúc chương trình.

Input
Gồm nhiều dòng mô tả các thao tác như trên (số phần tử của stack luôn không quá 1000).
Output
Khi gặp các thao tác 4,5,6 các bạn in ra trên 1 dòng tương ứng với câu trả lời.
Example:
Input
init
empty
push 2
empty
top
push 1
size
top
pop
top
init
push 1
top
init
top
end
Output:
1
0
2
2
1
2
1
-1

  • Solution:

Đây là bài cấu trúc dữ liệu cơ bản.
Sơ lược qua:
- Stack có dạng: mảng chứa các giá trị và Top để lấy phần tử ở đỉnh stack và kiểm tra stack.
- Họat động theo cơ chế: Vào cuối cùng thì ra đầu tiên.

  • Code:
C:



C++:



JAVA:


BCSAPXEP - Sắp xếp (Cơ bản)

BCSAPXEP - Sắp xếp (Cơ bản)

Link Sub: http://www.spoj.com/PTIT/problems/BCSAPXEP/
Người Gửi: Dương Lee

  • Problem:

Sắp xếp dãy tăng dần.

Input
- Dòng đầu chứa số n ( số phần tử của dãy 1<=n<=1000)  
- n dòng sau, mỗi dòng là 1 phần tử của dãy (giá trị tuyệt đối không quá 1000)
Output
Mỗi phần tử của dãy in trên 1 dòng, theo thứ tự tăng dần.
Example:
Input
3
3
2
1
Output:
1
2
3

  • Solution:

Code C:
Sắp xếp nổi bọt. Với mỗi phần tử [i] chọn được (i: 0 -> n-1) thì sẽ đẩy nó lên trên cao nhất có thể (SX: tăng dần hoặc giảm dần).

  • Code:
C:



C++:



JAVA:


BCPERMU - Liệt kê hoán vị (Cơ bản)

BCPERMU - Liệt kê hoán vị (Cơ bản)

Link Sub: http://www.spoj.com/PTIT/problems/BCPERMU/
Người Gửi: Dương Lee

  • Problem:

Liệt kê hoán vị của n phần tử của một tập gồm các số từ 1->n.

Input
Dòng duy nhất chứa số n (1<=n<=8)
Output
Các hoán vị sắp xếp theo thứ tự từ điển tăng dần.
Example:
Input
3
Output:
123
132
213
231
312
321

  • Solution:

Code C: 
- Sinh hoán vị thông thường: 
+ Khởi tạo cấu hình ban đầu: 1 2 3 ... n 
+ Tìm vt mà tại đó dãy mất tính tăng (vt: n-1 -> 0): Nếu không tìm thấy thì dãy đã đạt cấu hình cuối (Kết thúc). 
+ Tìm phần tử [i] đầu tiên > phần tư [vt] và đổi chỗ chúng (i: n-1 -> 0). 
+ Sau khi đổi chỗ thì cập nhập lại tất cả các phần tử sau vt tăng dần (i: vt+1 -> n-1).

  • Code:
C:



C++:



JAVA: