c语言50的阶乘,这个for循环什么意思啊,有没有大佬解释一下 5

#include<stdio.h>#defineN50longs[N]={1},n=10000,t=2,a,b,m;intmain(void){for(;a<=m||++... #include<stdio.h>
#define N 50
long s[N]={1},n=10000,t=2,a,b,m;
int main(void)
{
for( ;a<= m || ++t <= N && (a=b=0,1);m==a++ && b && m++)
s[a]=(b+=s[a]*t)%n,b/=n;
for(printf(("%d"),s[m]);m--; )
printf("%04d",s[m]);
}
展开
 我来答
青飞木鸟
2018-05-06
知道答主
回答量:37
采纳率:33%
帮助的人:9.9万
展开全部

(a=b=0,1)这里是逗号运算,该运算符优先级最低,最低!。就是最后一个表达式的值。就是说(a=b=0,1)就是1{此处还有一个作用就是为a、b赋值0}

至少第一遍循环时a<=m这里的真假值暂无影响。因为||的后半部分为true

循环体:s[a]=(b+=s[a]*t)%n,b/=n;

又是一个逗号运算符,所以等价为:

s[a]=(b+=s[a]*t)%n;

b/=n;

第二个for循环:两个输出没什么好看的,就两个;中间的m--作为判断条件,m小余0时跳出。

所以,我大约展开一下。

#include<stdio.h>
#define N 50
long s[N]={1},n=10000,t=2,a,b,m;//这一排不过问了
int main(void)
{
//    for( ;a<= m || ++t <= N && (a=b=0,1);m==a++ && b && m++)
//        s[a]=(b+=s[a]*t)%n,b/=n;
//    a<= m || ++t <= N && (a=b=0,1)这个判断是这个顺序,首先看a<=m吗?真就返回//    true后边不执行,假就执行( ++t <= N && (a=b=0,1)),看++t <= N 吗?假就返//    回false,真就执行(a=b=0,1),即返回true

//我将循环的第一次的a<= m || ++t <= N && (a=b=0,1)变形
      bool kkk;      
      if(a<=m){kkk = 1;}
      else if(!(++t<=N)){kkk = 0;}
      else{a=b=0;kkk = 1;}
      
      for(;kkk;){
        //s[a]=(b+=s[a]*t)%n;
          b+=s[a]*t;
          s[a] = b%n;
          b/=n;
//下面是每次循环的m==a++ && b && m++变形
          if(!a){m = 0;}
          else if(!b){m = 0;}
          else{m = m;m++;}
//下面是后来每次循环的a<= m || ++t <= N && (a=b=0,1)变形
          if(a<=m){kkk = 1;}
          else if(!(++t<=N)){kkk = 0;}
          else{a=b=0;kkk = 1;}
      }
        
    for(printf(("%d"),s[m]);m--; )//这个循环不重要便不多说了
        printf("%04d",s[m]);
}

不容易哦,回答这个问题,我也学习了不少东西,因为有个短路原则在里面且有计算式在其间夹杂,所以两个逻辑判断必须改写成这种形式最准确、安全、有保障。

当然如果运行结果有所出入,希望您能指出,我们再学习讨论一番

捣蒜大师Edison
2019-09-14 · TA获得超过2963个赞
知道大有可为答主
回答量:3825
采纳率:77%
帮助的人:1341万
展开全部

额 原来是大数的阶乘。写的厉害 故意让人看不懂的吧==

#include <stdio.h>
#define M 30
const int N=50;
const int max=10000;
int num[M] = {1}, group = 1;
int main(void){
    for (int n = 2; n <= N; ++n){
        int go = 0;
        for (int b = 0; b < group; ++b){
            num[b] = n * num[b] + go;
            go = num[b] / max;
            if (go != 0)num[b] %= max;
        }
        if (go != 0){
            num[group] = go;
            group++;
        }
    }
    printf("%d", num[--group]);
    while (group--)printf("%04d", num[group]);
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wjcmqyd
2018-05-02 · TA获得超过5630个赞
知道大有可为答主
回答量:3236
采纳率:79%
帮助的人:838万
展开全部
运行的结果是:30414093201713378043612608166064768844377641568960512000000000000
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lloveyoutjq14
2018-05-01 · 超过35用户采纳过TA的回答
知道答主
回答量:100
采纳率:79%
帮助的人:29.7万
展开全部
a和m还没赋值 可能是个不确定的值
追问
我运行了一下,没问题的,就是50的阶乘
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式