注册 登录
编程论坛 C语言论坛

100!的精确值是多少?编好程序后,测试没有输出?请大侠们帮忙看看

powerfrank 发布于 2018-12-12 16:45, 1222 次点击
100!的精确值是多少?

#include <stdio.h>
#include <stdlib.h>

#define BAI 100
#define WU 5
#define SW 100000
#define W 10000
#define Q 1000
#define S 10

void js_jie ( int [] , int , int  ) ; //计算阶

void sc_jieguo ( int [] , int ) ; //输出结果

int pdws ( int[] , int ) ; //判断元素的数值位数

int main ()
{
    int jieguo[BAI] , i = BAI , n = BAI ;

    //计算并显示 阶 的结果;
    js_jie(jieguo , i , n );

    sc_jieguo ( jieguo , i ) ;

    system ( "pause" ) ;

    return 0 ;
}

void js_jie ( int jieguo[] ,  int i , int n )
{
    int  y ;

    for ( i = 0 ; i < n ; i ++ )
    {
        jieguo[i] = 0 ;
    }

    jieguo[0] = 1 ;

    for ( int x = 1 ; x <= n ; x ++ )
    {   
        //判断数组元素存放数值最大的i值
        for ( i = x-1 ; i >= 0 ; i -- )
        {
            //确定i值后进行计算,把i赋值给y做记号
            if ( jieguo[i] > 0 )
            {
                y = i ;
                int y1=0 , y2=0 ;
                //从i=0的数组元素开始进行计算,直到i=y+1
                for ( i = 0 ; i <= y+1 ; i ++ )
                {
                    y1 = ( jieguo[i] * x + y2 ) % SW ;
                    y2 = jieguo[i] * x / SW ;
                }
            }
        }

    }

    return ;

}

void sc_jieguo ( int p[] , int i )
{
    int x ;
    for ( x = i ; x >= 0 ; x --) //找出
    {
        if ( p[x] > 0 ) break ;
    }

    //计算后输出

    printf("100!的精确值是%d",p[x]);
   
    for ( int y = x - 1 ; y >= 0 ; y -- )
    {
        switch( pdws(p , y) )
        {
        case 5 :break;
        case 4 :printf("0") ;break;
        case 3 :printf("00") ;break;
        case 2 :printf("000") ;break;
        case 1 :printf("0000") ;break;
        }

        printf("%d",p[y]);   
    }

    printf("\n");
}

int pdws ( int p[] , int n )
{
    int i ;

    i = ( p[n]/W > 0 ) ? WU : ( ( p[n]/Q > 0 ) ? ( WU - 1 ) : ( (p[n]/BAI > 0 ) ? ( WU - 2 ) : ( p[n]/S > 0 ? ( WU - 3 ) : ( WU - 4 ) ))) ;

    return i ;
}
5 回复
#2
zbjzbj2018-12-12 23:52
100!=9.3326215443944152681699238856267e+157
#3
rjsp2018-12-13 08:36
用char,效率很低,但好在代码简单

程序代码:
#include <stdio.h>

int main( void )
{
    char buf[160] = { 0 };

    buf[sizeof(buf)-2] = '1';
    for( unsigned i=1; i<=100; ++i )
    {
        unsigned carry = 0;
        size_t j;
        for( j=sizeof(buf)-2; buf[j]!=0; --j )
        {
            unsigned tmp = i * (buf[j]-'0') + carry;
            buf[j] = tmp%10 + '0';
            carry = tmp/10;
        }
        for( ; carry!=0; carry/=10 )
            buf[j--] = carry%10 + '0';
    }

    char* p;
    for( p=buf; !*p; ++p );
    puts( p );
    return 0;
}
输出
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

#4
rjsp2018-12-13 09:27
中途有事,这是我以前写的C++程序,简单改一下就行了(我现在没空改了)

程序代码:
#include <cstdio>
#include <cstdint>
#include <cinttypes>
#include <vector>
#include <algorithm>
using namespace std;

int main( void )
{
    std::vector<uint32_t> digits( 1, 1 );
    for( unsigned i=1; i<=100; ++i )
    {
        uint32_t carry = 0;
        std::for_each( digits.begin(), digits.end(), [i,&carry](auto& val) {
            uint64_t t = uint64_t(val) * i + carry;
            val = t%1000000000;
            carry = t/1000000000;
        } );
        if( carry != 0 )
            digits.push_back( carry );
    }

    auto itor = digits.rbegin();
    printf( "%" PRIu32, *itor++ );
    for( ; itor!=digits.rend(); ++itor )
        printf( "%09" PRIu32, *itor );
    putchar( '\n' );

    return 0;
}

#5
powerfrank2018-12-13 10:39
回复 4楼 rjsp
非常感谢!
我早上重新查了下发现有好几个错误,改了下,现在代码可以用了。哈哈。

#include <stdio.h>
#include <stdlib.h>

#define BAI 100
#define SW 100000

void js_jie ( int [] , int , int  ) ; //计算阶并把结果存放在一维数组里面

void sc_jieguo ( int [] , int ) ; //输出结果

int main ()
{
    int jieguo[BAI] , i = BAI , n = BAI ;

    //计算并显示 阶 的结果;
    js_jie(jieguo , i , n );

    sc_jieguo ( jieguo , i ) ;

    system ( "pause" ) ;

    return 0 ;
}

void js_jie ( int jieguo[] ,  int i , int n )
{
    int  y ;

    for ( i = 0 ; i < n ; i ++ )
    {
        jieguo[i] = 0 ;
    }

    jieguo[0] = 1 ;

    for ( int x = 1 ; x <= n ; x ++ )
    {   
        //判断数组元素存放数值最大的i值
        for ( i = x-1 ; i >= 0 ; i -- )
        {
            //确定i值后进行计算,把i赋值给y做记号
            if ( jieguo[i] > 0 )
            {
                y = i ;
                int y1=0 , y2=0 ;
                //从i=0的数组元素开始进行计算,直到i=y+1
                for ( int j = 0 ; j <= y+1 ; j ++ )
                {
                    y1 = ( jieguo[j] * x + y2 ) % SW ;
                    y2 = ( jieguo[j] * x + y2 ) / SW ;      //错误修正
                    jieguo[j] = y1 ;   // 错误修正
                }

                break ;   // 错误修正
            }
        }

    }

    return ;

}

void sc_jieguo ( int p[] , int i )
{
    int x ;
    for ( x = i ; x >= 0 ; x --) //找出存放结果最高位的数组元素
    {
        if ( p[x] > 0 ) break ;
    }

    //计算后输出

    printf("100!的精确值是%d",p[x]);
   
    for ( int y = x - 1 ; y >= 0 ; y -- )
    {
        printf("%05d",p[y]);     //错误修正
    }

    printf("\n");
}

[此贴子已经被作者于2018-12-13 10:48编辑过]

#6
powerfrank2018-12-13 10:44
回复 5楼 powerfrank
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
1