P 1017
转跳点:🐏
1017 A除以B
本题要求计算A /B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数。你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立。
输入格式:
输入在一行中依次给出 A 和 B,中间以 1 空格分隔。
输出格式:
在一行中依次输出 Q 和 R,中间以 1 空格分隔。
输入样例:
123456789050987654321 7
输出样例:
17636684150141093474 3
终于升级到大整数操作了,内心一阵阵激动,认真看题就知道输入样例那玩意绝对超过了264了,斗宗强者恐怖至斯。int已经无法驾驭它了,我们需要开挂了。决定就是你了,去吧,字符串!
其实所谓的大数操作就是在模拟人手算的过程,而且这道题是化简后的大数除法。没有小数处理,直接取余数,除数只有一位大大削减了题目难度。只有两个要注意的点:
1.最高位小于除数时,需要对字符串的长度进行判断,如果长度位1则输出,否则跳过
2.记得每次取余和除法之前要加上余数,记得乘上10
唉,要是真的是大整数除法,就有点烧脑了,大家先自己写写,再看代码。(考虑要不要更一波大整数运算……)
代码:
C:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <stdio.h> 2 #include <stdlib.h> 3 #define MAXSIZE 1010 4 5 int main(void) 6 { 7 int Number, Quotient, Remainder; 8 char NumStr[MAXSIZE]; 9 10 scanf("%s%d", NumStr, &Number); 11 12 Quotient = (NumStr[0] - '0') / Number; 13 if ((Quotient != 0 && NumStr[1] != '\0') || '\0' == NumStr[1])//特判第一位小于除数输出0 和 只有一位数的情况 14 { 15 printf("%d", Quotient); 16 } 17 Remainder = (NumStr[0] - '0') % Number; 18 19 //模拟带除法 20 for (int i = 1; '\0' != NumStr[i]; i++) 21 { 22 Quotient = (Remainder * 10 + NumStr[i] - '0') / Number; //取商,每一次需要加上上一位的余数 23 printf("%d", Quotient); //直接输出,懒得存储了 24 Remainder = (Remainder * 10 + NumStr[i] - '0') % Number;//取余,也需要加上上一位的余数 25 } 26 printf(" %d\n", Remainder); 27 return 0; 28 }
Python:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 listt = list(input().split()) 2 print(int(listt[0]) // int(listt[1]), end = ' ') 3 print(int(listt[0]) % int(listt[1]))
PAT不易,诸君共勉!
大道五十,天衍四九,人遁其一!