![]() |
![]() |
#1 |
22×2,273 Posts |
![]()
I'm a complete noob when it comes to programming in c, but you have to start somewhere. I ran into a question about factorials. Can you use "n!"? It didnt work for me, I instead went about it the long way,
# include <stdio.h> int main (void) { int n, n1 = 1, n2 = 2, n3 = 3, n4 = 4, n5 = 5, n6 = 6, n7 = 7, n8 = 8, n9 = 9, n10 = 10, nResult; printf("-n- -n!\n\n"); printf( "%i %2i\n" , n1 , nResult = n1); printf( "%i %2i\n", n2, nResult = n1 * n2); printf( "%i %2i\n", n3, nResult = n1 * n2 * n3); printf( "%i %2i\n", n4, nResult = n1 * n2 * n3 * n4); printf( "%i %2i\n", n5, nResult = n1 * n2 * n3 *n4 * n5); and so on.... } Whats an easier way? |
![]() |
![]() |
#2 |
Account Deleted
"Tim Sorbera"
Aug 2006
San Antonio, TX USA
17×251 Posts |
![]() |
![]() |
![]() |
![]() |
#3 |
"Brian"
Jul 2007
The Netherlands
CC516 Posts |
![]()
In case the methods in Mini-Geek's link are too advanced for the moment, here a few comments which might help you improve your own program:
- It's neater and more generic to have a counting variable to which you add one each time instead of storing 1, 2, 3, ... in individual variables. Then instead of recalculating n1*n2*n3*... from the start in each step it would be more efficient to hold each intermediate result (1, 2, 6, 24, ...) in a variable and multiply that variable by the counting variable each time. So when you have reached 4!=24 you add one to the count and multiply 24 by the new count of 5 to get the next result. You will need to write a loop (hint: for, while or do). - Your integer variable nResult will soon overflow. (The examples in Mini-Geek's link don't take this into account either!) You could test to see if overflow has occurred at each stage (hint: try dividing back and see if you get the previous answer) and stop when this happens. If your compiler supports the "long long" type you can continue the process a bit further than with ordinary integers. Last fiddled with by Brian-E on 2009-10-01 at 12:24 |
![]() |
![]() |
![]() |
#4 | |
Nov 2003
22×5×373 Posts |
![]() Quote:
You do realize that the multiplication of two integers can overflow? Do you know how to code recursive functions in any language (i.e. not specifically C?). If not, may I assume that you at least know how to code a simple loop? Do you have any understanding of multi-precision arithmetic? Aside from the issue of the choice of programming language, may I suggest that you read about coding arithmetic algorithms? Start with Knuth "The Art of Computer Programming", vol 2. There are many issues involved in coding n! that are separate from the choice of coding language. |
|
![]() |
![]() |
![]() |
#5 |
Account Deleted
"Tim Sorbera"
Aug 2006
San Antonio, TX USA
426710 Posts |
![]()
Here's an example in Java that uses BigInteger, an arbitrary-precision integer, and prints every factorial up to the size you specify:
Code:
import java.math.BigInteger; public class Main { public static void main(String[] args) { factorialWithBigIntNoDiv(100); } public static void factorialWithBigIntNoDiv(long n) { BigInteger fact = BigInteger.ONE; for (BigInteger i = fact; i.compareTo(BigInteger.valueOf(n)) <= 0; i = i.add(BigInteger.ONE)) { fact = fact.multiply(i); System.out.println(i + "! = " + fact); } } } Last fiddled with by Mini-Geek on 2009-10-01 at 16:34 |
![]() |
![]() |
![]() |
#6 | |
Aug 2006
2·11·271 Posts |
![]() Quote:
![]() Knuth is excellent, and his "The Art of Computer Programming" is a treasure for the ages. But a beginning programmer should start from something simpler and work up to TAoCP. Its size and cost are likely to discourage! |
|
![]() |
![]() |
![]() |
#7 | |
Bamboozled!
"πΊππ·π·π"
May 2003
Down not across
52×421 Posts |
![]() Quote:
TACP is an excellent text. Everyone except (many) novice should own a copy and study it carefully. My cop is well-thumbed, is falling apart from use, and I've learned a lot from it. That said, it's probably not the first port of call for most programmers. Second, definitely. Paul |
|
![]() |
![]() |
![]() |
#8 | |
Feb 2007
24·33 Posts |
![]() Quote:
Code:
int factorial(int n){ int f=1; while( n>1 ) f *= n--; return(f); } main(){ int n; for( n=1; n<10; n++ ) printf( "%d ! = %d\n", n, factorial(n)); } |
|
![]() |
![]() |
![]() |
#9 | |
Nov 2003
1D2416 Posts |
![]() Quote:
Do you have a better book? Rivest et al? Aho, Hopcroft, Ullman? Sedgwick? I was not suggesting a general text about coding, but rather one that discusses numerical algorithms and the (multi-precise) arithmetic involved in computing/coding n! |
|
![]() |
![]() |
![]() |
#10 | |
Aug 2006
2×11×271 Posts |
![]() Quote:
If the OP was really looking for a book, I would sooner recommend Yan's Number Theory for Computing as its level is more appropriate. But I don't think any book is needed here, unless perhaps a text on introductory programming. |
|
![]() |
![]() |
![]() |
#11 | |
Nov 2003
22×5×373 Posts |
![]() Quote:
he was a novice programmer; only that he was a novice with C. |
|
![]() |
![]() |
![]() |
Thread Tools | |
![]() |
||||
Thread | Thread Starter | Forum | Replies | Last Post |
Manual Results Question ... an easy one. | petrw1 | PrimeNet | 7 | 2013-08-14 13:54 |
A probably easy question about PFGW and twins | Puzzle-Peter | Twin Prime Search | 0 | 2011-06-25 07:41 |
4 not so easy pieces? | Uncwilly | Puzzles | 35 | 2006-11-15 01:07 |
Another easy one | fetofs | Puzzles | 10 | 2006-11-03 03:29 |
Easy | Mini-Geek | Puzzles | 3 | 2006-10-19 17:14 |