您的位置:首页 > 编程语言 > C语言/C++

程序设计与算法(一)C语言程序设计CAP 第六周

2018-01-05 22:38 459 查看

1:Pell数列

描述Pell数列a1, a2, a3, ...的定义是这样的,a1 = 1, a2 = 2, ... , an = 2 * an − 1 + an - 2 (n > 2)。给出一个正整数k,要求Pell数列的第k项模上32767是多少。//即取余输入第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数k (1 ≤ k < 1000000)。输出n行,每行输出对应一个输入。输出应是一个非负整数。样例输入
2
1
8
样例输出
1
408
#include <iostream>
#include <cstdio>
using namespace std;
const int M =  1000010;
int a[M];
int main()
{
int n;
cin>>n;
a[1]=1;
a[2]=2;
for( int i=3;i<=M;++i)
a[i]=( 2 * a[i-1] + a[i-2] ) %32767;
int k;
for( int i=0 ;i<n;++i)
{
cin>>k;
cout<< a[k]<<endl;
}
}
注解:本题主要在于对于模上的理解,以及输出语句的考虑。

2:求最大公约数问题

描述给定两个正整数,求它们的最大公约数。输入输入一行,包含两个正整数(<1,000,000,000)。输出输出一个正整数,即这两个正整数的最大公约数。样例输入
6 9
样例输出
3
提示求最大公约数可以使用辗转相除法:假设a > b > 0,那么a和b的最大公约数等于b和a%b的最大公约数,然后把b和a%b作为新一轮的输入。由于这个过程会一直递减,直到a%b等于0的时候,b的值就是所要求的最大公约数。比如:9和6的最大公约数等于6和9%6=3的最大公约数。由于6%3==0,所以最大公约数为3。
#include <iostream>
#include <cstdio>
using namespace std;
int Gcd( int a,int b)
{
if( a%b==0)
return b;
else
return Gcd(b,a%b);
}
int main()
{
int a,b;
cin>> a >> b;
int i=Gcd(a,b);
cout<<i<<endl;
}
注解;函数递归的例题之一,也可以不进行函数的调用

3:编程填空:第i位替换

描述写出函数中缺失的部分,使得函数返回值为一个整数,该整数的第i位和m的第i位相同,其他位和n相同。请使用【一行代码】补全bitManipulation1函数使得程序能达到上述的功能#include <iostream>using namespace std;int bitManipulation1(int n, int m, int i) {
// 在此处补充你的代码
}

int main() {
int n, m, i, t;
cin >> t;
while (t--) {
cin >> n >> m >> i;
cout << bitManipulation1(n, m, i) << endl;
}
return 0;
}
输入第一行是整数 t,表示测试组数。每组测试数据包含一行,是三个整数 n, m 和 i (0<=i<=31)输出对每组输入数据,每行输出整型变量n变化后的结果样例输入
1
1 2 1
样例输出
3
提示二进制的最右边是第0位
#include <iostream>using namespace std;int bitManipulation1(int n, int m, int i) {//写出函数中缺失的部分,使得函数返回值为一个整数,该整数的第i位和m的第i位相同,其他位和n相同。return (n &(~(1<<i)) | ((m>>i) & 1)<<i );}

int main() {
int n, m, i, t;
cin >> t;
while (t--) {
cin >> n >> m >> i;
cout << bitManipulation1(n, m, i) << endl;
}
return 0;
}

4:编程填空:左边i位取反

查看提交统计提问总时间限制: 1000ms 内存限制: 1024kB描述写出函数中缺失的部分,使得函数返回值为一个整数,该整数的左边i位是n的左边i位取反,其余位和n相同请使用【一行代码】补全bitManipulation3函数使得程序能达到上述的功能
#include <iostream>
using namespace std;

int bitManipulation3(int n, int i) {
// 在此处补充你的代码
}

int main() {
int t, n, i;
cin >> t;
while (t--) {
cin >> n >> i;
cout << bitManipulation3(n, i) << endl;
}
return 0;
}
输入第一行是整数 t,表示测试组数。每组测试数据包含一行,是两个整数 n 和 i (1<=i<=32)。输出对每组输入数据,输出整型变量n中左边i位取反的结果。样例输入
1
0 32
样例输出
-1
#include <iostream>using namespace std;int bitManipulation3(int n, int i) {// 写出函数中缺失的部分,使得函数返回值为一个整数,该整数的左边i位是n的左边i位取反,其余位和n相同return  n ^ ( ~0<<(32-i));}

int main() {
int t, n, i;
cin >> t;
while (t--) {
cin >> n >> i;
cout << bitManipulation3(n, i) << endl;
}
return 0;
}

5:编程填空:第i位取反

查看提交统计提问总时间限制: 1000ms 内存限制: 1024kB描述写出函数中缺失的部分,使得函数返回值为一个整数,该整数的第i位是n的第i位取反,其余位和n相同请使用【一行代码】补全bitManipulation2函数使得程序能达到上述的功能
#include <iostream>using namespace std;int bitManipulation2(int n, int i) {
// 在此处补充你的代码
}int main() {int t, n, i;cin >> t;while (t--) {cin >> n >> i;cout << bitManipulation2(n, i) << endl;}return 0;}
输入第一行是整数 t,表示测试组数。每组测试数据包含一行,是两个整数 n 和 i (0<=i<=31)。输出输出整型变量n中的第i位取反的结果样例输入
11 0
样例输出
0
#include <iostream>using namespace std;int bitManipulation2(int n, int i) {// 使得函数返回值为一个整数,该整数的第i位是n的第i位取反,其余位和n相同return n ^ ( 1<<i) ;}int main() {int t, n, i;cin >> t;while (t--) {cin >> n >> i;cout << bitManipulation2(n, i) << endl;}return 0;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  位运算
相关文章推荐