1.大数相乘问题
【原理解析】
【代码详解】
#include <stdio.h>
#define maxSize 10000
int main()
{
int n, m, a[maxSize];
int temp, digit;
int i, j;
n = 27465, m = 12;
digit = i = j = 0;
while (m)
{
a[j++] = m % 10;
m = m / 10;
digit++;
}
int num = 0;
for (j = 0; j < digit; j++)
{
temp = a[j] * n + num;
a[j] = temp % 10;
num = temp / 10;
}
while(num)
{
a[digit] = num % 10;
num = num / 10;
digit++;
}
for (i = digit - 1; i >= 0; i--)
printf("%d", a[i]);
return 0;
}
2.大数阶乘问题
【原理】
【代码】
#include <stdio.h>
#define maxSize 1000
//循环法求大数阶乘
void Factorial(int n,int a[])
{
int i, j;
int digit,temp, num;
//将阶乘数作为乘数,1作为阶乘数的初始值
a[0] = 1;
digit = 1;
//将n作为被乘数
for (i = 2; i <= n; ++i)
{
num = 0;
for (j = 0; j < digit; ++j)
{
temp = a[j] * i + num;
a[j] = temp % 10;
num = temp / 10;
}
while (num)
{
a[digit++] = num % 10;
num /= 10;
}
}
printf("%d! = ", n);
for (i = digit - 1; i >= 0; --i)
{
printf("%d", a[i]);
}
}
//递归做法
int digit2 = 0;
int a2[maxSize];
void Factorial2(int n)
{
if (n == 1)
{
int i;
digit2++;
a2[0] = 1;
//输出
printf("%d! = ", n);
for (i = digit2 - 1; i >= 0; --i)
{
printf("%d", a2[i]);
}
printf("\n");
}
else
{
int num, temp;
int i,j;
//先求n-1的阶乘数
Factorial2(n - 1);
//拿n与n-1的阶乘数相乘
num = 0;
for (j = 0; j < digit2; ++j)
{
temp = a2[j] * n + num;
a2[j] = temp % 10;
num = temp / 10;
}
while (num)
{
a2[digit2++] = num % 10;
num /= 10;
}
//打印阶乘数
printf("%d! = ", n);
for (i = digit2 - 1; i >= 0; --i)
{
printf("%d", a2[i]);
}
printf("\n");
}
}
int main()
{
int a[maxSize];
int n = 10;
int i;
//循环方法求输出n的阶乘全部有效数字
printf("循环输出:\n");
for (i = 1; i <= n; ++i)
{
Factorial(i, a);
printf("\n");
}
printf("\n");
//递归法
printf("递归输出:\n");
Factorial2(n);
return 0;
}
【测试结果】