模拟除法
今天写了pta的一道模拟除法的题,简单的记录一下~~
一,除法的运算过程
平时我们用到的除法运算实则是在从被除数的最高位数开始,不断右移,直到刚好可以大于除数的时候,进行除法运算,如果整除就直接移向下一位,否则剩下的余数作为最高位与被除数后面的数进行结合


以下是模拟这个过程的代码
//模拟代码
#include <stdio.h>
#include <string.h>
int main(void)
{
char divisor_s[1000];//被除数的字符串
int length=0;//被除数字符串的长度
while(1)//输入被除数
{
scanf("%c",&divisor_s[length]);
if(divisor_s[length]=='\n' || divisor_s[length]=='\0')
{
break;
}
length++;
}
//等效代码
/*
gets(divisor_s);
length=strlen(divisor_s);
*/
int dividend;//除数
scanf("%d",÷nd);
int begin=0;//判断开头的数是否为0
int divisor= divisor_s[0]-'0';//运算时的被除数
for(int j=1;j<=length;j++)
{
if(divisor/dividend)
{
begin=1;
}
if(begin)
{
printf("%d",divisor/dividend);
}
//先去取除剩下的余数,然后余数左移一位再加上被除数的下一位
divisor %= dividend;
divisor = divisor*10 + (divisor_s[j]-'0');
}
return 0;
}
二,例题
pta---整除光棍(点击跳转)
这道题应用了上面模拟除法的思路,需要注意的就是要判断商开头的数是否为0
//AC代码
#include <stdio.h>
int main(void)
{
int x;
scanf("%d",&x);
int count = 1;
int n=1;//“光棍”数
int k=0;//k用于判断开头是否已经有数
while(1)
{
if(n/x)//判断开头是否为非0数
{
k=1;
}
if(k)
{
printf("%d",n/x);//打印商的每一个位上的数
}
n%=x;
if(!(n%x))
{
break;
}
n=n*10+1;
count++;//count是用来记录光棍的位数的,应随着每次运算而增加
}
printf(" %d",count);
}

浙公网安备 33010602011771号