注意:此次初看像一道大整数的除法题,仔细分析是一道字符串存储输入数据的题。
思路:
1、用字符串存储所谓的输入整数,之后依次从字符串的第一位开始读取数据,每次读取一位,模拟除法的执行过程。
2、除法时,会有临时的被除数,分为临时被除数小于除数和大于除数两种情况。两种情况得到的商和余数不一样,需要分类计算。对于被除数小于除数时,可能此时用户输入的被除数只有一位,直接可以得出结果。
#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
using namespace std;
//法一:边模拟计算,边输出
void divideOne(){
string num;
int b,r,temp; //b为除数,temp为中间的被除数
r = 0; //r余数,必须初始化为0
cin >> num >> b;
int len = num.length();
for(int i=0; i<len; ++i){
temp = r*10 + (num[i] - '0'); //得到当前过程的被除数
if(temp >= b){ //够除
cout << temp/b; //输出商
r = temp%b; //更新余数
}
else { //不够除
if (len==1){ //被除数只有一位
cout << "0";
r = num[i] - '0';
break;
}
if(i>0) //不是第一位,商为0
cout << 0;
r = temp;
}
}
cout << " " << r << endl;
}
//法二:将结果保存到字符串中
void divideTwo(){
char num[10001];
char res[10001] = {0};
int b,r,temp;
int index = 0; //res的下标索引
r = 0;
scanf("%s %d",num,&b);
int len = strlen(num);
for(int i=0; i<len; ++i){
temp = r*10 + (num[i]- 48); //'0'对应的ASCII码是48,字符转化为数字
if(temp>=b){
res[index++] = temp/b + '0'; //数字转为字符
r = temp%b;
}
else{
if(len==1){
res[index++] = '0';
r = num[0] - 48;
break;
}
if (i)
res[index++] = '0';
r = temp;
}
}
printf("%s %d\n",res,r);
}
int main(){
divideOne();
divideTwo();
return 0;
}