Av: Didrik Pemmer Aalen
Et Harshadtall er definert som et positivt tall som er delelig med summen av alle sifferne i tallet. I noen tilfeller er summen av alle sifferne i tallet et primtall. Disse kaller vi Harshadprimtall.
1729 er et Harshadtall fordi 1 + 7 + 2 + 9 = 19 og 1729 % 19 = 0. Dette er også et Harshadprimtall, fordi 19 er et primtall.
1730 er ikke et Harshadtall fordi 1 + 7 + 3 + 0 = 11 og 1730 % 11 = 3.
Hvor mange tall fra 1 til og med 98765432 er Harshadprimtall?
@bobcat4
Det man gjør her er vel egentlig en 64bit * 32bit multiplikasjon og henter ut de øverste 64 bitene. På en del plattformer finnes det en egen instruksjon som gjør 64bit * 64bit og returnerer de øverste bitene samtidig som de laveste bitene havner i et register, og jeg tror det er den de prøver å trigge her. Men det kan virke som Armv8 mangler denne:
https://developer.arm.com/docs/den0024/latest/the-a64-instruction-set/data-processing-instructions/multiply-and-divide-instructions
Men vi trenger vel her bare de øverste 64 bitene, så da tror jeg instruksjonen UMULH gjør det du trenger uten behov for noe uint128. Så spørs det om det finnes noen compiler intrinsic for denne eller om du må ty til inline assembly?
EDIT: Ser ut som __uint128_t gjør nettopp dette og burde vært støttet på både GCC og clang (men kanskje din er for gammel?)
Se mer diskusjon rundt temaet her:
https://stackoverflow.com/questions/28868367/getting-the-high-part-of-64-bit-integer-multiplication/51587262