高精度除法

搞了一下午,弄懂了一个高精度除法

https://www.bnuoj.com/v3/problem_show.php?pid=52155

虽然按题的要求超内存了,,,但,还算是收货吧

坑点:关系运算法的优先级比赋值运算符高,少了一个括号,调试了半个小时

还有一个本来是<=结果弄成了<,有调试了半个小时

#include
#include
#include
#include
#include
#include

using namespace std;
const int maxn = 1e7 + 5;
string str1;//除数 
string str2 = "73";
string str3 = "137";
int len1;
int len2 = 2;
int len3 = 3;
int fm[maxn], num[maxn];
int SubStract(int *fm, int *num, int len1, int ll)
{
//说明比他小
	if (len1
//正序,意思是从高位开始比,比较两个的大小
		for (int i = len1 - 1; i >= 0; i--)
		{
//有一位大就肯定大
			if (fm[i]>num[i])
				break;
//有一位小就肯定小
			else if (fm[i]
//就是这个地方,i<=len1-1,少了一个小于号,导致当fm和73相等的时候出错
//模拟减法,从低位开始,不够向上一位借1
	for (int i = 0; i<=len1 - 1; i++)
	{
		fm[i] -= num[i];
		if (fm[i]<0)
		{
			fm[i] += 10;
			fm[i + 1]--;
		}
	}
	/*for (int i = len1-1; i >=0; i--)
	{
		printf("%d", fm[i]);
	}
	printf("\n");*/
//返回现在被除数的位数
	for (int i = len1 - 1; i >= 0; i--)
	{
		if (fm[i])
			return (i + 1);
	}
//说明两个数相等
	return 0;
}
//用的是指针,每次操作之后fm都会更新
int judge(int *fm, string s)
{
	int ll = s.length();
	int ntimes = len1 - ll;
//把被除数弄成和除数一样长,还是倒序
	for (int i = 0; i
//又坑了半小时..处理的第一个数是被除数的最后一位...
	for (int i = ntimes; i
//当ntemp小于0时,被除数已经小于除数,所以除数去一个0
		while ((ntemp = SubStract(fm, num + k, len1, ll - k)) >= 0)
		{
			len1 = ntemp;
		}
	}
	return len1;
}
int main()
{
	while (cin >> str1)
	{
		len1 = str1.length();
//倒向处理,因为模拟减的时候是从个位开始,个位是在字符串的最后一位,所以颠倒了
		for (int i = len1 - 1; i >= 0; i--)
		{
			fm[len1 - 1 - i] = str1[i] - '0';
		}
//如果被除数比除数小,只能是0才能
		if (len1
//看是不是能整除
		int result1 = judge(fm, str2);
		if (result1 != 0)
		{
			printf("NO\n");
			continue;
		}
		len1 = str1.length();
		for (int i = len1 - 1; i >= 0; i--)
		{
			fm[len1 - 1 - i] = str1[i] - '0';
		}
		int result2 = judge(fm, str3);
		if (result2 != 0)
		{
			printf("NO\n");
		}
		else
		{
			printf("YES\n");
		}
	}
	return 0;
}

另外还不会调试不会直接打印出来,还单步调试......

你可能感兴趣的:(走过的坑——C)