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

[复制链接]
9767|52
 楼主| 349264710 发表于 2010-11-30 19:40 | 显示全部楼层 |阅读模式
本帖最后由 349264710 于 2010-12-2 20:56 编辑

用8位单片机,如何运算1*2*3*4...*100?

看了回帖,再看模拟笔算,感觉里离算出100!还远着呢。谁能贴出代码来瞧瞧,计算是一个问题,储存也是一个不小的问题。
大家都说单片机乘法运算慢,但到底有多慢呢?怎么计算?
mohanwei 发表于 2010-11-30 19:54 | 显示全部楼层
估计就难倒了楼主……学过任意一门编程语言的应该都做过这道习题吧:lol
 楼主| 349264710 发表于 2010-11-30 20:02 | 显示全部楼层
一刚开始我以为是很简单,但你想过没有,1*2*3*...*100的值有多大,单片机怎么运算,又怎么存储,确实是难倒我这个菜鸟。期待高手~
2# mohanwei
mohanwei 发表于 2010-11-30 20:12 | 显示全部楼层
编译器支持你就用long long
不支持你还可以用模拟笔算,可以参考一下以前写的帖子(论坛里不好找,可以搜索到百度“模拟笔算实现超大整数相乘”),只要你的内存足够和时间足够,做几千位的大_数_运_算都没问题。
 楼主| 349264710 发表于 2010-11-30 20:20 | 显示全部楼层
自己用VC6.0写了一段程序
#include<math.h>

void main(void)
{
        unsigned long int a=1;
        unsigned char b,c=1;
        for(b=0;b<100;b++)
        {
                a=a*c;
                c++;
        }
        printf("a=%ld\n",a);
}
结果a=0;说明100!用unsigned long int根本无法储存,百度一下,找到100!=93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000;谁能用单片机算出来呢?
心静自然凉 发表于 2010-11-30 20:24 | 显示全部楼层
呵呵
单片机不是拿来运算这些巨型数据的,要算就用计算机
你这好比叫现在的单车在天上飞
huangqi412 发表于 2010-11-30 20:32 | 显示全部楼层
模拟笔算,自己建一个数组来存储。
Jack602 发表于 2010-11-30 20:33 | 显示全部楼层
LZ...你好坏 !
 楼主| 349264710 发表于 2010-11-30 20:36 | 显示全部楼层
这个问题用单片机来解决确实是有点不匹配,但是假设在单片机运算一个比较大的数,用unsigned int 无法储存的时候,要怎么处理?
原野之狼 发表于 2010-11-30 21:02 | 显示全部楼层
东西是死的 人是活的啊
前面几个已经有人讲到了 采用模拟笔算的方式
不过真不知道此种问题在现实的MCU应用中哪个地方能用得到
楼主可以透露一下 让我们也学习一下
很有可能这是个面试题之类的东东 呵呵
yewuyi 发表于 2010-11-30 21:07 | 显示全部楼层
用8位的MCU来计算这个,本来就是吃饱撑的慌,你有没有估计做这个运算需要多少时间!?

你能等得起这个时间吗!?

如果说int字长不够,想稍微扩展一下长度,例如扩展到48BIT长度等等,都是有办法,但扩展到眼都发直长度的地步就有点走向极端了。

评分

参与人数 1威望 +1 收起 理由
strang + 1

查看全部评分

liang7143 发表于 2010-11-30 21:26 | 显示全部楼层
;P呵呵~~我直接把结果写得code里面
LZ如果需要,我读出来给你
 楼主| 349264710 发表于 2010-11-30 21:47 | 显示全部楼层
模拟笔算我看了,还没怎么看懂,这题目是我在QQ群里面看到的,无人能解,所以就来二姨家啦~
10# 原野之狼
coody 发表于 2010-11-30 21:58 | 显示全部楼层
用一段汇编,100的阶乘结果大约为66个字节,计算100次乘法累加和,实际就是66字节乘一个字节,根本没想象的慢,一下就出来了
strang 发表于 2010-12-1 00:08 | 显示全部楼层
用8位的MCU来计算这个,本来就是吃饱撑的慌,你有没有估计做这个运算需要多少时间!?

你能等得起这个时间吗!?

如果说int字长不够,想稍微扩展一下长度,例如扩展到48BIT长度等等,都是有办法,但扩展到眼都发直 ...
yewuyi 发表于 2010-11-30 21:07


说的好,支持,用8位机俺做过实验,需要很长时间才能算出来。
程序医人 发表于 2010-12-1 08:20 | 显示全部楼层
这个就用人工模拟乘法运算呗。匠人姐姐的书里就有介绍,这要能模拟第一步,以下的不都一样?只是数越来越大吧。应该说这题难就难在他要求付出很多的无味的体力劳动才能做出吧?
ayb_ice 发表于 2010-12-1 08:30 | 显示全部楼层
要考虑结果溢出的问题
sz_longyue 发表于 2010-12-1 10:38 | 显示全部楼层
都是C惹的祸,怎么就没人想到汇编的乘法是怎么算的呢。这个也就是模拟笔算,不过是二进制乘法的笔算过程。只要寄存器够,时间够,别说100!,就是1000!都能算出来
coody 发表于 2010-12-1 10:47 | 显示全部楼层
LS,1000的阶乘,结果是1067个字节的长度。。。
100的阶乘,用汇编真的很快的,没想象的慢。
YINGZEZIGA 发表于 2010-12-1 10:51 | 显示全部楼层
此贴纯属吃饱了撑的没事干,鉴定完毕。

评分

参与人数 1威望 +1 收起 理由
aceice + 1

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

77

帖子

3

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