zoukankan      html  css  js  c++  java
  • vj1010:高精乘+细心模拟

    这题的话思路挺简单的,主要是打一个高精乘,然后考虑一些细节的东西

    码得挺少时间的,但是调错调了很久...

    讲一下思路吧:

    就是读入的时候,先把小数点去掉,mark一下小数点的位置

    去掉小数点之后也就进行高精乘法即可,去掉前导零

    之后计算一下小数点的位置

    再去掉小数点后多余的零

    以及特判k=1的情况,直接输出答案

    细节的地方主要就是在模拟上吧,

    我WA了几次:

    1.当小数点后面没有数字的时候,当然不需要输出小数点...这个没有考虑进去

    2.没有特判k=1的情况,因为答案是放在c数组里,所以当k=1的时候,没有答案

    3.数组开小了....

    附上代码:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    char s[201];
    int n,m;
    int l,mark;
    bool f;
    int a[100050],b[101],c[100001];
    void into(){
    	l=strlen(s);
    	int i=1;
    	f=true;
    	while(i<=l){
    		if(s[i]=='.' && f){
    		    mark=i;	
    		    f=false;
    		} 
    		else{
    			a[i]=s[l-i]-'0';
    			i++;
    	    }
    	}
    	mark=l-mark;
    	l=i-1;
    	for(int j=mark;j<l;j++) a[j]=a[j+1];
    	for(int j=1;j<=l;j++){
    		b[j]=a[j];
    	}
    }
    int main(){
    	freopen("input.txt","r",stdin);freopen("output.txt","w",stdout);
    	//freopen("data.txt","r",stdin);
    	while(cin>>s>>n){
    		if(n==1){
    			cout<<s<<"
    ";
    			continue;
    		}
    		memset(a,0,sizeof(a));
    		memset(b,0,sizeof(b));
    		memset(c,0,sizeof(c));
    		mark=0;
    		into();
    		l-=1;
    		int bl=l;
    		int sum=mark-1;
    		for(int k=2;k<=n;k++){
    			memset(c,0,sizeof(c));
    			for(int i=1;i<=l;i++)
    			   for(int j=1;j<=bl;j++){
    			   	 c[i+j-1]+=(a[i]*b[j]);
    			   	 c[i+j]+=(c[i+j-1]/10);
    			   	 c[i+j-1]%=10;
    			   }
    			l+=bl;
    			l++;
    			mark=sum*k;
    			while(l>1 && !c[l] && l>mark) l--;
    			for(int i=1;i<=l;i++) a[i]=c[i];
    		}
            for(int i=l;i>mark;i--){
            	printf("%d",c[i]);
            }
            int t=1;
            for(int i=1;i<=mark;i++){
            	if(c[i]==0){
            		t++;
            	}
            	else break;
            }
            if(t-1==mark){
            	cout<<"
    ";
            	continue;
            }
            else{
               cout<<".";
               for(int i=mark;i>=t;i--){
            	  printf("%d",c[i]);
               }
               cout<<"
    ";
    		}
            
    	}
    	fclose(stdin);
    	fclose(stdout);
    	return 0;
    }
    
  • 相关阅读:
    C++学习基础十六-- 函数学习笔记
    OpenGL ES平移矩阵和旋转矩阵的左乘与右乘效果
    C++学习基础十五--sizeof的常见使用
    C++学习基础十四——基础类型vector
    XDGE_DefalutLit 物理渲染总结-01
    XDGEUnity XDGEPipeLine
    XDGE Render-启程
    一次BSSDF引发的惨案----搬家狂删除
    XDGE_RayMarchine 1- 利用Frag Shader绘制图形
    XDGE_AccelerationAlgorithms 01
  • 原文地址:https://www.cnblogs.com/polebug/p/4034619.html
Copyright © 2011-2022 走看看