当前位置:网站首页>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;
}边栏推荐
猜你喜欢

mysql数据库实验实训5,数据查询yggl数据库查询(详细)

无重复字符的最长字串

小程序editor富文本编辑使用及rich-text解析富文本

决策树原理和案例应用-泰坦尼克号生存预测

【LeetCode——编程能力入门第一天】基本数据类型[在区间范围内统计奇数数目/去掉最低工资和最高工资后的工资平均值)

POC——DVWA‘s SQL Injection

Email (including attachments, Netease, QQ)

【C语言—零基础第六课】输入输出语句格式与复合语句

Cve-2022-23131 ZABBIX SAML SSO authentication bypass vulnerability

uniapp 使用uview实现折叠面板
随机推荐
Encryption and decryption
C语言练习题
【2022第十届‘泰迪杯’挑战赛】A题:害虫识别完整版(大致思路。详细过程和代码以及结果csv在压缩包中)
数据库实训7【索引与数据完整性约束的创建】
Message converter (JSON)
基于cuda10.0的pytorch深度学习环境配置
【C语言—零基础第十课】数组王国奇遇记
硬核结构体,暴力解读
PyGame installation -requirement already satisfied
【LeetCode——编程能力入门第二天】运算符(位1的个数/整数的各位积和之差)
【C语言—零基础_学习_复习_第四课】数据类型及其运算
mysql数据库实验实训5,数据查询yggl数据库查询(详细)
uniapp 使用uview实现折叠面板
游玩数据获取与数据分析、数据挖掘 【2022.5.30】
Pygame:外星人入侵
Desensitization field example
学习C语言第7天
Es6 真实案例解构(多维数组对象)全新案例:
简单快速建立pytorch环境YOLOv5目标检测 模型跑起来(超简单)
STL容器——queue与deque的基本操作