Fortran Fortran 90 Program Factorial: Fixing Incorrect Output

AI Thread Summary
The discussion focuses on a Fortran program designed to calculate the factorial of a number. Users noted that when inputting large values for n, the program produces incorrect results due to integer overflow, as the factorial grows rapidly and exceeds the maximum allowable integer size. To address this issue, it is suggested to limit input values of n to avoid exceeding storage limits. Alternative implementations using Fortran90 intrinsic functions like "selected_int_kind" allow for larger integers, enabling calculations for factorials beyond 20!. Additionally, a recursive function approach is presented, which can handle larger values more effectively. For even larger numbers, using double or extended real types is recommended, as they can accommodate calculations up to factorials of 4930.
Md. Abde Mannaf
Messages
20
Reaction score
1
Code:
program factorial
  implicit none
  integer::fact,i,n
  print*,'enter the value of n'
  read*,n
  fact=1
  do i=1,n
  fact=fact*i
  end do

  print*,'factorial is ',fact
end program

when input n largest number then answer is incorrect. how to solve
 
Technology news on Phys.org
Md. Abde Mannaf said:
Code:
program factorial
  implicit none
  integer::fact,i,n
  print*,'enter the value of n'
  read*,n
  fact=1
  do i=1,n
  fact=fact*i
  end do

  print*,'factorial is ',fact
end program

when input n largest number then answer is incorrect. how to solve

Show us what you get for the first few possibilities for n:

1
2
3
4
5
6

etc.
 
Your code looks good to me. When you say the answer is incorrect for "the largest number", don't forget that fact will be larger than the largest allowable integer in that case. The program will either abort or give an incorrect answer. You can only input values of n that will not make n! too large for the integer fact.
 
  • Like
Likes berkeman
There are implementations of the factorial function that allow the computation of factorials beyond 20!.

The implementations are much more difficult to write, but if you want to get around the storage limits, you have to be a bit more clever.
 
  • Like
Likes Md. Abde Mannaf
You need to start using Fortran90 intrinsic functions that allow for requesting more storage in a platform compatible manner, I am talking about functions like "selected_int_kind"; in my laptop, I was able to go as high as 18. Needless to say, the factorial function is a nice textbook exercise to show another Fortran90 feature: recursive attribute.

Code:
program torial
    implicit none
   
    integer, parameter :: IK = selected_int_kind(18)
    integer(IK) :: i
     
    write(*,'(A,$)') 'Number? : '
    read(*,*) i
    write(*,*) 'Factorial is ',factorial(i)

contains

    recursive function factorial( n ) result (f)
        integer(IK) :: f, n
       
        if( n == 1 ) then
          f = 1
        else
          f = n * factorial( n - 1_IK )
        end if
       
    end function factorial
   
end program torial

> a.exe
Number? : 20
Factorial is 2432902008176640000
 
  • Like
Likes Md. Abde Mannaf
For large numbers may you don't need exact an integer. Try the same code with result as double or extended real (16 byte float number gives answer up to 4930!).
 
Thread 'Is this public key encryption?'
I've tried to intuit public key encryption but never quite managed. But this seems to wrap it up in a bow. This seems to be a very elegant way of transmitting a message publicly that only the sender and receiver can decipher. Is this how PKE works? No, it cant be. In the above case, the requester knows the target's "secret" key - because they have his ID, and therefore knows his birthdate.

Similar threads

Back
Top