but I've a feeling it's a problem with data types between strings and ints.
You're close; it's actually because of the way you are doing the math:
int targetHeartRateMin = (50/100) * getMaxHeartRate();
int targetHeartRateMax = (85/100) * getMaxHeartRate();
in this expression, the (50/100) and (85/100) values consist of int's. What this means is that the division will have a result that is an int; the problem is that since 50/100 is 0.5, the int result is 0; same with 85/100 (it rounds down as well). so you end up multiplying it by zero. The solution is to force that calculation to be a float:
int targetHeartRateMin = (int)((50f/100f) * getMaxHeartRate());
int targetHeartRateMax = (int)((85f/100f) * getMaxHeartRate());
Basically, the f makes the literals floats, so their result will also be a float, and a float multiplied by a int will be a float as well, and that get's cast to an int... I made that sound way more complicated than it is.
Another note, is that you might want to store the Result of getMaxHeartRate() beforehand, particularly if it asks for user input; if so you would need to enter the age twice.