一个简单的问题,难倒一帮人

[复制链接]
9702|52
liang7143 发表于 2010-12-1 12:09 | 显示全部楼层
LZ应该去看看 数据结构
数据结构里面 有专门 讲 多项式
如果LZ了解了 多项式的乘法
100的阶乘,那真是太小儿科了
culk_2008 发表于 2010-12-1 13:05 | 显示全部楼层
都知道是什么乘什么了,搞个结果出来就行了,
sysdriver 发表于 2010-12-1 13:23 | 显示全部楼层
无聊。。。
A2000wps 发表于 2010-12-1 16:29 | 显示全部楼层
我的智商真低,哈哈,高手能把用彙編語言的大概算法說出來嗎?我還想玩玩這個
realseek 发表于 2010-12-1 17:18 | 显示全部楼层
闲着没事 为了理论而理论
四明 发表于 2010-12-1 17:21 | 显示全部楼层
lz是想让单片机输出并显示吗
smt0755 发表于 2010-12-1 17:32 | 显示全部楼层
e。。 确实我也不会
SmartEnergy 发表于 2010-12-1 18:01 | 显示全部楼层
先瞎扯一句,个人认为,讨论问题的时候,如果问题没有问题,就不要否定问题。哈哈

条条达到同罗马,前面众多达人想法纷呈;而我考虑的是如何能更快算出结果,如傅立叶变换的FFT实现才好玩。我想是否可以先将这些数进行质数分解,然后在做乘法运算。分解之后,虽然增加乘法次数,但将复杂度降低,对8位机实现的乘加次数可能有大幅减少。质数分解,至少可以的到2的幂系数2^(50+25+12+6+3+1)=2^97这个靠二进制移位可以得到结果的值。

期待有巧妙的算法让二姨家地震一下!
myfamous 发表于 2010-12-1 18:07 | 显示全部楼层
用c语言做这种运算确实很麻烦,换一种语言就简单多了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
coolboyjie 发表于 2010-12-1 18:08 | 显示全部楼层
还确实是吃饱了撑的没事干啊~
 楼主| 349264710 发表于 2010-12-1 18:20 | 显示全部楼层
31# myfamous
什么语言啊,那么轻松就能算出来~
zhenghuich 发表于 2010-12-1 18:51 | 显示全部楼层
没意思,没意义,难道火星人也用。

MCU不面向应用,假打
玻璃夕阳 发表于 2010-12-1 19:03 | 显示全部楼层
高深问题,菜鸟不理解。
armmage 发表于 2010-12-1 19:35 | 显示全部楼层
其实我觉得········分解为乘2和加法就可以了来就可以了 毕竟乘2这种事 对机器来说就是移位而已
偶数就不先不管了,先可以从99入手 99*97 可以看成 99*96+ 99, 96又是偶数 就又等同移位,那么后面的奇数都做此处理 感觉不是很难。
纯意淫········见笑
流行音乐 发表于 2010-12-1 21:11 | 显示全部楼层
其实我觉得········分解为乘2和加法就可以了来就可以了 毕竟乘2这种事 对机器来说就是移位而已
偶数就不先不管了,先可以从99入手 99*97 可以看成 99*96+ 99, 96又是偶数 就又等同移位,那么后面的奇数都做 ...
armmage 发表于 2010-12-1 19:35

按照你的方法,99*97= 99*194/2,即把99先左移再右移就可以了?
coody 发表于 2010-12-1 21:39 | 显示全部楼层
36楼,不管是否偶数,都可以用移位加来计算乘法的,并且很简单的。
teddeng 发表于 2010-12-1 23:15 | 显示全部楼层
闲着也是闲着。。

        mov r7,#100
        mov r0,#71h
        mov r6,#66
        
        clr a
        mov r5,a
clrsum:
        mov @r0,a
        dec r0
        djnz r6,clrsum

        mov r6,#66
        mov r0,#71h
        mov @r0,#1
next:
        mov a,@r0
        mov b,r7
        mul ab
        add a,r5
        mov @r0,a
        clr a
        addc a,b
        mov r5,a
        dec r0
        djnz r6,next

        mov r0,#71h
        mov r6,#66
        mov r5,#0
        djnz r7,next
        end
结果
I:0x30  1B 30 96 4E C3 95 DC 24 - 06 95 28 D5 4B BD A4 0D
I:0x40  16 E9 66 EF 9A 70 EB 21 - B5 B2 94 3A 32 1C DF 10
I:0x50  39 17 45 57 0C CA 94 20 - C6 EC B3 B7 2E D2 EE 8B
I:0x60  02 EA 27 35 C6 1A 00 00 - 00 00 00 00 00 00 00 00
I:0x70  00 00
时间:0.099775秒     12T51@12M
百度结果:
1b30964ec395de0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

评分

参与人数 2威望 +2 收起 理由
SmartEnergy + 1 实干兴邦!
xwj + 1 赞~ 你是第一个动手试验的

查看全部评分

coody 发表于 2010-12-1 23:26 | 显示全部楼层
LS,好,终于证明了,如果用更开的MCU,时间会更短
SmartEnergy 发表于 2010-12-2 12:11 | 显示全部楼层
teddeng的实干让我汗颜了.将他的算法,用C写一份给有兴趣的朋友。注意,该算法源自teddeng.
//该程序可扩展到任意255以内的阶乘

#define FACTORIAL_SIZE  100 //给定阶乘级数
#define PRODUCT_SIZE    73  //用以存储阶乘结果的存储区,按字节计算。阶乘最大可能有效位数为(1*1+2*2+3*4+4*8+5*16+6*32+7*(64-27)=580,字节数为73

unsigned char product[PRODUCT_SIZE];//_at_ (127-PRODUCT_SIZE);

void main()
{
    unsigned char i,j;
    unsigned char a,b;
    unsigned int product16bit,rest16bit;

unsigned long hugerest;

//初始化乘积为1   
    for(i=0;i<PRODUCT_SIZE;i++) product[i]=0;
    product[0]=1;

//乘加运算
    for(i=2;i<=FACTORIAL_SIZE;i++)
    {

//乘数因子循环
        b = product[0];

rest16bit=0;

        for(j=0;j<(PRODUCT_SIZE-1);)
        {

//按字节乘法运算累加循环
                a=i;
                product16bit=a*b;



if(product>0xFE00)

{

hugerest=product16bit;

hugerest+=rest16bit;

b=hugerest%0x100;

rest16bit=hugerest/0x100;

}

else

{

product16bit+=rest16bit;

                b=product16bit%0x100;

rest16bit=product16bit/0x100;

}
                product[j]=b;


                j ++;

b=product[j];
        }
    }



//留取丹心照汗青
    for(i=0;i<PRODUCT_SIZE;i++) product[i]=product[i];


//神马都是浮云

i=0;

j=0;

a=0;

b=0;

product16bit=0;

rest16bit=0;

hugerest=0;
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
qixian1988 发表于 2010-12-2 16:42 | 显示全部楼层
让我想起了一件事,就像大学里学了c语言,课后习题:a+=a-=a*=a的值是多少,害死人了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部