zara
码龄21年
  • 5,400
    被访问
  • 3
    原创
  • 843,699
    排名
  • 366
    粉丝
  • 0
    铁粉
关注
提问 私信
IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:江苏省
  • 加入CSDN时间: 2001-09-10
博客简介:

zara的专栏

查看详细资料
个人成就
  • 获得2次点赞
  • 内容获得1次评论
  • 获得7次收藏
创作历程
  • 1篇
    2012年
  • 2篇
    2006年
成就勋章
  • 最近
  • 文章
  • 资源
  • 问答
  • 帖子
  • 视频
  • 课程
  • 关注/订阅/互动
  • 收藏
搜TA的内容
搜索 取消

这个求99以内阶乘的程序怎么错了?

答:

补个截图

img

回答问题 2021.08.24

这个求99以内阶乘的程序怎么错了?

答:

不应该吧。最上面的代码,用 AStyle 重排了下,就修改了上面两行,24! 结果和 windows 的计算器一样,加了输入 n 值计算 99!,前面的也和 windows 的计算器的一样。

// 这个求99以内阶乘的程序怎么错了?
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
    char num[200];//大数
    int count; // 大数的位数
} data;
data total(data temp,int num);
data elemulti(data temp,int elementx);
int main(int argc, char *argv[])
{
    data temp= {{'1'},1};
    int i, ic;
    printf("n=");
    scanf("%d", &ic);
    for(i=1; i<=ic; i++)
        temp=total(temp,i);
    printf("%d!=", ic);
    for(i=temp.count-1; i>=0; i--)
        printf("%c",temp.num[i]);
    return 0;
}
data elemulti(data temp,int elementx)
{
    int i,t;
    data tempx= {{0}};
    for(i=0; i<temp.count; i++)
    {
        t=(temp.num[i]-'0')*elementx+tempx.num[i];
        tempx.num[i]=(t%10+'0');
        if(tempx.num[i]-'0'>=10)
        {
            tempx.num[i+1]+=1;
            tempx.num[i]=(tempx.num[i]-'0')%10+'0';
        }
        tempx.num[i+1]+=t/10;
        if((i==temp.count-1)&&(t/10>0))
        {
            temp.count++;
            tempx.num[i+1]+='0';
            break;
        }
    }
    tempx.count=temp.count;
    return tempx;
}
data total(data temp,int num)
{
    data temp1,temp2;
    int i,t=0;
    int element1=num%10;//个位
    int element2=(num/10)%10;//十位
    if(element2==0)
        temp=elemulti(temp,element1);
    else
    {
        temp1=elemulti(temp,element1);
        temp2=elemulti(temp,element2);
        temp.num[0]=temp1.num[0];
        temp.count=temp2.count+1;
        for(i=0; i<temp2.count; i++) //个位与十位相加
        {
            if(i<temp1.count-1)
            {
                temp.num[i+1]=t+temp2.num[i]+temp1.num[i+1]-'0';
                t=0;
            }
            else
            {
                temp.num[i+1]=temp2.num[i]+t;
                t=0;
            }
            if(temp.num[i+1]-'0'>9)
            {
                t=((temp.num[i+1]-'0')/10);
                temp.num[i+1]=(temp.num[i+1]-'0')%10+'0';
                if(i==temp2.count-1)
                {
                    temp.count++;
                    temp.num[i+2]=t+'0';
                }
            }
        }
    }
    return temp;
}
// 23的阶乘都能算,24的阶乘最高位差了1。
回答问题 2021.08.24

这个求99以内阶乘的程序怎么错了?

答:

就当前位的计算来说是对的,但最后一位时判断的 t 没有加上啊;当然了,前面的也没加,但由于你说的 += 操作,所以,不影响。
这两行修改如下试试,即不用 += 而是直接加到 t 里?

    t = ( temp.num[i] - '0' ) * elementx + tempx.num[i];
    tempx.num[i] = ( t % 10 + '0' );
回答问题 2021.08.23

这个求99以内阶乘的程序怎么错了?

答:

elemulti() 函数里,最后的进位判断考虑的 t,只是当前位的乘,没有考虑可能由低位产生的进位,如 24! 这里,23!=25....x(2)4,最后判断时,只是 2x4=8,认为没有进位,实际上是上一循环的 5x4=20 有个进位 2,加上本次的 8 就是 10,是有进位的。

回答问题 2021.08.23

为什么这个最后输出是20而不是25

答:

除 2有余数时 continue,即奇数时 continue,即偶数才参与下面的累加,就是 2+4+6+8=20

回答问题 2021.08.14

结果说是格式错误,可是我找不出来,怎么改呀

答:

include 前面要有井号# 如 #include <stdio.h> 吧

回答问题 2021.08.01

资源方式定义的窗口示例

发布资源 2014.05.14 ·
rar

masm中定义中文unicode所需inc文件

发布资源 2014.02.12 ·
rar

国际通用.xls

发布资源 2013.05.15 ·
xls

xlsx简单分析

外来的一 xls 文件,03 打开时提示格式方面有问题“为免文件损坏已删除了部分格式”。该文件有些单元格无法设置新的文字颜色,甚至无法整体将所有的工作表复制到其它工作簿中,一个个的工作表复制时,也会在某个时候出现名称方面的错误;最后,新建一工作簿,并排窗口,通过拖放的方式才将所有工作表复制到了新的工作簿里。新的文件保存后再打开,没有了格式方面的问题提示,以为问题就这样解决了。但是,后来
原创
发布博客 2012.06.08 ·
2035 阅读 ·
1 点赞 ·
1 评论

PSNEWSID.EXE

发布资源 2011.02.24 ·
application/x-rar

Irvine32组件

发布资源 2010.07.19 ·
application/x-zip

excel中具有独立值的合并单元格

发布资源 2010.02.26 ·
application/msword

多实例导入的Foxmail截图

发布资源 2010.01.12 ·
image/png

不能插入对象的xls

发布资源 2009.12.30 ·
application/msword

对天敏电视精灵I老版播放器的修改和分析

原来的台式机上用的是天敏电视精灵I电视卡看电视的. 后来用了其 UT800 的播放程序, 觉得有些快捷功能操作还是可以的, 但 TVBABYI 的老版播放程序并没有提供, 而新版的播放器又将暂停功能 (暂停画面, 声音还在, 而且 cpu 占用率降为 0) 给取消了, 播放窗口也有些累赘. 所以还是对老版的播放程序做些简单的修改. 由于其原来程序结构的限制, 只能有 3 个键可以使用, 即 "+-
原创
发布博客 2006.11.05 ·
1656 阅读 ·
0 点赞 ·
0 评论

"任务管理器" 的异状

  "任务管理器" 是 Win2000/xp 系统中非常频繁使用到的的 Windows 系统自带的一个程序. 打开后, 有个比较常见的问题, 就是在 "进程" 页中的 "用户名" 一栏中显示异常. 如果是所有的项都没有显示内容的话, 据说是由于 "服务" 中停止了 "Terminal" 的缘故, 打开该服务就会正常显示进程所属用户名. 但, 有时是部分项有用户名, 有些却没有. 这个是由于在 "控
原创
发布博客 2006.09.10 ·
1281 阅读 ·
1 点赞 ·
0 评论
加载更多