免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2560 | 回复: 9
打印 上一主题 下一主题

[算法] 小菜鸟的一道C算法题,请指教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-13 22:42 |只看该作者 |倒序浏览
假定你所使用的计算机能够表示的最大整数为32767.写出一个算法,该算法能够对于任意输入的正整数n输出1+2+...+n的精确值,其中1≤n≤32767.(不要想用浮点数解)

论坛徽章:
0
2 [报告]
发表于 2007-11-13 22:54 |只看该作者
n为偶数时:1+2+3+....+n=n/2 *(n+1)
n为奇数时:1+2+3+....+n=n/2*(n+1)+(n+1)/2

然后用字符串进行加和乘操作即可。

论坛徽章:
0
3 [报告]
发表于 2007-11-14 08:55 |只看该作者
计算应该很容易了,关键是判断是不是结果越界

不知道越界你想怎样处理?

论坛徽章:
0
4 [报告]
发表于 2007-11-14 09:18 |只看该作者
原帖由 gengpengfeiX 于 2007-11-14 08:55 发表
计算应该很容易了,关键是判断是不是结果越界

不知道越界你想怎样处理?

最大是:536854528

论坛徽章:
0
5 [报告]
发表于 2007-11-15 00:22 |只看该作者
用数组,先判断一下数字位数,定义数组,一个元素对应一个数位,从个位到十位一一一对应.
对每一次加法,都加在个位对应的数组元素上,如果元素值超过10,则向十位进位,再对十位进行计算,如果也超过10,向百位进位。。以此类推。。.。最后将数组输出即可。

论坛徽章:
0
6 [报告]
发表于 2007-11-15 00:27 |只看该作者
没有人学过汇编?
x86有专门的指令用于打包整数运算(SIMD).
扯不上什么算法不算法的.

论坛徽章:
0
7 [报告]
发表于 2007-11-15 00:30 |只看该作者
#include <stdint.h>

struct uint16 {
    uint8_t    l;
    uint8_t    h;
};

struct uint16
nadd(uint8_t n)
{
    uint_t x, y;
    struct uint16 r;

    r.l = (n*n + n) >> 1;

    x = n >> 4;
    y = n >> 4;
    if(n & 0xf)
        y++;
    y = y >> 1;
    r.h = x * y;

    return r;
}

没测试。
这里假定处理器字长为8位。用struct int16表示计算结果。

[ 本帖最后由 chenzengjie 于 2007-11-15 08:59 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2007-11-15 13:59 |只看该作者
写一个大整数的算法,我记得数据结构(张XX,清华那本吧)后面有道课后题是类似的。

论坛徽章:
0
9 [报告]
发表于 2007-11-15 22:21 |只看该作者
原帖由 chenzengjie 于 2007-11-15 00:27 发表
没有人学过汇编?
x86有专门的指令用于打包整数运算(SIMD).
扯不上什么算法不算法的.



在下才疏学浅,确实还没学过汇编,计划明年学习

论坛徽章:
0
10 [报告]
发表于 2007-11-19 15:54 |只看该作者

wu

记得一次用汇编写个乘法,用了78个变量,比较繁琐。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP