天天看點

計算日期到天數轉換,幸運的袋子

問答題

問答題1:對兩個字元a和b進行初始化:char a[]=“ABCDEF”;char b[]={‘A’,‘B’,‘C’,‘D’,‘E’,‘F’};哪個數組長度長?

提示:計算數組的長度是

sizeof(a)/sizeof(a[0])

得出的,長度表示的是數組容納元素的個數,對于a後面還有一個

\0

注意:如果用strlen函數計算兩個數組,第一個輸出6,第二個是未定義錯誤,輸出的數值是未知的,因為該函數結尾的時候,隻認識

\0

問答題2: C++中關于堆和棧的說法,哪個是錯誤的?

(A) 堆的大小僅受作業系統的限制,棧的大小一般一般較小

(B) 在堆上頻繁的調用new/delete容易産生記憶體碎片,棧沒有這個問題

(C) 堆和棧都可以靜态配置設定

(D) 堆和棧都可以動态配置設定

提示:靜态配置設定是指在編譯階段就能确定大小,由編譯器進行配置設定,堆不可以進行靜态配置設定,堆的申請都是在執行過程中進行的;棧也可以動态的配置設定記憶體,例 alloc 函數進行申請棧記憶體

答案:D

問答題3:下列代碼輸出啥?

static int a = 1;
void fun1(void) { 
	a = 2; 
}
void fun2(void) { 
	int a = 3; 
}
void fun3(void) { 
	static int a = 4; 
}
int main(int argc, char** args) {
	printf("%d", a);
	fun1();
	printf("%d", a);
	fun2();
	printf("%d",a);
	fun3();
	printf("%d", a);

	return 0;
}
           

提示:fun2 和 fun3 都是在函數内部的定義的變量,是以他們的作用域隻限于函數内部,不會影響到全局變量 a 的值,fun2 和 fun3的差別就是 fun2中的 a 值在函數結束後就釋放了,但是fun3中的a值不會随着fun3函數釋放而釋放,一直等到整個函數聲明周期結束才釋放.fun1函數是對靜态全局變量 a 進行了修改

答案:1 2 2 2

問答題4:假定

CSomething

是一個類,執行下面這些語句之後,記憶體裡建立了幾個

CSomething

對象?

CSomething a();
CSomething b(2);
CSomething c[3];
CSomething &ra = b;
CSomething d=b;
CSomething *pA = c;
CSomething *p = new CSomething(4);
           

第一行 沒有建立對象,是聲明一個函數;

第二行 建立一個b對象,調用有參數的構造函數

第三行 建立三個對象

第四行 定義一個 ra 引用 b對象

第五行 調用拷貝構造函數,構造 d 對象,拷貝 b 對象

第六行 定義一個指針,指向 c 對象

第七行 在堆上建立一個對象

答案:一共建立6個對象

問答題5:下面這段代碼會列印出什麼?

class A{
public:
	A(){
		printf("A ");
	}
	~A(){
		printf("deA ");
	}
};
class B{
public:
	B(){
		printf("B ");
	}
	~B(){
		printf("deB ");
	}
};
class C : public A, public B{
public:
	C(){
		printf("C ");
	}
	~C(){
		printf("deC ");
	}
};
int main(){
	A *a = new C();
	delete a;
	return 0;
}
           

提示:在構造C類對象的時候,會首先調用基類的構造函數,然後才會調用派生類的構造函數,在釋放對象的時候,由于基類的析構函數并沒有被定義為虛函數,是以編譯器不會調用子類的析構函數,隻調用了基類的析構函數,這樣一來,很有可能造成記憶體洩漏問題

答案:A B C deA

程式設計題

程式設計題1:計算日期到天數轉換

根據輸入的日期,計算是這一年的第幾天?

較長的描述:輸入某年某月某日,判斷這一天是這一年的第幾天?

輸入描述:輸入三行,分别是年,月,日

輸出描述:成功:傳回outDay輸出計算後的第幾天;失敗:傳回 -1

輸入:2012 12 31

輸出:366

#include <iostream>
using namespace std;

int main(){
	int yy, mm, dd;	
    while(cin >> yy,cin >> mm,cin >> dd){
        int array[12] = {0, 31,59,90,120,151,181,212,243,273,304,334 };
        int days = 0;
        days = array[mm - 1];
        days += dd;
        // 閏年影響了包括3月之後的月份
        if (mm > 2) {
            if ((yy % 100 != 0 && yy % 4 == 0) || yy % 400 == 0) {
                days += 1;
            }
        }
        cout << days << endl;
    }
	return 0;
}
           

幸運的袋子

一個袋子裡面有 n 個球,每個球上面都有一個号碼(擁有相同号碼的球是無差別的),如果一個袋子是幸運的當且僅當所有球的号碼的和大于所有球的号碼的積

例如:如果袋子裡面的球的号碼是{1, 1, 2, 3},這個袋子就是幸運的,因為

1 + 1 + 2 + 3 > 1 * 1 * 2 * 3

你可以适當從袋子裡移除一些球(可以移除0個,但是别移除完),要使移除後的袋子是幸運的。現在讓你程式設計計算一下你可以獲得的多少種不同的幸運的袋子

輸入描述:第一行輸入一個正整數n,代表袋子中球的個數,第二行為 n 個數正整數 xi 表示袋子中的球編号

輸出描述:輸出可以産生的幸運的袋子數

例:輸入

3

1 1 1

輸出:2

提示 求符合條件的子集個數

#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <vector>
using namespace std;
/*
getLuckyPacket:從目前位置開始搜尋符合要求的組合,一直搜尋到最後一個位置結束
x: 袋子中的所有球
n: 球的總數
pos: 目前搜尋的位置
sum: 到目前位置的累加和
multi: 到目前位置的累積值
*/
int getLuckyPacket(vector<int>&x, int n, int pos, int sum, int multi){
	int count = 0;
	//循環,搜尋以位置i開始所有可能的組合
	for (int i = pos; i < n; i++){
		sum += x[i];
		multi *= x[i];
		if (sum > multi){
			// 找到符合要求的組合,加 1 ,繼續累加後續的值,看是否有符合要求的集合
			count += 1 + getLuckyPacket(x, n, i + 1, sum, multi);
		}
		else if (x[i] == 1){
			// 如何不符合要求,且目前元素值為 1 ,則繼續向後搜尋
			count += getLuckyPacket(x, n, i + 1, sum, multi);
		}
		else{
			// 如何 sum 大于 multi, 則後面就沒有符合要求的組合了
			break;
		}
		// 要搜尋下一個位置之前,首先恢複 sum 和 multi
		sum -= x[i];
		multi /= x[i];
		// 數字相同的球,沒有什麼差別,都隻能算一個組合,是以直接跳過
		while (i < n - 1 && x[i] == x[i + 1]){
			i++;
		}
	}
	return count;
}
int main(){
	int n;
	while (cin >> n){
		vector<int>x(n);
		for (int i = 0; i < n; i++){
			cin >> x[i];
		}
		sort(x.begin(), x.end());
		// 從第一個位置開始搜尋
		cout << getLuckyPacket(x, n, 0, 0, 1) << endl;
	}

	system("pasue");
	return 0;
}
           

繼續閱讀