int i, j, k;
char *temp_res, temp, temp_mul, last_res;
char flag = 0x0;
if (num1[0] == 0x30 || num2[0] == 0x30) {
res[0] = 0x30;
res[1] = '\0';
} else {
k = len1 + len2;
temp_res = (char *)malloc(k);
memset(temp_res, 0, k);
for (i = len2 - 1; i >= 0; i--) {
k = len1 + i;
for (j = len1 - 1; j >= 0; j--) {
//尽可能减少循环 每次的结果都是加了上次的结果 避免再把结果加起来
if (i == len2 - 1 || temp_res[k] == 0x0) {
//第一次乘的时候或者当前位置是0
last_res = 0x0;
} else {
//取得上一次当前位置的值
last_res = temp_res[k] - 0x30;
}
temp_mul = (num2[i] - 0x30) * (num1[j] - 0x30) + flag + last_res;//保存每一位的乘积
temp = temp_mul / 10;
if (temp > 0) {
//有余数
flag = temp;
} else {
flag = 0x0;
}
temp_res[k--] = (temp_mul % 10) + 0x30;
}
if (temp > 0 || temp_res[0] == 0x0) {
//每一次循环结束检查最高位以及那些结果不为k位数的
temp_res[k] = flag + 0x30;
}
flag = 0x0;//重置
}
k = len1 + len2;
strncpy(res, temp_res, k);
res[k] = '\0';
k++;//包含'\0'的长度
earse_zero(res, &k);
free(temp_res);
}
}
//*num待计算阶乘的数的大小,*len该数的长度
int get_fac_allocate_num(const char *num, const int *len)
{
int i, allocate_num = 0;
for (i = 1; i < *len; i++) {
allocate_num += i*9*pow(10, i-1);
}
allocate_num += *len*(data-pow(10, i-1)+1);//加上剩下的
return allocate_num;
}
//阶乘
void big_fac(const char *num, char *res)
{
int len = strlen(num), data;
int len1, len2;
int i, j, k, m, l;
char *temp_res, temp, temp_mul, last_res;
char flag = 0x0;
data = atoi(num);
if (data > 2) {
m = get_fac_allocate_num(num, &len);
temp_res = (char *)malloc(m*3);//前m个字节保存计算结果,后2块保存数据
memset(temp_res, 0, m*3);
strncpy(temp_res+m-len, num, len);
for (l = data - 1; l >= 2; l--) {
//乘法执行*num-2次
memcpy(temp_res+m, temp_res, m);//之前用strncpy居然没拷贝进去,发现strncpy碰到0就不拷贝了,那要参数n干啥
sprintf(&temp_res[2*m], "%d", l);
len1 = ystrlen(&temp_res[2*m-1]);//数据是倒着存储的,得倒着算长度
len2 = strlen(&temp_res[2*m]);
for (i = len2 - 1; i >= 0; i--) {
//k = len1 + i;
k = m - len2 + i;//定位到最后面那个数
for (j = 1; j <= len1; j++) {
//尽可能减少循环 每次的结果都是加了上次的结果 避免再把结果加起来
if (i == len2 - 1 || temp_res[k] == 0x0) {
//第一次乘的时候或者当前位置是0
last_res = 0x0;
} else {
//取得上一次当前位置的值
last_res = temp_res[k] - 0x30;
}
temp_mul = (temp_res[2*m+i] - 0x30) * (temp_res[2*m-j] - 0x30) + flag + last_res;//保存每一位的乘积
temp = temp_mul / 10;
if (temp > 0) {
//有余数
flag = temp;
} else {
flag = 0x0;
}
temp_res[k--] = (temp_mul % 10) + 0x