L1-046 整除光棍

这道题不会,刚开始想到的是开long long型的,但是感觉不会那么简单,就百度了一下

然后就发现了竖式除法这个好东西,把这到题交了之后自己又延申了一下,做了个竖式除法的代码出来(正整数的)

先贴一下AC代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char a[100005];
int main()
{
    int n,j=0,len=0;
    scanf("%d",&n);
    int x=1;
    while(1)
    {
        if(j||x/n)//判断是否开始,前面带j的原因是商中的某一位极有可能为0
        {
            a[j]='0'+x/n;
            j++;
        }
        len++;//计算长度
        x=x%n;
        if(x==0)
        {
            a[j]='\0';
            printf("%s %d\n",a,len);
            break;
        }
        x=x*10+1;
    }
}

然后看一下竖式除法(这都还是小学学的,我小学怎么没那么聪明?)

 百度上随便找到图片,可以看到,实际上在进行竖式除法的时候“商的每一位”是只和做为被除数的数字前几位有关系,利用这一点就可以进行位数很大的加减乘除(这段实在有点词不达意...)

于是就有了下面的代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char a[100005],str[100005];
int main()
{
    int n,j=0,len=0,lens;
    scanf("%s",str);//被除数
    scanf("%d",&n);//除数
    lens=strlen(str);
    int x=(str[0]-'0');
    while(1)
    {
        if(j||x/n)
        {
            a[j]='0'+x/n;//做字符型时得这样写
            j++;
        }
        x=x%n;
        len++;//位数增加
        if(len==lens)//判断是否到除数最后一位
        {
            a[j]='\0';
            printf("%s\n",a);
            printf("%d",x);//余数
            break;
        }
        x=x*10+(str[len]-'0');//数字增加
    }
}

还是感觉表述的不太清晰,但是就跟着代码和式子理解一下,应该很快就能懂,

这段代码有点小bug的,只能做正整数的除法,小数和负数包括像“0001”这样的输入方式还没有解决(懒得改代码,能理解到思想就行)

 

 随便跑了几次,应该是没问题的

如果代码有错误的话,欢迎指正

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值