本题要求计算 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
分析
因为被除数是不超过1000位的正整数,超出了int范围,所以要用数组来储存这个数字。具体思路是靠除法的竖式计算。
问题
测试点2过不去,经过查询才知道是因为当被除数比除数小的时候输出的数字不正确。所以还要列出一个当被除数比除数小的情况。
代码分析
int main()
{
char a1[1001];
int a[1001]={0},b[1001];
int i=0,j=0,k=0;
int count=0;
char temp;
int c;
do
{
scanf("%c",&a1[i]);
a[i]=a1[i]-48;//因为输入的是字符型,把他们都转化成对应的整型数据
i=i+1;
}while(a1[i-1]!=' ');
scanf("%d",&c);
for(j=0,k=0;j<i-1;j++,k++)//竖式计算思路
{
a[j]=count*10+a[j];//下一位是上一位的余数乘以10再加上这一位
if(a[j]==0)
{
b[k]=0;
continue;
}//如果这个位上数字是0,当然这个位不是首位,那么就给这个位上的商记为0
if(a[j]/c==0)
{
if(k!=0)
{
b[k]=0;
k=k+1;
}
if(i==2)
{
b[k]=a[j]/c;
count=a[j]%c;
continue;
}
b[k]=(a[j]*10+a[j+1])/c;
count=(a[j]*10+a[j+1])%c;
j=j+1;
}//如果这个位上不能除,就向下一位借,当然这个位要记0,下一个位数记商
else
{
b[k]=a[j]/c;
count=a[j]%c;
}//如果这个位上可以除,就正常除,记商,记余数
}
for(i=0;i<k;i++)
{
printf("%d",b[i]);
}
printf(" %d",count);
return 0;
}