打印

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

[复制链接]
8523|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
不支持你还可以用模拟笔算,可以参考一下以前写的帖子(论坛里不好找,可以搜索到百度“模拟笔算实现超大整数相乘”),只要你的内存足够和时间足够,做几千位的大_数_运_算都没问题。

使用特权

评论回复
5
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;谁能用单片机算出来呢?

使用特权

评论回复
6
心静自然凉| | 2010-11-30 20:24 | 只看该作者
呵呵
单片机不是拿来运算这些巨型数据的,要算就用计算机
你这好比叫现在的单车在天上飞

使用特权

评论回复
7
huangqi412| | 2010-11-30 20:32 | 只看该作者
模拟笔算,自己建一个数组来存储。

使用特权

评论回复
8
Jack602| | 2010-11-30 20:33 | 只看该作者
LZ...你好坏 !

使用特权

评论回复
9
349264710|  楼主 | 2010-11-30 20:36 | 只看该作者
这个问题用单片机来解决确实是有点不匹配,但是假设在单片机运算一个比较大的数,用unsigned int 无法储存的时候,要怎么处理?

使用特权

评论回复
10
原野之狼| | 2010-11-30 21:02 | 只看该作者
东西是死的 人是活的啊
前面几个已经有人讲到了 采用模拟笔算的方式
不过真不知道此种问题在现实的MCU应用中哪个地方能用得到
楼主可以透露一下 让我们也学习一下
很有可能这是个面试题之类的东东 呵呵

使用特权

评论回复
11
yewuyi| | 2010-11-30 21:07 | 只看该作者
用8位的MCU来计算这个,本来就是吃饱撑的慌,你有没有估计做这个运算需要多少时间!?

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

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

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
strang + 1
12
liang7143| | 2010-11-30 21:26 | 只看该作者
;P呵呵~~我直接把结果写得code里面
LZ如果需要,我读出来给你

使用特权

评论回复
13
349264710|  楼主 | 2010-11-30 21:47 | 只看该作者
模拟笔算我看了,还没怎么看懂,这题目是我在QQ群里面看到的,无人能解,所以就来二姨家啦~
10# 原野之狼

使用特权

评论回复
14
coody| | 2010-11-30 21:58 | 只看该作者
用一段汇编,100的阶乘结果大约为66个字节,计算100次乘法累加和,实际就是66字节乘一个字节,根本没想象的慢,一下就出来了

使用特权

评论回复
15
strang| | 2010-12-1 00:08 | 只看该作者
用8位的MCU来计算这个,本来就是吃饱撑的慌,你有没有估计做这个运算需要多少时间!?

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

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


说的好,支持,用8位机俺做过实验,需要很长时间才能算出来。

使用特权

评论回复
16
程序医人| | 2010-12-1 08:20 | 只看该作者
这个就用人工模拟乘法运算呗。匠人姐姐的书里就有介绍,这要能模拟第一步,以下的不都一样?只是数越来越大吧。应该说这题难就难在他要求付出很多的无味的体力劳动才能做出吧?

使用特权

评论回复
17
ayb_ice| | 2010-12-1 08:30 | 只看该作者
要考虑结果溢出的问题

使用特权

评论回复
18
sz_longyue| | 2010-12-1 10:38 | 只看该作者
都是C惹的祸,怎么就没人想到汇编的乘法是怎么算的呢。这个也就是模拟笔算,不过是二进制乘法的笔算过程。只要寄存器够,时间够,别说100!,就是1000!都能算出来

使用特权

评论回复
19
coody| | 2010-12-1 10:47 | 只看该作者
LS,1000的阶乘,结果是1067个字节的长度。。。
100的阶乘,用汇编真的很快的,没想象的慢。

使用特权

评论回复
20
YINGZEZIGA| | 2010-12-1 10:51 | 只看该作者
此贴纯属吃饱了撑的没事干,鉴定完毕。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
aceice + 1
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

77

帖子

3

粉丝