0 一个简单的问题,难倒一帮人 - 第2页 - 单片机论坛,单片机技术交流论坛 - 21ic电子技术开发论坛
打印

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

[复制链接]
楼主: 349264710
手机看帖
扫描二维码
随时随地手机跟帖
21
liang7143| | 2010-12-1 12:09 | 只看该作者 回帖奖励 |倒序浏览
LZ应该去看看 数据结构
数据结构里面 有专门 讲 多项式
如果LZ了解了 多项式的乘法
100的阶乘,那真是太小儿科了

使用特权

评论回复
22
culk_2008| | 2010-12-1 13:05 | 只看该作者
都知道是什么乘什么了,搞个结果出来就行了,

使用特权

评论回复
23
sysdriver| | 2010-12-1 13:23 | 只看该作者
无聊。。。

使用特权

评论回复
24
A2000wps| | 2010-12-1 16:29 | 只看该作者
我的智商真低,哈哈,高手能把用彙編語言的大概算法說出來嗎?我還想玩玩這個

使用特权

评论回复
25
realseek| | 2010-12-1 17:18 | 只看该作者
闲着没事 为了理论而理论

使用特权

评论回复
26
四明| | 2010-12-1 17:21 | 只看该作者
lz是想让单片机输出并显示吗

使用特权

评论回复
27
smt0755| | 2010-12-1 17:32 | 只看该作者
e。。 确实我也不会

使用特权

评论回复
28
SmartEnergy| | 2010-12-1 18:01 | 只看该作者
先瞎扯一句,个人认为,讨论问题的时候,如果问题没有问题,就不要否定问题。哈哈

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

期待有巧妙的算法让二姨家地震一下!

使用特权

评论回复
29
myfamous| | 2010-12-1 18:07 | 只看该作者
用c语言做这种运算确实很麻烦,换一种语言就简单多了

new.jpg (31.31 KB )

new.jpg

使用特权

评论回复
30
coolboyjie| | 2010-12-1 18:08 | 只看该作者
还确实是吃饱了撑的没事干啊~

使用特权

评论回复
31
349264710|  楼主 | 2010-12-1 18:20 | 只看该作者
31# myfamous
什么语言啊,那么轻松就能算出来~

使用特权

评论回复
32
zhenghuich| | 2010-12-1 18:51 | 只看该作者
没意思,没意义,难道火星人也用。

MCU不面向应用,假打

使用特权

评论回复
33
玻璃夕阳| | 2010-12-1 19:03 | 只看该作者
高深问题,菜鸟不理解。

使用特权

评论回复
34
armmage| | 2010-12-1 19:35 | 只看该作者
其实我觉得········分解为乘2和加法就可以了来就可以了 毕竟乘2这种事 对机器来说就是移位而已
偶数就不先不管了,先可以从99入手 99*97 可以看成 99*96+ 99, 96又是偶数 就又等同移位,那么后面的奇数都做此处理 感觉不是很难。
纯意淫········见笑

使用特权

评论回复
35
流行音乐| | 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先左移再右移就可以了?

使用特权

评论回复
36
coody| | 2010-12-1 21:39 | 只看该作者
36楼,不管是否偶数,都可以用移位加来计算乘法的,并且很简单的。

使用特权

评论回复
37
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 赞~ 你是第一个动手试验的
38
coody| | 2010-12-1 23:26 | 只看该作者
LS,好,终于证明了,如果用更开的MCU,时间会更短

使用特权

评论回复
39
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;
}

Factorial.rar

1.61 KB

使用特权

评论回复
40
qixian1988| | 2010-12-2 16:42 | 只看该作者
让我想起了一件事,就像大学里学了c语言,课后习题:a+=a-=a*=a的值是多少,害死人了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则