【C语言】求n!位数m,并为其分配空间,但程序输入大于16之后的数就不对了,求大神指教
#include<stdio.h>#include<malloc.h>#include<math.h>intmain(){intn,m,t,i,j,x=1;int*a=(...
#include<stdio.h>
#include <malloc.h>
#include<math.h>
int main()
{
int n,m,t,i,j,x=1;
int *a=(int *)malloc(m*sizeof(int));
printf("请输一个小于等于1000正整数n:");
scanf("%d",&n);
if (n<=0||n>1000)
printf ("data error! \n");
else
for(i=1;i<=n;i++)
x*=i;
m=log10(x)+1;
t=m-1;
for(i=t;i>=0;i--)
{
t=x%10;
x/=10;
a[i]=t;
}
printf("储存了一个%d位的正整数:\n",m);
for(i=0;i<m;i++)
printf("%d",a[i]);
printf("\n");
return 0;
} 展开
#include <malloc.h>
#include<math.h>
int main()
{
int n,m,t,i,j,x=1;
int *a=(int *)malloc(m*sizeof(int));
printf("请输一个小于等于1000正整数n:");
scanf("%d",&n);
if (n<=0||n>1000)
printf ("data error! \n");
else
for(i=1;i<=n;i++)
x*=i;
m=log10(x)+1;
t=m-1;
for(i=t;i>=0;i--)
{
t=x%10;
x/=10;
a[i]=t;
}
printf("储存了一个%d位的正整数:\n",m);
for(i=0;i<m;i++)
printf("%d",a[i]);
printf("\n");
return 0;
} 展开
5个回答
展开全部
#include <stdio.h>
#include <malloc.h>
#include <math.h>
#include <string.h>
int main()
{
int n, m, t, i, j, x = 1;
int a[4000];
printf("请输一个小于等于1000正整数n:");
scanf("%d", &n);
if (n <= 0 || n > 1000) {
printf("data error! \n");
return -1;
}
else {
memset(a, 0, sizeof(a));
a[0] = 1;
m = 1;
for (i = 1; i <= n; i++) {
x = 0;
for (j = 0; x || j < m; j++) {
a[j] = a[j] * i + x;
x = a[j] / 10;
a[j] = a[j] % 10;
if (j >= m) {
m = j + 1;
}
}
}
}
for (i = 0, j = m - 1; i < j; i++, j--) {
t = a[i];
a[i] = a[j];
a[j] = t;
}
printf("储存了一个%d位的正整数:\n", m);
for (i = 0; i < m; i++)
printf("%d", a[i]);
printf("\n");
return 0;
}
更多追问追答
追问
好厉害!可是要使用malloc函数怎么做呢?作业要求用这个。。。上面那个看不懂哎。。
追答
int a[4000];
改为
int *a = (int*)malloc(sizeof(int) * 4000);
程序结束记得补上
free(a);
展开全部
怎么个不对法?
如果是忽然出现一个很离谱而且很大的数或很小的负数,那么,恭喜你,溢出了。表示int无法满足你的计数要求,试试double
如果是忽然出现一个很离谱而且很大的数或很小的负数,那么,恭喜你,溢出了。表示int无法满足你的计数要求,试试double
追问
怎么改 呢?可是x就是整型啊,刚刚改了double类型出问题了,强制类型转换也有问题,刚刚改了长整型也不对,求指点怎么改QAQ
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
int的字节不够16的阶乘,改为double就可以了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
有两个问题 :
1.int *a=(int *)malloc(m*sizeof(int));m没赋值 a申请空间不对
2.x为有符号的int类型,16次以后已经超出其范围,所以结果不对。
1.int *a=(int *)malloc(m*sizeof(int));m没赋值 a申请空间不对
2.x为有符号的int类型,16次以后已经超出其范围,所以结果不对。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
结成结果数字过大,溢出了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询