PAT 乙等 1017 C语言

1017. A除以B (20)


本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得A = B * Q + R成立。

输入格式:

输入在1行中依次给出A和B,中间以1空格分隔。

输出格式:

在1行中依次输出Q和R,中间以1空格分隔。

输入样例:
123456789050987654321 7
输出样例:
17636684150141093474 3


思路:只能用字符串一位一位转化为数字处理。被除数从字符串左侧起转化一位除以除数,若有余数乘10留到下一位,否则为零,余数乘10留到下一位。注意若第一位被除数小于除数不能输出零,必须有非零位输出后才可以输出0

一、起始变量

1.除数divider,被除数dibideder,每位余数left

2.flag标志位,用来标记是否有商的非零位输出

二、运算

1.读入被除数和除数。

2.在for循环中一位一位转化被除数,转化一位除以被除数,若非零输出,若为零,在已经有非零位商输出的前提下输出,否则不输出。

3.若有余数乘10留到下一位

4.若flag一直为0,则说明被除数小于除数,输出0

三、代码

#include "stdio.h"
#include "string.h"
int main()
{
	char divideder[1001];
	int divider;
	int flag = 0;//是否有非零位商输出,在没有非零位输出之前0不输出; 
	int i;
	int left = 0;//每位整除之后的余数; 
	scanf("%s %d", divideder, ÷r);
	int len = strlen(divideder);
	//如果被除数为0,直接得结果; 
	for(i = 0; i < len; i++)
	{
		
		left = left*10 + divideder[i] - '0';
		
		if(left >= divider)
		{
			printf("%d",left / divider);
			flag = 1;//输出商,并改变flag的值,flag是是否有一位的商被输出的标志 
		}
		else if(flag)
		{
			printf("0");//商的第一位输出后,且被除数的第i位小于除数,则输出0; 
		}
		left = left % divider;//得到余数 
		
	}
	if(flag == 0)
	{
		printf("0");
	}//被除数只有一位且小于除数; 
	printf(" %d",left);
	return 0;
}


你可能感兴趣的:(PAT,乙等)