scientific numbers in C++

Hello group,

In a calculation I'm counting which gives result in scientifice number due to using Factorial such
26!/(26-4)! and ...

What varaible can I use? do I need to use template in C++? or how about PHP/JavaScript if you want to implement it in Web (either one)

Your help will be appreciated greatly.

Regards,
Amit
akohanAsked:
Who is Participating?
 
rstaveleyCommented:
If you get paid by the line of code you write, you need to make it more complicated looking. Ozo's solution will pay you less money than the following, which is much harder to read and altogether less efficient.

If you can write this in a higher level language and make it even less efficient and complicated looking, you might even justify the budget for dedicated hardware.

[Dammit, I've been working for corporates for too long ;-) ]
#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>
#include <numeric>
 
class DecrementorGen {
	int current;
public:
	DecrementorGen(int current) : current(current) {}
	int operator()() {
	        return current--;
	}
};
 
int main()
{
	std::vector<int> v(25-21);
	generate(v.begin(), v.end(), DecrementorGen(25));
	std::cout << accumulate(v.begin(), v.end(), 1, std::multiplies<int>()) << std::endl;
}

Open in new window

0
 
ozoCommented:
printf("%d\n",25*24*23*21);
0
 
ozoCommented:
Sorry, that should have been
26*25*24*23
0
Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

 
Infinity08Commented:
>> What varaible can I use?

A normal 32bit int should be fine, assuming that you calculate it correctly. Do NOT try to store 26! in it ;) A 32bit int can't hold the result :) Calculate like ozo showed.


>> do I need to use template in C++?

I do not see why ? This is a simple calculation ... Or do you want to make your code generic to calculate x!/(x-y)! ??
0
 
itsmeandnobodyelseCommented:
358800
0
 
itsmeandnobodyelseCommented:
>>>> Or do you want to make your code generic to calculate x!/(x-y)! ??

#ifdef WIN32
typedef __uint64 UInt64;
#else
typdef unsigned longlong UInt64;
#endif

 UInt64  calcYfromX(unsigned int x, unsigned int y)
 {
    UInt64 ui = 1;
    for (int i = 0; i < y; ++i)
           ui*=(x - i);
    return ui;
 }

Regards, Alex
0
 
Infinity08Commented:
To be extra safe, you might want to check the input x and y values for overflow ... If the difference between them is too small, the result will not be correct.
0
 
evilrixSenior Software Engineer (Avast)Commented:
If the numbers are known at compile time you can use a template meta-function to calculate these. There are two advantages: -

1. You'll know at compile time if the result overflows the data type used (compile time warning)
2. The cost of calculation is at compile time and not runtime (as runtime they are just constant values)

I stress, this will only work if you know the values you wish to calculate the factorials for at compile time!

More reading: -

http://ubiety.uwaterloo.ca/~tveldhui/papers/Template-Metaprograms/meta-art.html
http://en.wikipedia.org/wiki/Template_metaprogramming

// A big type to hold factorial result
typedef unsigned long long bignum_t;
 
// Recursive template meta-function to calculate factorial at compile time
template <unsigned short N>
struct Factorial
{
	static bignum_t const value = N * Factorial<N - 1>::value;
};
 
// Specialized template meta-function to end recursion
template <>
struct Factorial<1>
{
	static bignum_t const value = 1;
};
 
int main()
{
	// This is calculated at compile time so there is no runtime cost
	bignum_t num = Factorial<10>::value; // Example for 10 (num == 3628800)
	return 0;
}

Open in new window

0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.