一、实验目的
1、 熟悉开发工具的使用。
2、 掌握递归的实现思想。
二、 实验内容
1、题目描述:
现有一个有n个元素的序列a=[a1,a2,⋯,an],定义这个序列的价值为 。空序列的价值为0。先给你一个长度为n的序列a,求a中所有子集价值的异或和,要求子集中元素的相对位置保持不变。
异或和: 位运算的一种。如果a、b两个值不相同,则异或结果为1;如果a、b两个值相同,异或结果为0。
输入输出格式:
输入:第一行,一个整数n
接下来一行有n个非负整数:a1,a2,⋯,an
输出:一个整数,表示所有子集价值的异或和。
2、题目描述:
现有一个有n个元素的序列a=[a1,a2,⋯,an],定义其价值为
给出这样一个序列,求其所有排列的价值vi或
其中∣为位运算或操作,⊕为位运算异或操作。
输入输出格式:
输入:输入的第一行是一个整数n (2<=n<=10),表示需排列的数的个数。
接下来一行是n个整数,数的范围是0到100000,每两个相邻数据间用一个空格分隔。
输出:
一个整数,代表所有排列价值的或。
#include<iostream>
using namespace std;
int value=0;
int Subset(int *a,int *b,int m,int n){
//a为原始数组,b为确定子集中包含元素的数组
int sum=0,j=0;//由j确定子集中元素的相对位置
if(m==n){
//终止条件
for (int i=0; i<n; i++){
if(b[i]==1){
sum+=a[i]*(j+1);
j++;
}else{
sum+=0*(i+1);
}
}
value=value^sum;
return value;
}else{
//子集中元素的遍历
b[m]=0;
Subset(a,b,m+1,n);
b[m]=1;//重置
Subset(a,b,m+1,n);
}
}
int main(){
int n,a[20];
cin>>n;
int b[n];
for(int i=0;i<n;i++){
cin>>a[i];
}
cout<<Subset(a,b,0,n);
return 0;
}
#include <iostream>
using namespace std;
int value=0;
void swap(int &a,int &b){
//交换值
int t;
t=a;
a=b;
b=t;
}
int P(int list[],int m,int n){
int i,sum=0;
if(m==n){
//递归结束条件
for(i=0;i<n;i++){
sum+=list[i]^(i+1);
}
value|=sum;
}else{
for(i=m;i<n;i++){
swap(list[i],list[m]);
P(list,m+1,n);
swap(list[i],list[m]);
}
}
return value;
}
int main(int argc, char** argv) {
int n,a[20];
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
cout<<P(a,0,n);
return 0;
}