当前位置:网站首页>PAT乙级1017: A除以B

PAT乙级1017: A除以B

2022-07-17 05:04:00 哆啦k梦0219

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

输入格式:

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

输出格式:

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

输入样例:

123456789050987654321 7

输出样例: 

17636684150141093474 3

代码长度限制

16 KB

时间限制

100 ms

内存限制

64 MB

题意分析 

本题的意思很容易理解,就是计算正整数A/B的商Q余数R,但是问题在于A的位数涉及到整形的范围问题。我们知道C语言中int型的字节数一般为4,范围为[-2^31~2^31-1],很明显是不够用的,所以一开始我想到了用Python语言来解决这个问题。

法一:Python

a,b=map(int,input().split(" "))
m=divmod(a,b)
print(m[0],m[1])

其中divmod(a,b)为Python的一个内置函数,返回的是包含商和余数的一个列表list[Q,R];

map(function, iterable)也是python中的一个内置函数(可以理解为映射):第一个参数是一个函数,第二个参数是一个序列,序列里面的每个元素作为function函数的参数进行计算和判断,函数返回的结果会作为新的元素保存起来。map函数返回的结果为一个经过function后的新序列,该序列就是序列iterable在function上一个映射。

当然如果不用这些函数也完全可以解决问题:

str = input()
list = str.split(" ")
a=int(list[0])
b=int(list[1])
print(a//b,a-a//b*b)

其中应注意Python中的input()函数默认输入的是字符串,而且可以包含空格,如果要在一行中输入两个数,则应该讲其分离开,可以用list=str.split(“ ”)将他们分开组成列表,也可以用map()函数进行迭代。

法二:C++

这种方法就比较麻烦

易错和注意事项
1.由于 A 是不超过 1000 位的正整数,所以不能用int,long long,因为长度都不够
2.由于不知道数字的长度,所以用string长度可以动态分配
3.当只有一位时,应该直接输出第一位的商,但是如果有多位时,应该省略第一位的零,
4.例如3/7的值为0 3;但是12/7 为1 5,而不是01 5,所以当为多位时应不输出第一位的

C++代码如下:

#include<iostream>
#include<string>
using namespace std;
int main()
{
    string a;    //由于不知道数字的长度,所以用string长度可以动态分配
    int b;
    int q,r=0;
    cin>>a>>b;
    if(a.length()==1)  
     //当只有一位时,应该直接输出第一位的商,但是如果有好多位时,应该省略第一位的零,
    	{	
            q=(a[0]-'0'+r*10)/b;
    		r=(a[0]-'0'+r*10)%b;
    		printf("%d",q);
		}
	else
    {
		q=(a[0]-'0'+r*10)/b;
   		r=(a[0]-'0'+r*10)%b;
    	if(q!=0)
   			printf("%d",q);
    	for(int i=1;i<a.length();i++)
    	{ 
       		q=(a[i]-'0'+r*10)/b;
        	r=(a[i]-'0'+r*10)%b;
        	printf("%d",q);
    	}
	}  
 
    printf(" %d\n",r);

    return 0;  
}

纯C版本:

#include<stdio.h>
#include<string.h>
int main()
{
	char a[1002]={0};
	int b;
	scanf("%s",a);
	scanf("%d",&b);
	int len=strlen(a),h=a[0]-'0',q=0;//初始化len为A的位数,h为A的首位,q为0,因为对于第一位来说没有进位 
	if(len==1)//如果A只有一位
	{
		printf("%d %d\n",h/b,h%b);	
		return 0;//main函数return 0;程序直接结束 
	}
	if(h/b==0)//A有多位并且首位比B小 
		q=h;
	else//A有多位并且首位比B大 
	{
		printf("%d",h/b);
		q=h%b;
	}
	int i=1;
	while(a[i]!=0)//字符数组结束标志为ASCII码值0
	{
		h=a[i++]-'0';
		printf("%d",(q*10+h)/b);
		q=(q*10+h)%b;
	}
	printf(" %d\n",q);	//注意%d前面有空格
	return 0; 
}

原网站

版权声明
本文为[哆啦k梦0219]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_53986026/article/details/125733005