求指导大数阶乘,自己写了一个但是值到30就不准确了

LcShadow 2015-01-16 04:43:01
#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main() {
long a[3000] = {0};
int n,i,m,j;
a[0] = 1;
printf("请输入n:");
scanf("%d",&n);
for(i = 1,j = 0;i <= n;i++){
for(m = 0;m <= j;m++){
a[m] = a[m]*i;
}
for(m = 0;m < 2999;m++){
while(a[m] > 10){
a[m+1] = a[m+1] + a[m]/10;
a[m] = a[m]%10;
}
}
while(a[j] > 0)
j++;

}
for(i = j-1;0 <= i;i--){
printf("%ld",a[i]);
}
printf("\n总共%d位",j);
return 0;
}
...全文
108 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xionggch 2015-01-19
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main() 
{
	long a[3000] = {0};
	int n,i,m,j;
	int k= 1;
	a[0] = 1;
	printf("请输入n:");
	scanf("%d",&n);
	for(i = 1,j = 0;i <= n;i++)
	{
		for(m = 0;m <= j;m++)
		{
			a[m] = a[m]*i;
		}
		for(m = 0;m <= j;m++)
		{
			if(a[m] > 10)
			{
				a[m+1] = a[m+1] + a[m]/10;
				a[m] = a[m]%10;
			}
		}
		if(a[j] > 0)
			j++;
		
	}
	for(i = j-1;0 <= i;i--){
		printf("%ld",a[i]);
	}
	printf("\n总共%d位",j);
	return 0;
}
LcShadow 2015-01-16
  • 打赏
  • 举报
回复
大神们,,,小弟受教了,,,,
fly_dragon_fly 2015-01-16
  • 打赏
  • 举报
回复
进位处理有问题,while(a[j] > 0) j++; 遇到10不是分成0和1了,要么记一下位数,或者直接找一下换成 for(j=3000;!a[j-1];j--);
动力风暴 2015-01-16
  • 打赏
  • 举报
回复
向楼主推荐: 我以前看过这个帖子:http://bbs.csdn.net/topics/390962326 这个帖子中5楼有赵4老师的解答,楼主可参考其思路……
FancyMouse 2015-01-16
  • 打赏
  • 举报
回复
看懂我意思。你比如乘之前数是1,那么j=1。假设乘以后是101,那么a[j](a[1])还是0,但是这时候a[2]是1,所以你实际j应该要弄成3,但是按照你的逻辑j还是1,那就丢了最高位的数字了。
LcShadow 2015-01-16
  • 打赏
  • 举报
回复
但是我的第二for循环已经把每个数都保持在10以内了哈。。。
FancyMouse 2015-01-16
  • 打赏
  • 举报
回复
while(a[j] > 0) j++; 位数不是这么算的。你假设一个1一下子蹦到101,按你这办法你会以为还是1。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧