本题代码可以参考这里


原题: 1017. A除以B (20)

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

输入格式

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

输出格式

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

输入样例

123456789050987654321 7

输出样例

17636684150141093474 3

注意

时间限制: 100 ms
内存限制: 65536 kB
代码长度限制: 8000 B
判题程序: Standard
作者: CHEN, Yue



题目分析

把草稿纸上的除法算法抽象成为程序语言。

  1. 输入

    输入的A和B作为字符串处理。

    unsigned char us_a[1001];			//用unsigned 避免溢出
    int b=0;
    
    scanf("%s %d", us_a, &b);
    
  2. 取余

    // int a=0, b=0, q=0, r=0, i=0, j=0;//注意初始化为零
    while( us_a[i]!='\0' ){
        a = us_a[i++] - '0' + r*10;		//r是被除数的高位余数
        q = a / b;						//a是被除数,b是除数,q是商
        r = a % b;						//r是余数
        ans_q[j++] = q + '0';			//在数组中保存商
    }
    ans_q[j] = '\0';					//字符数组结束标志
    
  3. 输出

    商的位数小于等于被除数的位数。本题算法可能导致ans_q的最高位为0,因此需要对其进行判断与处理,以符合输出要求。

    if( j==1 || ans_q[0]!='0' ){		//被除数与商,位数相同
        printf("%s %d", ans_q, r);
    }else{
        printf("%s %d", &ans_q[1], r);	//位数不同,从下标1开始打印
    }
    

    可以根据下面的测试用例,观察对比直接打印的区别

    printf("\n%s %d\n", ans_q, r);
    

部分测试用例

  • test1

    输入
    123456789050987654321 7
    
    输出
    17636684150141093474 3
    
  • test2

    输入
    20 2
    
    输出
    10 0
    
  • test3

    输入
    25 2
    
    输出
    12 1
    
  • test3

    输入
    13 6
    
    输出	
    2 1
    

其他参考

  • cpp对于string s,也可以用cout«&s[1],从第二个元素开始输出。需要的是地址,把s当作指针。


(END)