ub求助
查看原帖
ub求助
460715
cosmos31415926楼主2023/11/6 14:28

有人说可能有undefined behavior,大佬们帮忙看看

#include <bits/stdc++.h>
using namespace std;
int n;
int ans[100], mem[100];
bool zero_over;
void mem_multiply_i(int num)
{
	int first_digit[100];
	int second_digit[100];
	int first = num % 10, second = num / 10;
	int carry = 0;
	for (int i = 0; i < 100; i++)
	{
		first_digit[i] = mem[i] * first % 10 + carry;
		carry = mem[i] * first / 10;
		if (first_digit[i] >= 10)
		{
			carry += first_digit[i] / 10;
			first_digit[i] %= 10;
		}
	}
	if (second == 0)
	{
		for (int i = 0; i < 100; i++)
		{
			mem[i] = first_digit[i];
		}
		return;
	}
	carry = 0;
	for (int i = 1; i < 100; i++)
	{
		second_digit[i] = mem[i - 1] * second % 10 + carry;
		carry = mem[i - 1] * first / 10;
		if (second_digit[i] >= 10)
		{
			carry += second_digit[i] / 10;
			second_digit[i] %= 10;
		}
	}
	carry = 0;
	for (int i = 0; i < 100; i++)
	{
		mem[i] = first_digit[i] + second_digit[i] % 10 + carry;
		carry = first_digit[i] + second_digit[i] / 10;
		if (mem[i] >= 10)
		{
			carry += mem[i] / 10;
			mem[i] %= 10;
		}
	}
}

void ans_plus_mem()
{
	int carry = 0;
	for (int i = 0; i < 100; i++)
	{
		ans[i] += carry;
		carry = (ans[i] + mem[i]) / 10;
		ans[i] = (ans[i] + mem[i]) % 10;
		if (ans[i] >= 10)
		{
			carry += ans[i] / 10;
			ans[i] %= 10;
		}
	}
}

int main()
{
	scanf("%d", &n);
	mem[0] = 1;
	for (int i = 1; i <= n; i++)
	{
		mem_multiply_i(i);
		ans_plus_mem();
	}
	for (int i = 99; i >= 0; i--)
	{
		if (zero_over or ans[i] != 0)
		{
			zero_over = true;
			printf("%d", ans[i]);
		}
	}
	return 0;
}
2023/11/6 14:28
加载中...