zoukankan      html  css  js  c++  java
  • 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
    ");
    	else printf("No
    ");
    	for(int i = c.len - 1; i >= 0; i--){
    		printf("%d", c.d[i]);
    	}
    	return 0;
    } 
    
  • 相关阅读:
    mkdir()和mkdirs() 的区别
    JAVA 多线程学习
    遇到问题(1)
    7.12计划
    Android 中Int类型和String类型的转换
    Android Binder机制学习笔记
    7.11计划,做个没心没肺的人
    RTL行为级仿真、综合后门级功能仿真和时序仿真
    定向锚文本(高级) 站内站策略(高级) 链轮模式(高级) 站群模式(高级)
    优化长尾关键词基础指南
  • 原文地址:https://www.cnblogs.com/tsruixi/p/13221444.html
Copyright © 2011-2022 走看看