其他分享
首页 > 其他分享> > L1-046 整除光棍

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”这样的输入方式还没有解决(懒得改代码,能理解到思想就行)

 

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

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

 

 

 

标签:除法,int,代码,len,str,L1,046,整除,include
来源: https://blog.csdn.net/RuaUnicorn/article/details/118857255