搞了一下午,弄懂了一个高精度除法
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;
}