iseng2 buka-buka buku “Programming Challenge” karya Steven S. Skiena dan Miguel A. Revilla, hasil rampasan dari kak ahmad.
pada soal pada bab “Arithmetic and Algebra” ada soal berjudul “Reverse and Add”, soalnya seperti ini: (maaf g d translate ^^)
PC/UVa IDs: 110502/10018, Popularity: A, Success rate: low Level: 1
The reverse and add function… starts with a number, reverses its digits, and adds the reverse to the original. If the sum is not a palindrome (meaning it does not give the same number read from left to right and right to left), we repeat this procedure until it does.
For example, if we start with 195 as the initial number, we get 9,339 as the resulting palindrome after the fourth addition:
195 786 1,473 5,214
591 687 3,741 4,125
+ —– + —— + —— + ——
786 1,473 5,214 9,339
This method leads to palindromes in a few steps for almost all of the integers. But there are interesting exceptions. 196 is the first number for which no palindrome has been found. It has never been proven, however, that no such palindrome exists.
You must write a program that takes a given number and gives the resulting palindrome (if one exists) and the number of iterations/additions it took to find it.
You may assume that all the numbers used as test data will terminate in an answer with less than 1,000 iterations (additions), and yield a palindrome that is not greater than 4,294,967,295.
Input
The first line will contain an integer N (0 < N ≤ 100), giving the number of test cases, while the next N lines each contain a single integer P whose palindrome you are to compute.
Output
For each of the N integers, print a line giving the minimum number of iterations to find the palindrome, a single space, and then the resulting palindrome itself.
Sample Input
3
195
265
750
Sample Output
4 9339
5 45254
3 6666
jadi inti dari soal diatas kurang lebih gini:
“dikasih sebuah bilangan, kemudian bilangan itu dibalik/reverse (misal 591 menjadi 195), setelah dibalik kemudian dijumlahkan dengan bentuk asal (591 + 195)”. Proses ini terus menerus berulang hingga ditemukan bilangan yang palindrome (dibaca dari kiri-kanan dan kanan-kiri sama saja). jika bilangan palindrome ditemukan proses akan berhenti dan output dari program adalah jumlah berapa kali proses dilakukan hingga ditemukan palindrome dan bilangan palindrome itu sendiri”
setelah googling kesana-kemari (*menjadipencurialgoritmaorang) akhirnya ketemu juga algoritma untuk membalik bilangan (n):
int reverse(int n) {
int m = 0
while(n>0) {
m *= 10
m += n%10
n /= 10
}
return m;
}
proses yang kedua adalah menambahkan (m) dengan (n) dan hasilnya di cek apakah sudah palindrome atau belum, sebagai catatan pada soal diatas jumlah iterasi dibatasi hanya 1000 kali:
do{
reverse_result = reverse(n)
add = n + reverse_result
i++
if(i>=1000) break
n = add
}while(n!=reverse(n))
print i,n
dua fungsi diatas tentu saja belum menyelesaikan masalah diatas, satu masalah lagi adalah pada input diatas. Input program adalah N (jumlah input bilangan yang akan diproses) dan sejumlah N bilangan yang di-input. untuk mengatasi program ini dapat digunakan array. 2 kali perulangan, perulangan pertama untuk input dan perulangan keduan untuk proses masing-masing bilangan.
(yang ini belum dibuat, ditunggu tambahan program ini dari temen2, thx bFore)
*y,,sampe disini tulisan kali ini, maaf belum bisa tuntas, hanya ingin iseng2 nulis saja.
*
*ditunggu saran dan kritiknya*