1017 A除以B——C/C++实现

版权声明:本文为博主原创文章,转载请务必注明出处和作者,谢谢合作! https://blog.csdn.net/zhanshen112/article/details/84351348

题目

1017 A除以B (20 分)

本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数。你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立。

输入格式:

输入在一行中依次给出 A 和 B,中间以 1 空格分隔。

输出格式:

在一行中依次输出 Q 和 R,中间以 1 空格分隔。

输入样例:

123456789050987654321 7

输出样例:

17636684150141093474 3

算法

这道题属于模拟计算和运动的题目。这里显然模拟的是大数的除法。只要按照我们计算思考的习惯,这类题应该没有太大问题。

代码1是常用的思路:现将输入大数的第一个数取出来,作除法后输出,后面如果不能除尽,则将余数*10+下一位,否则输出。这类题目的特殊情况一般要单独做测试。

代码2是代码1的C++版,并没有本质区别。

代码3是直接从第一位(0开始计数)计算,如果s.length()==1,直接输出,剩下的都是两位数或者多位数的形式。如果是多位数的第一位数字与b相除后为0,则也不输出;其他情况都要输出。

代码4是代码3的升级版,将代码整理一下,有相同输出接口的拎在一起,会简化代码,也是可以的。

代码

代码1、C

//PAT1017V1
#include <stdio.h>
#include <string.h>
#define MAXN 1001
 
int main(void) {
	char str[MAXN];    //A有1000位之多,只能转化成字符串。
	int B, Q, R, len, i;
	
	scanf("%s%d", str, &B);
	len = strlen(str);    //获取输入的一串数字的长度。
	Q = ( str[0] - '0' ) / B;    //获取第一个数的商。
    /*长度只有1位 或 第一个数比被除数大,要先输出第一个数的商*/
	if ( len == 1 || (len > 1 && Q != 0) )	printf("%d", Q);
	R = ( str[0] - '0' ) % B;    //获取第一个数的余数。
    /*从第二个数开始到整个字符串结束,模拟手动除法*/
	for ( i = 1; i < len; i++ ) {
		Q = ( (R * 10) + str[i] - '0' ) / B;    //获取商是 (余数*10 + 下一个数) / B.
		printf("%d", Q);    //每获取一个商就输出一次。
		R = ( (R * 10) + str[i] - '0' ) % B;    //获取余数是 (余数*10 + 下一个数) % B. 
	}
	printf(" %d", R);    //输出最后的余数。
	
	return 0;
}

代码2、C++

//1017 
#include <iostream>
#include <string>
using namespace std; 

int main(){
	string s;
	int b,tmp=0,t=0;
	cin>>s>>b;
	t=(s[0]-'0')/b;
	if((t!=0&&s.length() >1)||s.length() ==1)	cout<<t;
	tmp=(s[0]-'0')%b;
	for(int i=1;i<s.length() ;i++){
		t=(tmp*10+s[i]-'0')/b;
		cout<<t;
		tmp=(tmp*10+s[i]-'0')%b;
	}
	cout<<" "<<tmp;
	return 0;
}

代码3、通盘考虑

//1017 
#include <iostream>
#include <string>
using namespace std; 

int main(){
	string s;
	int b,tmp=0,t=0;
	cin>>s>>b;

	for(int i=0;i<s.length() ;i++){
		t=(tmp*10+s[i]-'0')/b;
		if(s.length() ==1){
			cout<<t;
		}
		else if(s.length() >1&&i==0&&t==0);
		else cout<<t;
		tmp=(tmp*10+s[i]-'0')%b;
	}
	cout<<" "<<tmp;
	return 0;
}

代码4、代码3的优化

//1017 
#include <iostream>
#include <string>
using namespace std; 

int main(){
	string s;
	int b,tmp=0,t=0;
	cin>>s>>b;
	for(int i=0;i<s.length() ;i++){
		t=(tmp*10+s[i]-'0')/b;
		if(s.length() >1&&i==0&&t==0);
		else cout<<t;
		tmp=(tmp*10+s[i]-'0')%b;
	}
	cout<<" "<<tmp;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/zhanshen112/article/details/84351348