1. 程式人生 > >2017.12.17

2017.12.17

同時 post 從大到小 print racket 直接 for style atof

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