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<<"\n";
			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<<"\n";
        	continue;
        }
        else{
           cout<<".";
           for(int i=mark;i>=t;i--){
        	  printf("%d",c[i]);
           }
           cout<<"\n";
		}

	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}
时间: 2024-10-06 09:11:40

vj1010:高精乘+细心模拟的相关文章

【日常学习】【区间DP+高精】codevs1166 矩阵取数游戏题解

题目来自NOIP2007TG3 如果在考场上我现在已经歇菜了吧 今天一整天的时间全部投在这道题上,收获不小. 先上题目 题目描述 Description [问题描述] 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m 的矩阵,矩阵中的每个元素aij均 为非负整数.游戏规则如下: 1. 每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. 每次取走的各个元素只能是该元素所在行的行首或行尾: 3. 每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分= 被取走的元素

Day3:T1数论+高精 T2搜索

T1:数论+高精(水~) 根据题意可知,从除的数越大越好(在0~9中) 所以我们只要用到高精除然后再模拟一下就可以了 //MARK:但是要注意0-9这个特殊值需要特判,因为题目要求输出的数至少是两位数,所以0-9的数输出的时候应该在前面加上1.如果1的时候应该输出11,而不是1: T2:宽搜+深搜 典型的搜索题 (挖坑...明天补..睡觉去了)

高精总结(未完结)

高精度是一种计算方式,如果数据过大,会爆掉longlong,就需要用数组来模拟每一位,进行加减乘除,模拟进退位. 用高精时,要将个位赋值在数组第一个,输出时反向输出,不要弄反,不然会紊乱: 高精加 多考虑进位,这是重点: #include<iostream> #include<cstring> using namespace std; int x=0,a1[241],a2[241],b[241],o; string s1,s2; void ax() { cin>>s1&

[BZOJ 2729][HNOI2012]排队(排列组合+高精)

Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不同的) Solution 好像必须写压位高精的QAQ 先排n名男生,插空,讨论两名老师插在两个不同的空里的情况和先排在一起再在中间插一名女生的情况 #include<iostream> #include<cstdio> #include<cstring> #include&

BZOJ_1002_[FJOI2007]_轮状病毒(递推+高精)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1002 )*&*(^&*^&*^**()*) 分析 题目是求一种特殊的图的生成树的个数,但是貌似有更一般的算法,等明天再看吧... 只搞懂了打表找规律,然后题推的解法. 随便写个暴力打个表(其实我并不会写,明天再写吧今天好累),找一找规律. 1~14的答案如下 1 5 16 45 121 320 841 2205 5776 15125 39601 103680 271441 71

高精-----各种模板

高精加法 代码 #include<string> #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> using namespace std; char a[501],b[501]; int x[501],y[501],z[50000]; int main() { cin>>a; cin>

模板——高精系列

存放一下高精的模板 高精加: #include<iostream> #include<cstdlib> #include<cstdio> #include<cstring> using namespace std; int a[1001],b[1001],c[1001],lena,lenb; char a1[1001],b1[1001]; int main(){ gets(a1); gets(b1); lena=strlen(a1); lenb=strlen

c++普通高精加

//作为一名蒟蒻,还请诸位不要吐槽. //第一次打c++高精加,内心有点小激动. //为codevs3116 高精度练习之加法 //程序太简单,就不打注释了. #include<cstdio>#include<cstring>int main(){char s1[600],s2[600];int a1[600],a2[600],a3[600]={0},len1,len2,i;scanf("%s",s1);scanf("%s",s2);len1

高精阶乘

求n!.当n很大的时候,会超出整数的范围. 这里用数组来进行高精阶乘.a[1]是个位,a[2]是十位......依次类推.每次要乘一个数的时候,就从个位(即a[1])开始乘这个数,>10的时候要%10再进位. 1 #include<cstdio> 2 #include<cstring> 3 const int N=100000; 4 5 int a[N]; 6 int i, j, n; 7 int t, pos/*位数*/, carry/*进位*/; 8 9 int main