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