当前位置: 代码迷 >> 综合 >> PAT (Basic Level) Practice (中文) 1017 AC答案+解析+测试样例
  详细解决方案

PAT (Basic Level) Practice (中文) 1017 AC答案+解析+测试样例

热度:26   发布时间:2023-11-26 22:16:28.0

1017 A除以B (20分)

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

输入格式:

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

输出格式:

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

输入样例:

123456789050987654321 7

输出样例:

17636684150141093474 3

分析,位数太大吗,不能使用整型变量,只能使用字符数组,实现每一位的遍历。
从第一位开始,可以被整除的放在数组 b中,然后下一位。不能整除的和下一位一起计算。
但要再考虑第一位和最后一位的情况。输出余数。

可以使用以下测试样例

测试点1(原测试点)

输入
5 7

7 7
输出
0 5

1 0

测试2(检测遇到 0 的时候是否可以进行)

输入
14010 7

1410 7

输出
2001 3

210 3

#include<stdio.h>
#include<string.h>
int main()
{
    char a[1010],b[1010];int A;scanf("%s %d",a,&A);int n = strlen(a); 		//用于计算除数的每位个数 int j = 0;for(int i = 0;i < n;i++)	//如果只有 1 位数 {
    a[i] = a[i]-'0';}if(n == 1){
    b[0] = a[0]/A;a[0] = a[0]%A;printf("%d %d",b[0],a[0]);return 0;}if(a[0]/A)		//第一位要特殊考虑,下面的情况需要加 0 {
    b[j++] = a[0]/A;a[1] = a[0]%A*10 + a[1];}else{
    a[1] = a[0]*10 + a[1];}for(int i = 1;i < n;i++){
    if(a[i] == 0)		//考虑为 0 时 {
    b[j++] = 0;continue;}if(a[i]/A == 0)		//满足这一位不能被整除 {
    if(i == n-1)	//最后一位特殊考虑 {
    b[j] = a[i]/A;continue;}b[j++] = 0;	a[i+1] = a[i]*10 + a[i+1];}else		//此为可以被整除 {
    if(i == n-1){
    b[j] = a[i]/A;a[i] = a[i]%A;continue;}b[j++] = a[i]/A;a[i+1] = a[i]%A*10 + a[i+1];}}for(int i = 0;i < n;i++)printf("%d",b[i]);printf(" %d",a[n-1]);}
  相关解决方案