What are the means for reducing it?
It depends if you want to reduce the height of the CPU usage spike or the duration of your lenghty computation or both.
So if your app is using 100% CPU for one minute, do you want to "reduce" it to "50% over 2 minutes" or "100% over 30 seconds" or "50% over 1 minute"?
These are all different.
For example, say you wanted to make sure that an application is never using more than 50% of the computing power of a dual-core machine (I'm not saying it's a good thing to do, I'm just giving an example), then there's a very easy way to do it: you could set the "CPU affinity" of your program to only one of the two cores. Note that I don't recommend to do it in your case: all I'm saying here is, for the sake of completeness, that it exists, it has valid uses, and there's a reason why both Linux and Windows developers have written APIs and end-user commands allowing to set the CPU affinity on a per-process basis (these functionalities are fully available both to programmers and to end-users).
Now if you want to reduce the duration of lenghty computation, you have to optimize your application so that it uses less resources (for example by using an algorithm that is best suited to your problem).
Is it acceptable for a process to take 99% of CPU when no other process is running?
It depends on your requirements. Usually yes, it is not only acceptable but also common.