A1023 Have Fun with Numbers (20分)(大整数四则运算)

一、技术总结

  1. 关于大整数四则运算一个是结构体的定义,里面除了数组和长度,还应该带有构造函数,进行初始化;
  2. 还有就是change函数的编写,主要是用来将读入字符串进行转化成结构体,函数中注意点,一个是得定义一个结构体,然后就是将读入的字符串逆序的存入结构体中,方便后续的四则运算;
  3. add加法函数的关键点,有carry进位变量即可,取余保存当前位,除数保存为进位,如果最后进位不为0,说明应该加一位;
  4. multi乘法函数的关键点,注意传参一个bign型,一个是整型int,也是定义一个结构体,然后也需要一个carry进位变量,这里是从bign的低位开始乘以传入的整型,然后取余保存当前位,进位为整除,但是最后和add不一样的是,使用while,进行将进位carry一次保存到结构体中。
  5. sub减法函数的关键点,因为要考虑a的当前位可能比b的当前位要小,因此需要将a当前位向高一位借1,然后高位减减,当前位加10,再进行减法运算;还有可能出现高位很多个0的情况,因此要使用while循环将高位的0去掉,但是要至少保留一位;
  6. divide除法函数的关键点,需要多传一个引用参数r,用于保存余数,同时因为被除数的每一位于商的长度是一样的所以,先让结构体c的长度与a被除数相同;从高位开始,每次和上一位的余数组合,如果不够除当前位直接商0,否则直接进行整除取商,然后再取余为新余数,也会和减法面临的情况时,高位可能会有很多0,也是至少保留一位即可。

二、参考代码

#include<iostream>
#include<cstring>
using namespace std;
struct bign{
	int d[1000];
	int len;
	bign(){
		memset(d, 0, sizeof(d));
		len = 0;
	}
};
bign change(char str[]){
	bign a;
	a.len = strlen(str);
	for(int i = 0; i < a.len; i++){
		a.d[i] = str[a.len - i - 1] - '0';
	}
	return a;
}
bign add(bign a, bign b){
	bign c;
	int carry = 0;
	for(int i = 0; i < a.len || i < b.len; i++){
		int temp = a.d[i] + b.d[i] + carry;
		c.d[c.len++] = temp % 10;
		carry = temp / 10;
	}
	if(carry != 0){
		c.d[c.len++] = carry;
	}
	return c;
}
bign multi(bign a, int b){
	bign c;
	int carry;
	for(int i = 0; i < a.len; i++){
		int temp = a.d[i] * b + carry;
		c.d[c.len++] = temp % 10;
		carry = temp / 10;
	}
	while(carry != 0){
		c.d[c.len++] = carry % 10;
		carry /= 10;
	}
	return c;
}
int main(){
	char str[1000];
	scanf("%s", str);
	int num1[10] = {0}, num2[10] = {0};
	bign c = add(change(str), change(str));
	for(int i = 0; i < strlen(str); i++){
		num1[str[i] - '0']++;
		num2[c.d[i]]++;
	}
	int flag = 1;
	for(int i = 0; i < 10; i++){
		if(num1[i] != num2[i]){
			flag = 0;
			break;
		}
	}
	if(flag == 1) printf("Yes\n");
	else printf("No\n");
	for(int i = c.len - 1; i >= 0; i--){
		printf("%d", c.d[i]);
	}
	return 0;
} 
posted @ 2020-07-01 20:53  睿晞  阅读(125)  评论(0编辑  收藏  举报