标签:重载 直接 class 其他 模拟 += 补充 就是 ret
模拟考试的题:
Fibonacci数列指的是数列第一项和第二项为1,之后每一项是之前两项的和所构成的数列。 现有多组数据,每组数据给出一个数字n,请你输出Fibonacci数列的前n-1项。
#include <iostream> #include <iterator> using namespace std; template<class T1, class T2> void Copy(T1 s, T1 e, T2 x) { for(; s != e; ++s, ++x) *x = *s; }
// 在此处补充你的代码
int main() { while(true) { int n; cin >> n; if(n == 0) break; Fib f1(1), f2(n); ostream_iterator<int> it(cout, " "); Copy(f1, f2, it); cout << endl; } return 0; }
3 0
1 1
1 #include <iostream> 2 #include <iterator> 3 using namespace std; 4 5 template<class T1, class T2> 6 void Copy(T1 s, T1 e, T2 x) { 7 for(; s != e; ++s, ++x) 8 *x = *s; 9 } 10 // 在此处补充你的代码 11 class Fib{ 12 int number; 13 public: 14 Fib(int n_):number(n_){} 15 bool operator!=(Fib b){ 16 return number!=b.number; 17 } 18 void operator++(){ 19 number++; 20 } 21 int operator*(){ 22 int f[10000], i; 23 for(i = 0; i <= number; i++) f[i] = 0; 24 f[1] = 1; f[2]=1; 25 for(i = 3; i <= number; i++) 26 f[i] = f[i-2]+f[i-1]; 27 return f[number]; 28 } 29 }; 30 int main() { 31 while(true) { 32 int n; 33 cin >> n; 34 if(n == 0) 35 break; 36 37 Fib f1(1), f2(n); 38 ostream_iterator<int> it(cout, " "); 39 Copy(f1, f2, it); 40 cout << endl; 41 } 42 return 0; 43 }
备注:这道题的关键就是思路要开阔,当时没想明白怎么能做到让f(1)输出第n个数,答案就在于重载++和*号!最妙的是用*的重载来实现计算!
输入整数a b i j,把b从第i到j位(包括i,j)的二进制位全部取反,并填入a的i到j位中,a的其他位不变。输出a。 最右边一位是第0位。
6123 3344 2 9
5871
#include <iostream> #include <iterator> using namespace std; //1111111 1000111 int main() { int a, b, i, j; cin>>a>>b>>i>>j; int block = (1<<(j+1))-(1<<i); //制造了一个001111100000的块 a &= ~block; //把a的第i到j为置为0 b&=block; a |= b^block; //或者写 //a|=(~b)█ cout<<a; return 0; }
备注:位运算好巧妙好难orz 这道题的关键是用了减法制造了一个从i到j为1,其它位为0的“块”,十分巧妙。
输入一系列正整数, 计算它们的平均值,结果去尾取整数
#include <iostream> #include <vector> #include <algorithm> #include <iterator> using namespace std; class CMean {
// 在此处补充你的代码
}; int main(int argc, char* argv[]) { int v; int t; cin >> t; while ( t -- ) { cin >> v; vector<int> vec; while (v) { vec.push_back(v); cin >> v; } int myAver = 0; for_each(vec.begin(), vec.end(), CMean(myAver)); cout << myAver << endl; } return 0; }
1 17 4 8 18 0
11
1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 #include <iterator> 5 using namespace std; 6 /* 7 Function for_each(InputIterator beg, InputIterator end, Function f) { 8 while(beg != end) 9 f(*beg++); 10 } 11 */ 12 class CMean { 13 // 在此处补充你的代码 14 public: 15 int totaln = 0; 16 int total = 0; 17 int *ans; 18 CMean(int & num){ 19 ans = # 20 } 21 void operator()(int a){ 22 totaln++; 23 total += a; 24 *ans = total/totaln; 25 } 26 }; 27 28 int main(int argc, char* argv[]) { 29 int v; 30 int t; 31 cin >> t; 32 while ( t -- ) { 33 cin >> v; 34 vector<int> vec; 35 while (v) { 36 vec.push_back(v); 37 cin >> v; 38 } 39 int myAver = 0; 40 for_each(vec.begin(), vec.end(), CMean(myAver)); //CMean(myAver)整体相当于一个函数指针 41 cout << myAver << endl; 42 } 43 return 0; 44 }
备注:不知道怎么说,首先要明白for_each的第三个参数是一个函数指针,所以CMean(myAver)是一个函数对象。反正就,类里面设了个指针从而可以直接修改myAver,要不然也没法改是吧。
标签:重载 直接 class 其他 模拟 += 补充 就是 ret
原文地址:https://www.cnblogs.com/fangziyuan/p/12892178.html