PAT Basic 1017
本题代码可以参考这里。
原题: 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
题目分析
把草稿纸上的除法算法抽象成为程序语言。
-
输入
输入的A和B作为字符串处理。
unsigned char us_a[1001]; //用unsigned 避免溢出 int b=0; scanf("%s %d", us_a, &b);
-
取余
// 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'; //字符数组结束标志
-
输出
商的位数小于等于被除数的位数。本题算法可能导致
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)