模拟除法

今天写了pta的一道模拟除法的题,简单的记录一下~~

一,除法的运算过程

平时我们用到的除法运算实则是在从被除数最高位数开始,不断右移,直到刚好可以大于除数的时候,进行除法运算,如果整除就直接移向下一位,否则剩下的余数作为最高位与被除数后面的数进行结合
image
image

以下是模拟这个过程的代码

//模拟代码
#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",&dividend);
	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);
}
posted @ 2022-08-24 00:05  烟尘墨  阅读(88)  评论(0)    收藏  举报