UVa 10494 如果我们再回童年

来源:互联网 发布:马云的淘宝店 编辑:程序博客网 时间:2024/05/22 19:18

思路:借助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 1000void 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型 } 


0 0