30/09/2018, 16:09

Tính tổng các ước của n số nhập vào từ bàn phím

Đề bài như thế này

Tính tổng các ước của n số nhập vào từ bàn phím

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 

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 đó.

n: số bộ test mình cần kiểm tra ví dụ:

Input:
2
5
6
Ouput:
6 
12

Đây là Code của em. Cách này tuy đúng nhưng time chạy có vẻ lâu, mọi người còn cách nào chạy nhanh hơn không ạ?? Tối ưu nó càng chạy nhanh càng tốt. Em cảm ơn ạ!!

#include<iostream>
#include<math.h>
using namespace std;
void tong(int &a){
	int s  =0;
	for(int i = 1 ;i <= a; i++){
		if(a % i == 0){
			s += i;
		}		
	}
	cout << s << endl;
}
int main(){
	int n;
	cout << "nhap so n = ";
	cin >> n;
	int b[100];
	cout << "nhap cac so can tinh : ";
	for(int i=0;i<n;i++){
		cin >> b[i];
	}
	cout << "ket qua la : " << endl;
	for(int i=0;i<n;i++){
		tong(b[i]);
	}
}
Nguyễn Minh Dũng viết 18:13 ngày 30/09/2018

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

Anh chưa hiểu cái này là sao @Kudoshinichi, em giải thích kỹ hơn được không?

int b[100];

Em đừng đặt tên là b nha, không có ý nghĩa gì. Em có thể khai báo

int mang_so[100];

Cho anh hỏi thêm, ước là sao ta? Tức là các số chia hết hay sao. Ví dụ 10 có các ước
1 2 5 hả?

Kudoshinichi viết 18:16 ngày 30/09/2018

n: số bộ test mình cần kiểm tra ví dụ:
Input:
2
5
6
Ouput:
6
12

Nguyễn Minh Dũng viết 18:20 ngày 30/09/2018

Vậy trong bài của em chưa có đọc file?

Kudoshinichi viết 18:21 ngày 30/09/2018

vâng, em sẽ chú ý chỗ mảng

Kudoshinichi viết 18:15 ngày 30/09/2018

thì em chỉ chạy vài test thôi anh nên em dùng mảng để nhập từ bàn phím ạ

Kudoshinichi viết 18:25 ngày 30/09/2018

10 thì là 1,2,5,10 mà anh
:v

Kudoshinichi viết 18:20 ngày 30/09/2018

em chỉ cần tối ưu sao cho nó chạy nhanh hơn thôi vì em nghĩ cách này cổ xưa quá. Nhưng chưa nghĩ ra .hi

Nguyễn Minh Dũng viết 18:17 ngày 30/09/2018

@Kudoshinichi ơi, diễn đàn mình không phải là Facebook, mình không nên viết 1 câu, rồi post một bài như vậy. Như vậy em sẽ thấy là nội dung câu hỏi sẽ bị rời rạc không. Hãy tập trung viết trong một post thôi.

Anh thấy bài em khá ổn đấy, như vậy là được rồi

Kudoshinichi viết 18:12 ngày 30/09/2018

vâng, em sẽ lưu ý, nhưng có cách nào chạy nhanh hơn ko anh, em muốn giảm cái vòng lặp for kia đi nữa cơ anh ạ

Nguyễn Minh Dũng viết 18:24 ngày 30/09/2018
void tong(int &a){
    int s = 0;
    for(int i = 1 ;i <= a; i++){
        if(a % i == 0){
            s += i;
        }       
    }
    cout << s << endl;
}

Ý em là vòng lặp for này? Anh nghĩ như vậy là ổn

Kudoshinichi viết 18:22 ngày 30/09/2018

vâng ý em là chỗ đó đấy ạ, giả sử mình cần tính tổng các ước của số 1000 thì nó phải lặp tận 1000 à anh, phải làm sao cho nó chạy nhanh đc đây anh

Nguyễn Minh Dũng viết 18:23 ngày 30/09/2018

Em sửa điều kiện lại thành

for(int i = 1; i <= sqrt(a); i++)

Bời vì nếu giả sử tìm ước của n thì ta có

n / a = b;
=> a*b = n

a lớn nhất khi a == b

=> a <= sqrt(n) (sqrt = căn bậc 2)

Kudoshinichi viết 18:18 ngày 30/09/2018

ok, tks anh ạ

Nguyễn Minh Dũng viết 18:11 ngày 30/09/2018

@Gio Bạn muốn đặt câu hỏi hay sao?

Gió viết 18:16 ngày 30/09/2018

Làm sao chèn Latex để điền công thức toán vậy? Hình như cái này chưa hỗ trợ

Nguyễn Minh Dũng viết 18:20 ngày 30/09/2018

Cái này chưa hỗ trợ @Gio ơi.

Bùi Ngọc Minh viết 18:19 ngày 30/09/2018

Giờ em ví dụ số 12. Nếu chạy đến sqrt(12) thì sẽ chỉ chạy đến 3,3. Thiếu mất ước bằng 6 anh ạ

Student X viết 18:16 ngày 30/09/2018

Bạn đưa về bài toán phân tích số n thành tích các số nguyên tố. Giả sử số n phân tích thành tích của m số nguyên tố. Thì output sẽ bằng 2 mũ m.

Student X viết 18:13 ngày 30/09/2018

A xl. Mình nhầm một xíu

rogp10 viết 18:21 ngày 30/09/2018

Giờ em ví dụ số 12. Nếu chạy đến sqrt(12) thì sẽ chỉ chạy đến 3,3. Thiếu mất ước bằng 6 anh ạ

Một lần bạn lấy được cả hai số nhé, không sót đâu. 2*6 = 12 thì bạn lấy được cả số 6 rồi còn gì.

Bạn đưa về bài toán phân tích số n thành tích các số nguyên tố. Giả sử số n phân tích thành tích của m số nguyên tố. Thì output sẽ bằng 2 mũ m.

Áp dụng quy nạp trên số thừa số nguyên tố cũng đc.

Để tránh phải dùng tính chất UFD của N* ta c/m từ một u | mn sẽ phân tích được u = dd’ (d | m && d’ | n) duy nhất.
Đầu tiên ta c/m gcd(d, d’) = 1 với mọi (d, d’) thỏa mãn. Giả sử điều ngược lại, vậy gcd(d, d’) chia hết cả m và n, dẫn đến mâu thuẫn. Sau đó đặt d1, d’1 tương ứng sao cho dd’ = d1d’1 (hay d/d’1 = d1/d’), nhưng hai phân số này đều tối giản, suy ra đpcm.

Vậy sigma(d|m) d * sigma(d’|n) d’ = sigma(dd’ | mn) dd’ (do (d, d’) -> dd’ là một-một), hay sigma(m)sigma(n) = sigma(mn).

Bài liên quan
0