当前位置:网站首页>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;
}边栏推荐
猜你喜欢
随机推荐
【C语言—零基础_学习_复习_第五课】基本运算符的运算性质
uniapp 使用uview实现折叠面板
ModelArts第二次培訓筆記
Elment UI usage
About the current response, the method getoutputstream() has been called
学习C语言第二天
获取URL参数的两种方法及location对象的各项获取方式
小程序云开发表单提交并在页面中获取数据
User - registration / login
Flask的使用
Cve-2022-23131 ZABBIX SAML SSO authentication bypass vulnerability
POC——DVWA‘s XSS Reflected
Encryption and decryption
Three high concurrency methods to realize I++
02 Bar _ Recommandation de film (basée sur le contenu) Portrait de l'utilisateur
微信小程序云开发使用方法-1
用户登录-以及创建验短信证码
[2022 10th Teddy Cup Challenge] Title A: complete version of pest identification (general idea. Detailed process and code and results CSV in compressed package)
【C语言_学习_考试_复习第三课】ASCII码与C语言概述
STL容器——map的基本操作








