c/c++求N的阶乘,自己写了程序,但两个问题:1.输入非法值的处理。2.大数结果溢出。求解求帮助T T

 我来答
封白凝
2011-05-24 · TA获得超过994个赞
知道小有建树答主
回答量:878
采纳率:0%
帮助的人:487万
展开全部

逻辑上说这里应该是Data[j] >= 10,可能是笔误写成了>。但这又不影响结果,为什么呢?
因为不论N取什么值,都没有Data[j]=10的情况(我是说运行到if(Data[j]>10)的时候不会有)。其实只要自己算几遍就知道了,最有可能出现10的是N=5,循环到i=5时,data[1]=4,data[2]=2,接着data[1]乘五变成20,data[2]变成10(好像变成10了哦),但执行if(Data[j]>10)时,data[1]先判,此时data[1]变成0,data[2]变成了12(与10擦肩而过)。。。。
当i>10时,不用讨论了,Data[j]*i要么比十大,要么比十小了。

总结下,这个算法写的真一般。。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
porker2008
2011-05-23 · TA获得超过1.4万个赞
知道大有可为答主
回答量:7066
采纳率:62%
帮助的人:1.1亿
展开全部
#include<iostream>
#include<cstdio>
const int maxsize=5002;
const int base=100000;
using namespace std;
struct BigNumber{
int x[maxsize],size,i,j;
BigNumber(int t):size(0){
memset(x,0,sizeof(x));
for(;t;t/=base)
x[size++]=t%base;
}
BigNumber():size(0){
memset(x,0,sizeof(x));
}
void print(){
int i=size?size-1:0;
printf("%d",x[i]);
while(i--){
for(j=10;j*x[i]<base&&j<base;j*=10)
printf("0");
printf("%d",x[i]);
}
}
BigNumber operator*(int r){
int i=0,k=0;
BigNumber tmp;
while(i<size||k){
k+=x[i]*r;
tmp.x[i++]=k%base;
k/=base;
}
tmp.size=i;
return tmp;
}
};

int main()
{
int n;
while(1)
{
cout << "Please input n to calculate n!: ";
cin >> n;
if(cin.fail()||n>10000 || n<0)
{
cin.clear();
cin.sync();
cout << "Input error or number too large! Try again!" << endl;
continue;
}
BigNumber Num(1);
for(int i=2;i<=n;i++)
{
Num = Num*i;
}
cout << n << "! = ";
Num.print();
cout << endl << endl;
}
//system("pause");
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
dshh007
2011-05-23 · TA获得超过134个赞
知道答主
回答量:219
采纳率:0%
帮助的人:107万
展开全部
第一个问题,将输入参数做一个判断,伪代码:if (nNum<1 || nNum>1000) goto Error
第二个问题改用double类型
追问
我现在用cin输入,遇到小数的情况就很麻烦,cin会接取前面正确的一部分作为输入值,小数点和后面的内容就用作下次输入,所以判断是否是合法值的时候都会说正确= =
追答
定义变量时用double
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
panweiy
2011-05-23 · TA获得超过1239个赞
知道大有可为答主
回答量:760
采纳率:0%
帮助的人:720万
展开全部
等一下,我翻一下记录,我一前写的高精度阶乘应该没删
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
万古皆空1422
2011-05-23
知道答主
回答量:34
采纳率:0%
帮助的人:25万
展开全部
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>

main()
{
float s=1;int n,i,t;
scanf("%d",&n);
t=n%1;
if(t==0)
{
for(i=1;i<=n;i++)
{s=s*i;}
printf("%.0f",s);}
else
{
printf("1");}
getch();
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
?>

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式