A/B Problem
时间限制:
1000
ms | 内存限制:
65535
KB
难度:
3
-
描述
-
做了A+B Problem,A/B Problem不是什么问题了吧!
-
输入
- 每组测试样例一行,首先一个号码A,中间一个或多个空格,然后一个符号( / 或者 % ),然后又是空格,后面又是一个号码B,A可能会很长,B是一个int范围的数。 输出
- 输出结果。 样例输入
-
110 / 100 99 % 10 2147483647 / 2147483647 2147483646 % 2147483647
样例输出
-
1 9 1 2147483646
上传者
- TC_杨闯亮
大数除法代码思想跟 笔算的除法过程一样,例 45689 / 12,先是4 /5,商0余4,下面是4*10+5即45/12,商3余9,然后9*10+6即96/12,商8余0,继续下去。。。。输出的时候排除前导0,就是商了。如果输出余数,那就是最后更新过的那个余数。还有一种算法就是循环次数太多,一直进行减法运算。
代码:
#include<stdio.h>
#include<string.h>
#define LL long long
#define N 100000
int main()
{
LL i,x,b,k,ll,c[N]; //都定义成long long总不会错
char s[N],ss[3];
while(~scanf("%s%s%lld",s,ss,&b))
{
int flag = -1; //flag = 0 时为除法,flag = 1时为取余
if(strcmp(ss,"/")==0) flag = 0;
else flag = 1;
x=0;ll=0;
for(i=0; s[i]; i++) //不管是除法还是取余,过程都一样,只是最后的输出不一样
{
x=x*10+s[i]-'0'; //当前的被除数
c[ll++]=x/b;
x=x%b; //更新当前的余数
}
if(flag == 0)
{
k=0;
for(i=0; i<ll; i++)
{
if(c[i])
k=1;
if(k)
printf("%lld",c[i]);
}
if(k == 0) // 当商为0的情况没有考虑,错了好多好多次
printf("0");
printf("\n");
}
else //直接输出余数
printf("%lld\n",x);
}
return 0;
}