1、直接进行整型大数之间的乘法很容易导致数据存储溢出,可以采用数组存储计算得到的每一位
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
int a[100], k=0, i, j; //定义相关变量,数组
while(1) //自行判断决定循环执行次数
{
if(n==0)
break;
printf("请输入要求的阶乘的数、输入0结束:");
scanf("%d",&n); //输入阶乘数n
printf(" %d!=",n);
for(i=0; i<100; i++) //运用循环语句对数组各元素进行初始化为0
a[i]=0;
a[0]=1; //对数组首元素初始化为1
for(i=2;i<=n;i++)
{
for(j=0;j<=k;j++)
a[j]=a[j]*i; //相邻关系的数相乘
k=k+2;
for(j=0;j<k;j++)
if(a[j]>9) //限制范围,以进位为基准
{
a[j+1]=a[j+1]+a[j]/10; //按阶乘要求改变符合条件的数组元素的值
a[j]%=10; //控制a[j]的数值范围,避免过大,影响循环条件语句的再次执行
}
while(a[k]==0) //判断数组元素是否为0并控制K的范围
k--;
}
for(i=k; i>=0; i--)//利用循环语句,逐个将对应储存阶乘结果的数组元素输出
printf("%d",a[i]);
printf("\n");
}
return 0;
}
2、大数加法运算,道理是一样的,见下面代码:
#include <stdio.h>
#include <iostream.h>
#include <string.h>
//从s连续相加到n结束
void Add(int s,int n)
{
int a[100]; //用数组的每一个元素存放计算结果的每一位
memset(a,0,100);
int k=0,max=0; //max记录数组a中的有效位
for (int i=s;i<=n;i++) //待相加的数值,从s到n
{
a[0]+=i;
k=0; //清零
for (int j=0;j<100;j++)
{
while(a[j]>=10)
{
a[j+1]=a[j+1]+a[j]/10; //超过9的需要进位
a[j]=a[j]%10;
k++;
}
}
if (k>max) //更新计算结果最大位数
{
max=k;
}
}
//输出结果
for (i=max;i>=0;i--)
{
cout<<a[i];
}
cout<<endl;
}
int main()
{
Add(100,1000);
return 0;
}