| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 16224 人关注过本帖, 1 人收藏
标题:挑战C版所有人,1000!
取消只看楼主 加入收藏
童生
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:205
专家分:455
注 册:2018-3-7
收藏
得分:0 
以下是引用九转星河在2018-6-2 00:02:37的发言:

http://www.

难怪会发这个帖子,难道楼主是51nod里面的成员?

今晚才看到那个群的成员在讨论这个问题~

哈哈,我看不上眼
2018-06-02 00:04
童生
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:205
专家分:455
注 册:2018-3-7
收藏
得分:0 
真的要good night!
2018-06-02 00:05
童生
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:205
专家分:455
注 册:2018-3-7
收藏
得分:0 
哈哈,这贴是我发的吗?酒后一贴都快成神贴了。
2018-06-03 10:10
童生
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:205
专家分:455
注 册:2018-3-7
收藏
得分:0 
以下是引用九转星河在2018-6-2 21:27:14的发言:

我也弄了个简单的出来不过得出的结果却是16进制的,如果要转换成10进制那么要把那个大数看作一个整体转换才行,没有验证结果,(或者结果是错误的),当然效率也不怎么样了,就是简单弄个看看而已~

还有一个小优化的方案,就是在内循环开始之前跳过前导0直接从非0位开始判断,n!统计0的个数这个好弄吧~
要想更高效的或者只能直接用FFT之类的算法减少乘法运算量了,算是这样了~


#include<stdio.h>

#define GET_LOW( s )    \
    ((s)&0x0000ffff)
        
#define GET_HIGH( s )    \
    (((s)&0xffff0000)>>16)

unsigned fun( unsigned[],unsigned );

void print( const unsigned[],unsigned );

int main( void )
{
   unsigned a[3000];

   print(a,fun(a,1001));
        
    return 0;
}

unsigned fun( unsigned a[],unsigned len )
{
    unsigned i;
    unsigned j;
    unsigned count=3;
        
    a[1]=1;
    a[0]=0;
    a[2]=0;
 
    for (i=1;i!=len;++i)
    {
        for (j=1;j!=count;++j)
            a[j]=GET_LOW(a[j])*i+GET_HIGH(a[j-1]);
        
        if (GET_HIGH(a[count-1]))
        {
            a[count++]=0;
        }
    }
   
    return count;
           
}

void print( const unsigned a[],unsigned len)
{
    while (--len)
        printf("%04x",GET_LOW(a[len]));
        
    puts("");
}

历害!比我快了
2018-06-07 16:53
童生
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:205
专家分:455
注 册:2018-3-7
收藏
得分:0 
回复 82楼 九转星河
程序代码:
#include <stdio.h>
#include <math.h>
#include <malloc.h>
#include <time.h>
#include <stdlib.h>

#define GET_LOW( s )    \
    ((s)&0x000fffff)

#define GET_HIGH( s )    \
    ((s)>>20)
union INFO
{
        unsigned int a;
        unsigned short int b[2];

};


int main(int argc, char *argv[])
{

     union INFO A;
     unsigned AA = 44345678;
     A.a=44345678;
     unsigned short int * p  = (unsigned short int *)&AA;
     
     printf("A.a = %u   A.b[0] = %u  A.b[1] = %u  \n",A.a,A.b[0],A.b[1]);
     printf("A.a = %u   A.a %% 65536  = %u   A.a / 65536 = %u \n\n",A.a, A.a%65536 ,A.a/65536 );

     printf("AA = %u   GET_LOW( AA )  = %u   GET_HIGH( AA ) = %u \n",AA,GET_LOW( AA) ,GET_HIGH( AA ));
     printf("AA = %u   AA %% 1048576  = %u    AA / 1048576 = %u \n\n",AA,AA%1048576 ,AA/1048576);
     
     printf("AA = %u   *p  = %u   *(p+1) = %u \n",AA,*p ,*(p+1));
     printf("AA = %u   AA %% 65536  = %u    AA / 65536 = %u \n\n",AA,AA%65536 ,AA/65536);
    return 0;
}


共用体相当65536进制,你的相当1048576进制,我采用的是第三种与共用体一样65536进制,但是速度没你的快而且相差比较大,我很是奇怪,这几天有个烦琐问题没解决没时间想这个问题
2018-06-12 13:16
快速回复:挑战C版所有人,1000!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027319 second(s), 9 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved