pat乙级1017(字符串模拟除法计算过程c++)

注意:此次初看像一道大整数的除法题,仔细分析是一道字符串存储输入数据的题。

思路:

  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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值