1017.A除以B(C语言)
一、题目要求:
计算 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
四、解题思路:
本题应考虑两个问题:
1、A是不超过1000位的正整数,已经超过整数的范围(-2147483648~2147483647),不能够简单的定义A为整型变量。
2、有可能出现A小于等于B的情况,但是B是1位正整数,所以在这种情况下A只可能是1~9且长度为1。
解决方法:
1、当数字很大超出数值范围时,我们可以使用数组来存储。本题就是将输入的数字当成是字符串,用数组来存储它,然后用手算除法的思想来进行除法运算。要注意:数字字符转换为数字:char-‘0’;如果被除数不够除(即商等于0)的话,则应该移到下一位(tamp=余数(reg)*10+下一位)
2 、被除数首位若不够除(即商等于0)的话,不必输出,但若0出现在非首位,则正常输出。
五、解题代码
#include<stdio.h>
#include <string.h>
int main (){
char a[1000];
int num;
int i=0;
int tamp=0,reg=0;
scanf("%s",a);
scanf("%d",&num);
if(strlen(a)==1){//A长度为1
tamp=(a[0]-'0');
printf("%d",tamp/num);
printf(" %d",tamp%num);
}
else{//A长度大于1
for(i=0;i<strlen(a);i++){
tamp=reg*10+(a[i]-'0');
if(i!=0||tamp/num!=0){
printf("%d",tamp/num);
}
reg=tamp%num;
}
printf(" %d",reg);
}
return 0;
}