思路:借助long long类型暂存一部分的被除数,即可模拟除法。(这里是从第一位开始除除数,实现起来方便些,可以前九位初始化的)
注意:还是题目没看太好就开始做了吧,首先第二个整数是int型就可以了,结果我一开始做的是两个bign类型相除,所以一直把自己引在bign的这条路上。无奈bign我用减法代替除法都是超时,如果用这里的这个方法做,肯定也可以,但感觉没必要再bign了~所以直接用C语言字符数组写的。。参考了别人的代码,结果跟别人的差不多了%>_<%(开始自己已经有思路了,就是拿高九位初始化,然后余数左移一位再加被除数的下一位,循环除除数。发现高九位表示起来好麻烦,就看了下别人的。)这里我开始没想到这样除的原因,应该是,一我以为是两个大整数,二long和int一样范围,我没想到long long (之前用的不多~)。需要注意前导0。(我试了下,只要在输出时注意前导0就行了,把del_qzero(a,strlen(a));注释掉,也可以过~)
自己提交遇到的问题:RE,我开始while里写的是scanf(...)!=EOF;我实在找不到RE的原因,模0除0基本不可能啊,除数是固定的,除非除数一开始就是0;把循环里的改为!=3时,就提示WA。说明第三个整数读取失败,为0。看了下题目说明,果不其然,是一个或多个空格,我开始用的%c存第二个参数,虽然前面有%*c过滤一个空白符。。。这样的RE还挺难找的~这说明,还是要看清题目,看好数据描述!!!
另外,哪个大神用bign过了,跟我说下哈,其实也不是bign,就是减法代替除法的方法过了的法,求告知~ UVa 的 big number 终于做完了,向下一节出发!加油,提高效率!
Code:
#include<stdio.h>
#include<string.h>
#define MAXN 1000
void del_qzero(char *a,int len);
void divide();
void mod();
char a[MAXN];
char c[10];
int cs;
int main()
{
//char c='\0';int a=c-'0';printf("%d",a); 空字符减去'0'是-48,其实应该想通的~
while(scanf("%s%s%d",a,c,&cs)==3)//第二个参数用char不行,因为题目里说可能有多个空白符
{
//printf("%s\n%c\n%d\n",a,c,cs);
//去除前导0
del_qzero(a,strlen(a)); //printf("%s\n",a);
if(c[0]=='/')
divide();
else
mod();
}
}
void del_qzero(char *a,int len)
{
int countl=0;
for(int i=0;i<len;++i)
if(a[i]=='0') countl++;
else break;
for(int i=0;i<len-countl;++i)
a[i]=a[i+countl];
a[len-countl]='\0';
//printf("%d\n",strlen(a));
}
void divide()
{
int sum[MAXN]; //printf("hehe\n");
int len=strlen(a);
for(int i=0;i<len;++i)//这里是len,所以没访问到空字符~
sum[i]=a[i]-'0';//字符型转换成整型
long long bcs=0,ys=0;//被除数、余数
for(int i=0;i<len;++i)
{
bcs=ys*10+sum[i];//余数左移一位再加上当前位
sum[i]=bcs/cs;//sum直接保存相应为的商
ys=bcs%cs;
} //printf("%lld\n%lld\n",bcs,ys);
//处理前导0
int countl=0;
for(int i=0;i<len;++i)
if(sum[i]==0) countl++;
else break;
for(int i=0;i<len-countl;++i)
a[i]=(char)(sum[i+countl]+'0');
a[len-countl]='\0';
if(len-countl==0)//长度为0时,空字符输出为空,应输出0
printf("0\n");
else
printf("%s\n",a);
}
void mod()
{
int sum[MAXN];
int len=strlen(a);
for(int i=0;i<len;++i)//这里是len,所以没访问到空字符~
sum[i]=a[i]-'0';//字符型转换成整型
long long bcs=0,ys=0;//被除数、余数
for(int i=0;i<len;++i)
{
bcs=ys*10+sum[i];//余数左移一位再加上当前位
sum[i]=bcs/cs;//sum直接保存相应为的商
ys=bcs%cs;
}
printf("%lld\n",ys);//long long型
}