免费注册 查看新帖 |

Chinaunix

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

关于求质数的dc程序翻译  关闭 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-04-30 11:06 |只看该作者 |倒序浏览
上次有位哥们发了个dc程序,是求质数的,分析了一下,现转换成C程序放在下面:
原dc程序:
echo '2p3p[dl!d2+s!%0=@l!l^!<#]s#[s/0ds^]s@[p]s&[ddvs^3s!l#x0<&2+l.x]ds.x'|dc

该程序使用的算法我不讨论了,翻译的c程序如下:
#include <stdio.h>
#include <math.h>

int stack[100];
int sflag=0;

int a;        /*^*/
int b;        /*!*/

void check_doing(void); /*#*/
void check_do2(void);   /*@*/
void check_prime(void); /*.*/
void xadd(void);
void xmod(void);
int  get(void);
int pop(void);
void push(int);
void dupli(void);
void xprint(void);    /*&*/

int get(void)
{
        return stack[sflag];
}

int pop(void)
{
        if(sflag<0) return -1000;

        sflag--;       
        return stack[sflag+1];
}

void push(int i)
{
        sflag++;
        stack[sflag]=i;
}

void dupli(void)
{
        push(stack[sflag]);
}

void xprint(void)
{
        printf("%d\n",stack[sflag]);       
}

void check_prime(void)
{

/*now begin the main */
        dupli();
        dupli();
        a=sqrt(pop());

        b=3;
       
        check_doing();
/*end the main*/
       
        if(pop()>0) xprint();

        push(2+pop());

        if(get()>50) return;
       
        check_prime();       
}

void check_doing(void)
{
        int c;

        dupli();
        push(b);
        dupli();
        push(2);
        xadd();
       
        b=pop();
        xmod();

        if(pop()==0) check_do2();
       
        if(!(a<b)) check_doing();
        else return;
}

void check_do2(void)
{
        pop();
        push(0);
        a=0;
}

void xadd(void)
{
        int k;

        k=stack[sflag]+stack[sflag-1];
       
        pop();
        pop();
        push(k);
}

void xmod(void)
{
        int k;
        k=stack[sflag-1]%stack[sflag];
        pop();
        pop();
        push(k);
}

void main(void)
{
        push(2);
        xprint();
        push(3);
        xprint();
        check_prime();
}

如果存为x1.c
请用gcc -g -o x x1.c -lm编译,然后用gdb跟踪就可以了。
原dc程序一直循环,我改成取出50之前的质数,如果使用dc,则改动如下:

echo '2p3p[dl!d2+s!%0=@l!l^!<#]s#[s/0ds^]s@[p]s&[ddvs^3s!l#x0<&2+d6000>.]ds.x'|dc
这样只执行到6000以内;

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
2 [报告]
发表于 2004-04-30 23:50 |只看该作者

关于求质数的dc程序翻译

好!翻译思路清晰、严谨。推荐!
建议论坛的字体该改一下了,最近总惦记着这段dc代码,直到读了楼主的帖子,才反推出来原dc代码的意思。我一直把其中的l(load)看成管道符,刚解读到.宏命令[ddvs^3s!l#x0<&2+l.x]就一头雾水,以为要做x的y次方再模除z,以为是什么高深的求解质数的方法^_^

论坛徽章:
0
3 [报告]
发表于 2004-05-01 20:49 |只看该作者

关于求质数的dc程序翻译

应该是用了欧拉定理吧,如果p是质数,则对任意2<=r<p有(r^p)%p = p

另dc是什么东西阿?

论坛徽章:
0
4 [报告]
发表于 2004-05-03 10:48 |只看该作者

关于求质数的dc程序翻译

segment fault on calculating primes within 100000, the last one is 65257.

论坛徽章:
0
5 [报告]
发表于 2005-04-03 17:25 |只看该作者

关于求质数的dc程序翻译

谁有dc的中文文档??
想不到这个东东竟然这么强!

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
6 [报告]
发表于 2005-04-03 17:40 |只看该作者

关于求质数的dc程序翻译

dc是一个任意精度的计算器.dc从标准输入读入命令,如果向dc提供参数,那么这个参数就必需是文件名,dc从文件读入并执行,所有的输出将被送到标准输出,所有的错误被送到标准错误设备,输入的数据将存放在堆栈中,每输入一个数据,dc将它放入栈中,如果输入的是算术运算符,那么dc就从栈中读取数据,并计算,将结果返回堆栈
PS:抄自:<<linux命令打全>>

论坛徽章:
0
7 [报告]
发表于 2005-04-03 20:02 |只看该作者

关于求质数的dc程序翻译

有dc应用的例子吗

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
8 [报告]
发表于 2005-04-03 22:01 |只看该作者

关于求质数的dc程序翻译

[quote]原帖由 "li2002"]有dc应用的例子吗[/quote 发表:

/home/lee#dc
1
2
3
f    //显示栈中所有数据
3
2
1
p    //显示栈顶数据
3
*    //栈顶头2个数据相乘
p   
6
f  //显示当前栈中数据
6
1
- //栈顶头2个数据相减
p
-5
f //显示栈中当前数据
-5
ctr+D //退出
PS:对dc的了解止于此

论坛徽章:
0
9 [报告]
发表于 2005-04-04 01:07 |只看该作者

关于求质数的dc程序翻译

火兄,llinux命令打全,你知道哪里有下吗?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
10 [报告]
发表于 2005-04-04 01:14 |只看该作者

关于求质数的dc程序翻译

[quote]原帖由 "ylbaby2003"]火兄,llinux命令打全,你知道哪里有下吗?[/quote 发表:

这个大全,是我手头的一本纸书,网上应该有的,google一下吧!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP