2010-04-21 44 views
11

Tôi đang tìm kiếm thuật toán tổng hợp chữ số. Để tôi phác thảo nguyên tắc cơ bản:Thuật toán để tổng hợp chữ số?

Giả sử bạn có một số: 18268.

1 + 8 + 2 + 6 + 8 = 25 

2 + 5 = 7 

Và 7 là số cuối cùng của chúng tôi. Về cơ bản, việc thêm từng số của toàn bộ số cho đến khi chúng tôi nhận được một chữ số (còn được gọi là 'cốt lõi'). Nó thường được sử dụng bởi các nhà toán học.

Tôi đang tìm kiếm một thuật toán (không phải là ngôn ngữ cụ thể) cho việc này. Tôi đã tìm kiếm Google trong một giờ qua với các điều khoản như digit sum algorithm và không có kết quả phù hợp.

Bất kỳ trợ giúp nào cũng tuyệt vời, cảm ơn.

+0

bài tập về nhà? bạn đã nghĩ gì cho đến nay? – Anycorn

+0

Xem thêm: http://stackoverflow.com/questions/478968/sum-of-digits-in-c –

+0

Không, không phải bài tập về nhà. Mặc dù tôi có thể thấy cách bạn sẽ nhầm lẫn nó. Điều khó khăn nhất chúng tôi làm ở trường đại học để làm với lập trình là xử lý tệp. : P – Joe

Trả lời

29

Vì 10-1 = 9, một lý thuyết số ít sẽ cho bạn rằng câu trả lời chính thức chỉ là n mod 9. Dưới đây là code:

ans = n%9; 
if(ans==0 && n>0) ans=9; 
return ans; 

Ví dụ: 18.268% 9 là 7. (xem thêm:. Casting out nines)

+0

cần phải lặp nó – Timmy

+3

Không, bạn có thể làm việc đó ra. – Larry

+2

@Timmy: Không, bạn không cần lặp lại. Lấy bút và giấy, và làm việc cho chính mình. (Nó hoạt động vì tổng các chữ số là một biến thể bất biến 9.) – ShreevatsaR

3

tôi sẽ cố gắng này:

int number = 18268; 
int core = number; 
int total = 0; 

while(core > 10) 
{ 
    total = 0; 
    number = core; 
    while(number > 0) 
    { 
     total += number % 10; 
     number /= 10; 
    } 

    core = total; 
} 
+0

bạn sẽ muốn thực hiện việc này lặp đi lặp lại cho đến khi abs (tổng cộng) nhỏ hơn 10 và sau đó bạn sẽ có số lõi của bạn. – Chad

+0

có vẻ không đúng. bạn chỉ đang thực hiện một lần tổng kết. bạn cần một vòng lặp khác hoặc đệ quy – Anycorn

1
  1. Mod toàn bộ số bằng 10
  2. Thêm số vào một mảng.
  3. Thêm toàn bộ mảng.
+1

+1 để cung cấp điểm khởi đầu tốt nhưng không làm bài tập về nhà của OP. –

+0

Nó không phải là bài tập về nhà, Bob.:) Và cảm ơn bạn cho điểm khởi đầu, tôi có thể làm việc trong đầu nơi nó đang đi;) – Joe

2

Không hoạt động với số âm, nhưng tôi không biết cách bạn xử lý bằng bất kỳ cách nào. Bạn cũng có thể thay đổi f(x) được lặp đi lặp lại:

sum(x) = 
    while ((x = f(x)) >= 10); 
    return x; 

f(x) = 
    if (x >= 10) return f(x/10) + x % 10 
    return x 

Bạn cũng có thể tận dụng lợi thế của lý thuyết số, đem lại cho bạn này f(x):

f(x) = 
    if (x == 0) return 0 
    return x % 9 
0
int number = 18268; 
int total = 0; 

while(number > 0) 
{ 
    total += number % 10; 
    total = total%10; 
    number /= 10; 
} 
0

này là từ một thời gian rất dài trước đây, nhưng giải pháp tốt nhất tôi có cho điều này là:

int digitSum(int num){ 
    if (num < 10) return num; 
    else return (n-1)%9+1; 
} 

Tôi không biết tốt hơn bao nhiêu đây là, nhưng nó sẽ chiếm chia hết cho 9 con số dễ dàng. Chỉ là một thuật toán tuyệt vời.

Các vấn đề liên quan