Cộng các chữ số trong 1 số cho tới khi còn 1 số ví dụ sumDigit(129): 1+2+9 = 12 => 1+2 = 3

Yêu cầu: Thực hiện hàm sumDigit(x, k) với k là số lần lặp lại của x
Ví dụ: sumDigit(2, 4) = sumDigit(2222) = sumDigit(2+2+2+2) = sumDigit(8) = 8
Giải thích: số x = 2 được lặp lại k = 4 lần là 2222 sau đó áp dụng hàm sumDigit(2222).

Mình đã làm như thế này, nhưng vẫn sai 1 số trường hợp, các bác giúp mình với

int tongCacChuSo(int n) {
	static int sum = 0;
	while (n != 0) {
		sum += n % 10;
		n /= 10;
	}
	return sum;
}

int sumDigitt(string n, int k) {
	int i = stoi(n);
	if (k != 0) {
		int sum = i * k;
		if (sum >= 10) { //Sum >= 10, we get the sum of each element of this sum
			if (sum % 9 == 0)
				return 9;
			else {
				return sum % 9;
			}
		}
		else {
			return sum;
		}
	}
	else {//Khi k == 0, se co 2 truong hop (9,0) => return 9, hoac (23, 0)
		int digit = tongCacChuSo(i);
		if (digit <= 9)
			return digit;
		else if (digit % 9 == 0)
			return 9;
		else
			return digit % 9;
	}
}

Mình xác nhận lại đề xíu. :slight_smile:

Như case x = “23” và k = 4 thì out sẽ là 20?

1 Like

Mình chỉnh lại rồi, dù là sumDigit(“23”, 10) sẽ ra 5. Mà testcase thì vẫn thiếu 1 số TH

Sao lại 5 nhỉ. :thinking:

Minh tưởng kết quả đúng phải là 50.

Cộng cho đến khi còn 1 số.

14678 => 1+4+6+7+8 = 26 => 2+6 = 8
1234567890 => 1+2+3+4+5+6+7+8+9+0 = 45 => 4+5 = 9

1234567890 (k = 5) => (1+2+3+4+5+6+7+8+9+0)*5 = 225 => 2+2+5 = 9

Có dùng đến đệ quy chứ nhỉ.
Nếu tham số đầu vào là chuỗi thì có thể đây là chuỗi số cực dài, khi dùng stoi() có thể bị tràn số. Nên tách từng số (chỉ 1 chữ số >= 0 && <= 9) rồi gọi stoi() và tính toán.

3 Likes

Bạn xem thử, đây là code Java

// Tính tổng các chữ số
static int recursion(int n) {
	if (n == 0) {
		return 0;
	}
	return recursion(n / 10) + n % 10;
}

static int sumDigit(int n) {
	if (n < 10) {
		return n;
	}
	int sum = recursion(n);
	return sumDigit(sum);
}

static int sumDigit(int n, int k) {
	return sumDigit(k * n);
}

public static void main(String[] args) {
	System.out.println(sumDigit(23, 10));
}
1 Like

Đọc kĩ đề kìa m.

Cộng các chữ số trong 1 số cho tới khi còn 1 số

Thực ra là còn 1 chữ số. Như Situ Ca lấy vd kìa. :slight_smile:

3 Likes

Viết xong nhưng không biết đúng sai :smile:

unsigned long long sumDigit(unsigned long long input, unsigned long long k){
    if(k==0) k=1;
    std::string baseStr = std::to_string(input);
    unsigned long long baseLen = baseStr.length();
    unsigned long long bufferLen = baseLen*k;
    char *buffer = new char[bufferLen];
    for(unsigned long long i=0;i<bufferLen;i+=baseLen){
        memcpy(buffer+i,baseStr.c_str(),baseLen);
    }
    std::string inputStr = std::string(buffer);
    delete [] buffer;
    while (bufferLen>1) {
        input=0;
        for(unsigned long long i=0;i<bufferLen;i++){
            input+=static_cast<unsigned int>(inputStr[i]-'0');
        }
        inputStr.clear();
        inputStr = std::to_string(input);
        bufferLen= inputStr.length();
    }
    inputStr.clear();
    return input;
}

Kết quả :

sumDigit(25332423543,1023345) = 9
4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?