回 帖 发 新 帖 刷新版面

主题:[原创]跪求原因  请一定帮下忙  一个C程序

对于小于25000的自然数n ,求阶乘n!,(n-1)!,(n-2)!,……,3!,2!,1!右边的非零数之和。(提示:大家注意观察规律,单纯的求阶乘,肯定会超出范围) 
例如 
当n = 5时 
5!= 120 ,右边非零数为2 
4!= 24,右边非零数为4 
3!= 6,右边非零数为6 
2!= 2,右边非零数为2 
1!= 1,右边非零数为1 
其右边是非零数之和为 15 


#include "stdio.h" 

/*返回m右边第一位非零整数*/ 
long yu(long m) 
{   long n,k; 
    k=10; 
    n=m%k; 
    while(!n) 
        {   n=(m/10)%k; 
         } 
    return n; 


/*返回I!右边第一位非零整数*/ 
long rad(long i)/*不知道为什么这里的i不能大于50 当i为50就没有结果出来*/ 
{  long m; 
    if(i==1) 
        return 1; 
    else 
        {  m=yu(rad(i-1)*i); 
           printf("m=%d\n",m); 
           return m; 
        } 
 } 

main() 
{   long s, i, n ; 
    printf("please input a NUM:"); 
    scanf("%ld",&n); 
    s=0; 
    for(i=1;i<=n;i++) 
        { 
            s=s+rad(i); 
         } 
     printf("total is :%ld",s); 
     getch(); 
 } 
输入50以下的所有数都可以  当输入50就不出结果 49的时候我全用的是int 50我改为long还是没有反映 而且我还输出了各个变量的值都在300以内 所以益处的可能性不大  我实在找不到原因  请求帮助

回复列表 (共8个回复)

沙发

while(!n) 
        {   n=(m/10)%k; 
         } 

改为
while(!n) 
        {
         printf("%d%d",n,m);  
          n=(m/10)%k; 
         } 
发现有0 0出现。程序必然进入死循环
我把你的这段程序改为
while(!n) 
        { 
         m=m/10;
          n=(m)%k; 
         } 
输入 50 的结果为: 238

板凳

可以笔算

末尾出现0是因为有5和2做因子,5的因子数多还是2的因子数多? 当然是2的多

所以我们只要算出从1到n之间包括多少个5的因子,就是n!末尾有多少个0

floor( n/5 ) + floor( n/25 ) + floor( n/125 ) + ..... 直到n小于5的某次幂

int function( int n )
{
    int result = 0;
    while ( n >= 5 )
    {
        n /= 5;
        result += n;
    }
    return result;
}

3 楼

这是50的阶乘
30414093201713378043612608166064768844377641568960512000000000000

末尾12个0

4 楼

[quote]这是50的阶乘
30414093201713378043612608166064768844377641568960512000000000000

末尾12个0

[/quote]
但是就算去掉12个零还是会溢出,还是没办法得到要求的结果啊!

5 楼

[quote][quote]这是50的阶乘
30414093201713378043612608166064768844377641568960512000000000000

末尾12个0

[/quote]
但是就算去掉12个零还是会溢出,还是没办法得到要求的结果啊!
[/quote]

汗 我贴出50的阶乘是为了判断计算的结果是否正确

6 楼

This is code in Ruby, you can change 1000 to any number you want.
[code]
n=1000
puts (2..n).inject(1) { |f, n| f * n }

[/code]

7 楼

50!=30414093201713378043612608166064768844377641568960512000000000000
150!=5713383956445854590478932865261054003189553578601126418254837583317982912484539839312657448867531114
5377107878746854204162666250198684504466355949195922066574942592095735778929325357290444962472405416
790722118445437122269675520000000000000000000000000000000000000

8 楼

听说过Ruby的大名哦 但并不了解哦

我来回复

您尚未登录,请登录后再回复。点此登录或注册