zoukankan      html  css  js  c++  java
  • 洛谷 P1932 A+B A-B A*B A/B A%B Problem(高精度板子)

    传送门

    解题思路

    板子没啥好讲的。
    就是要注意以下几点:

    • 进位时条件是 (geqslant10) 而不是 (>10)
    • string中的某个位置若没有初始化,会炸,所以要在读入的字符串最后加上0。

    AC代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    const int maxn=20005;
    int ans[maxn],x[maxn],lenx; 
    string s1,s2;
    int len1,len2,len3;
    inline void print(int len){
    	for(int i=len-1;i>=0;i--) printf("%d",ans[i]);
    	printf("
    ");
    }
    bool cmp(){
    	if(len1>len2) return 1;
    	if(len1<len2) return 0;
    	for(int i=len1-1;i>=0;i--){
    		if(s1[i]>s2[i]) return 1;
    		if(s1[i]<s2[i]) return 0;
    	}
    	return 1;
    }
    void jia(){
    	len3=max(len1,len2); 
    	for(int i=0;i<len3;i++){
    		ans[i]=s1[i]-'0'+s2[i]-'0'+ans[i];
    		if(ans[i]>=10){
    			ans[i+1]++;
    			ans[i]-=10;
    			if(i==len3-1){
    				print(len3+1);
    				memset(ans,0,sizeof(ans));
    				return;
    			}
    		}
    	}
    	print(len3);
    	memset(ans,0,sizeof(ans));
    }
    void jian(){
    	int type=0;
    	if(!cmp()){
    		type=1;
    		swap(s1,s2);
    		swap(len1,len2);
    		printf("-");
    	}
    	for(int i=0;i<len1;i++){
    		ans[i]+=s1[i]-s2[i];
    		if(ans[i]<0) ans[i]+=10,ans[i+1]-=1;
    	}
    	for(len3=len1;len3>1;len3--){
    		if(ans[len3-1]!=0) break;
    	}
    	print(len3);
    	if(type==1){
    		swap(s1,s2);
    		swap(len1,len2);
    	}
    	memset(ans,0,sizeof(ans));
    }
    void cheng(){
    	len3=len1+len2;
    	for(int i=0;i<len1;i++){
    		for(int j=0;j<len2;j++){
    			ans[i+j]+=(s1[i]-'0')*(s2[j]-'0');
    		}
    	}
    	for(int i=0;i<=len3;i++){
    		if(ans[i]>=10) ans[i+1]+=ans[i]/10,ans[i]%=10;
    	}
    	for(;len3>1;len3--){
    		if(ans[len3-1]!=0) break;
    	}
    	print(len3);
    	memset(ans,0,sizeof(ans));
    }
    void cheng(int *x){
    	lenx++;
    	for(int i=0;i<=lenx;i++) x[i]*=10;
    	for(int i=0;i<=lenx;i++){
    		if(x[i]>=10) x[i+1]+=x[i]/10,x[i]%=10;
    	}
    	for(;lenx>1;lenx--){
    		if(x[lenx-1]!=0) break;
    	}
    }
    bool dayu(int *x){
    	if(lenx<len2) return 0;
    	if(lenx>len2){
    		for(int i=0;i<lenx;i++) x[i]-=s2[i]-'0';
    		for(int i=0;i<lenx;i++){
    			if(x[i]<0) x[i+1]--,x[i]+=10;
    		}
    		for(;lenx>1;lenx--){
    			if(x[lenx-1]!=0) break;
    		}
    		return 1;
    	}
    	for(int i=lenx-1;i>=0;i--){
    		if(x[i]>s2[i]-'0') break;
    		if(x[i]<s2[i]-'0') return 0; 
    	}
    	for(int i=0;i<lenx;i++) x[i]-=s2[i]-'0';
    	for(int i=0;i<lenx;i++){
    		if(x[i]<0) x[i+1]--,x[i]+=10;
    	}
    	for(;lenx>1;lenx--){
    		if(x[lenx-1]!=0) break;
    	}
    	return 1;
    }
    void chu(){
    	if(!cmp()){
    		printf("0
    ");
    		for(int i=len1-1;i>=0;i--) printf("%c",s1[i]);
    		return;
    	}
    	len3=len1-len2+1;
    	lenx=len2;
    	for(int i=len1-1;i>=len3;i--) x[i-len3]=s1[i]-'0';
    	for(int i=len3-1;i>=0;i--){
    		cheng(x);
    		x[0]=s1[i]-'0';
    		while(dayu(x)){
    			ans[i]++;
    		}
    	}
    	for(;len3>1;len3--){
    		if(ans[len3-1]!=0) break;
    	}
    	print(len3);
    	for(int i=lenx-1;i>=0;i--) printf("%d",x[i]);
    }
    int main(){
    	cin>>s1>>s2;
    	len1=s1.length();
    	len2=s2.length();
    	reverse(s1.begin(),s1.end());
    	reverse(s2.begin(),s2.end());
    	for(int i=len1;i<=maxn;i++) s1+='0';
    	for(int i=len2;i<=maxn;i++) s2+='0'; 
    	jia();
    	jian();
    	cheng();
    	chu();
    	return 0;
    }
    
  • 相关阅读:
    (最短路)2017 计蒜之道 复赛 D. 百度地图导航
    13 树的应用-并查集
    12 二叉树-链式存储-二叉排序树(BST)
    11 二叉树-链式存储-先序遍历、中序遍历、后序遍历和层序遍历的非递归算法实现
    10 二叉树-链式存储-递归遍历
    9 线性表-队列-链式存储
    8 线性表-循环队列-顺序存储
    操作系统-页式虚拟存储器管理系统设计
    杂谈:Windows操作系统的介绍与对Win8操作系统市场反响冷淡原因的分析
    一学期积累下来的SQL语句写法的学习
  • 原文地址:https://www.cnblogs.com/yinyuqin/p/14847701.html
Copyright © 2011-2022 走看看