UVa 10494 如果我们再回童年

本文介绍了一种使用 C 语言实现的大数除法模拟算法,通过 longlong 类型暂存部分被除数来实现除法操作。文章详细解释了算法的思路,并分享了在实现过程中遇到的问题及解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值