| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2353 人关注过本帖
标题:[讨论]在csdn上发的“雨中飞燕计算1000!”程序解释,请大家一起讨论一下
只看楼主 加入收藏
yangzhks
Rank: 2
等 级:论坛游民
威 望:3
帖 子:1135
专家分:13
注 册:2006-10-27
结帖率:28.57%
收藏
 问题点数:0 回复次数:20 
[讨论]在csdn上发的“雨中飞燕计算1000!”程序解释,请大家一起讨论一下

//看不懂下面代码部分,请各位帮我解释分析一下好吗
//计算1000!
#include <stdio.h >
#define N 1000 //要计算的N
long s[N]={1,1},n=N,t=2,a=1,b=0;
int main()//雨中飞燕之作
{
for(;a <= *s ¦ ¦ (++t <= n ? (b = 0 , a =1) : 0) ; (*s == a++ && b) ? (*s) ++ : 0)
s[a] = (b += s[a] *t) %10000 , b /= 10000 ;


for(printf("%d",s[*s]);--*s >0;)printf("%04d",s[*s]);
return 0;
}

搜索更多相关主题的帖子: csdn 飞燕 解释 
2007-10-02 13:53
yangzhks
Rank: 2
等 级:论坛游民
威 望:3
帖 子:1135
专家分:13
注 册:2006-10-27
收藏
得分:0 
//分解代码
#include "stdio.h"
int main()
{
int i,j;
int b=0;
int s[1000]={1,1};
for(i=2;i<1000;i++)
{
b=0;
for(j=1;j<=s[0];j++)
{
b += s[j]*i;
s[j]=b%10000;
b /=10000;
}
if(b!=0)
{
s[0]++;
s[s[0]]=b;
}
}
printf("%d",s[s[0]]);
for(;--s[0]>0;)
printf("%04d",s[s[0]]);
return 0;
}
2007-10-02 13:54
h28754532
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2007-9-29
收藏
得分:0 
首先这个地方的*s是什么意思?
for(;a <= *s ¦ ¦ (++t <= n ? (b = 0 , a =1) : 0) ; (*s == a++ && b) ? (*s) ++ : 0)
/ for(;1 <= *s ¦ ¦ (++2 <= 1000 ? (b = 0 , a =1) : 0) ; 0 /

2007-10-02 14:13
yangzhks
Rank: 2
等 级:论坛游民
威 望:3
帖 子:1135
专家分:13
注 册:2006-10-27
收藏
得分:0 
忘了,在那个论坛有一部分解释
雨中飞燕的C语言功底相当深厚!
在一个for语句中的条件表达式和改变条件的运算中作了大量的运算,但是代码却只有一行,虽然这样的代码非常难以理解,但是效率却是非常高的.
for语句的括号里应该是三部分,分别用分号隔开:
第一部分为初始化,因为在main函数之外就做了,所以这里省略了;
第二部分是一个条件表达式 a <= *s ¦ ¦ (++t <= n ? (b = 0 , a =1) : 0) ,只要这个表达式为真,就不会退出循环;
这是一个或运算的条件表达式, *s 是取 s数组中的第一个数据,如果a <=它,条件为真,若为假,则继续看一下条件是否为真,下一个条件是
(++t <= n ?(b=0,a=1):0)
它是一个三元运算符(C/C++中惟一一个三元运算符)表达式,这个条件首先将t加1,然后与n比较,如果加1之后 t <=n 那么计算表达式(b=0,a=1)的值作为条件,否则就是假(即0),表达式(b=0,a=1)是一个逗号运算符构成的表达式,它将b赋0值,a赋1值,并且返回a的值,也就是1,C语言中1用于逻辑表达式时,表示真值;
第三部分应该是每执行一次循环体内的语句之后,在进行下一次循环之前要运行的,它常用来调整循环变量,供第二部分判断退出循环的条件用的,这里也是一个三元运算符表达式: (*s==a++&&b)?(*s)++:0)执行的方法与上一个类似.
以上仅仅是语法上的解释.相信你弄懂了语法,再考查一下它的算法,就会容易一些了.
2007-10-02 14:30
yangzhks
Rank: 2
等 级:论坛游民
威 望:3
帖 子:1135
专家分:13
注 册:2006-10-27
收藏
得分:0 
基本原理就是用一个数组S表示大数相乘的结果.数组中每个元素表示的数最大9999.
比如34 5678 9876 5432这个大数可以把5432放在S[0]中,9876放在S[1]中,5678放在S[2]中,34放在S[3]中.
2007-10-02 14:38
h28754532
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2007-9-29
收藏
得分:0 
(++t <= n ?(b=0,a=1):0)
应该循环998次,应执行B=0,A=1
2007-10-02 14:41
h28754532
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2007-9-29
收藏
得分:0 

列出循环语句求得如下
int a=1
scanf(%d,&i)
for(i=1;i<=1000;i++)
{if(i=0)
return0;
a=a*i}

[此贴子已经被作者于2007-10-2 15:01:42编辑过]

2007-10-02 14:44
h28754532
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2007-9-29
收藏
得分:0 

列出循环语句求得如下
int a=1
scanf(%d,&i)
for(i=1;i<=1000;i++)
{if(i=0)
return0;
a=a*i}

2007-10-02 15:00
雨中飞燕
Rank: 3Rank: 3
等 级:禁止访问
威 望:8
帖 子:2200
专家分:0
注 册:2007-8-9
收藏
得分:0 
啊?CSDN上哪个帖子
2007-10-02 15:16
缘吇弹
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:地球
等 级:版主
威 望:43
帖 子:3038
专家分:27
注 册:2007-7-2
收藏
得分:0 
哈哈.发了自己都不知道了吧.

Repeat  Life=Study;Until (death);
2007-10-02 15:17
快速回复:[讨论]在csdn上发的“雨中飞燕计算1000!”程序解释,请大家一起讨论一 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027654 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved