码迷,mamicode.com
首页 > 其他好文 > 详细

2017.12.17

时间:2017-12-17 12:15:37      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:def   gpo   情况   表达   辗转相除法   调用函数   比较   ret   switch   

2017.12.03

贪心,分治综合习题(1)

1. 2的幂次方表示

思路:本题很容易就想到用递归做。对于2的一次和二次,可以直接打表输出,而且题中所给的数据不大,N<20000,可以预处理把21到215储存在一个数组里,以后好比较。然后就贪心调用函数,把k每次从大到小比较,用s记数,输出括号,进行下一次递归。需要注意的是,在递归中,2的零次幂和2的一次幂是要单独特殊判断的。

核心代码:

if(k==0){
	printf("0");
	return;
}
else if(k==1)
	return;
while(k){
	for(int i=15;i>=0;i--){
		if(k>=mi2[i]){
			k-=mi2[i];
			s++;
			mo[s]=i;
		}
	}
}
for(int i=1;i<=s;i++){
	if(i!=s){
		if(mo[i]!=1){
			printf("2(");
			mi(mo[i]);
			printf(")+");
		}
		else printf("2+");
	}
	else{
		if(mo[i]!=1){
			printf("2(");
			mi(mo[i]);
			printf(")");
		}
		else printf("2");
	}
}

状态:AC

2. 逆波兰表达式

思路:把整个的前缀表达式分成三个部分:{1.符号 2.这个算式的前半部分 3.这个算式的后半部分}。求出前半部分和后半部分的值,再根据符号做运算。因为前半部分和后半部分不一定只有一个值,可能也是一个算式,所以要使用递归。同时,再在switch中特判一下如果仅仅是一个值的情况。

核心代码:?

char num[500];
scanf("%s",num);
switch(num[0]){
	case‘+‘:
		return bolan()+bolan();
	case‘-‘:
		return bolan()-bolan();
	case‘*‘:
		return bolan()*bolan();
	case‘/‘:
		return bolan()/bolan();
	default:
		return atof(num);
}

状态:AC

3. 求最大公约数问题

思路:求最大公约数可以使用辗转相除法:假设a > b > 0,那么a和b的最大公约数等于b和a%b的最大公约数,然后把b和a%b作为新一轮的输入。由于这个过程会一直递减,直到a%b等于0的时候,b的值就是所要求的最大公约数。

核心代码:

if(a<b){t=a;a=b;b=t;}
	if(a==b)
	printf("%d",a);
	else if(a%b==0)
	printf("%d",b);

//以上为需要注意的一些事项(代码)

int GCD(int i1,int i2){
	if(i1%i2==0)
		return i2;
	else{
		i1=i1%i2;
		if(i1<i2){
			int t;
			t=i1;i1=i2;i2=t;
		}
		return GCD(i1,i2);
	}
}

状态:AC

2017.12.17

标签:def   gpo   情况   表达   辗转相除法   调用函数   比较   ret   switch   

原文地址:http://www.cnblogs.com/yzyl-Leo-wey/p/8051459.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!