1. 描述:一条长廊里依次装有n(1 ≤ n ≤ 65535)盏电灯,从头到尾编号1、2、3、…n-1、n。每盏电灯由一个拉线开关控制。
开始,电灯全部关着。有n个学生从长廊穿过。
第一个学生把号码凡是1的倍数的电灯的开关拉一下;
接着第二个学生把号码凡是2的倍数的电灯的开关拉一下;
接着第三个学生把号码凡是3的倍数的电灯的开关拉一下;
如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下。
n个学生按此规定走完后,长廊里电灯有几盏亮着。注:电灯数和学生数一致。
输入:电灯的数量
输出:亮着的电灯数量
样例输入:3
样例输出:1

/*
1. 描述:一条长廊里依次装有n(1 ≤ n ≤ 65535)盏电灯,从头到尾编号1、2、3、…n-1、n。每盏电灯由一个拉线开关控制。
开始,电灯全部关着。有n个学生从长廊穿过。
第一个学生把号码凡是1的倍数的电灯的开关拉一下;
接着第二个学生把号码凡是2的倍数的电灯的开关拉一下;
接着第三个学生把号码凡是3的倍数的电灯的开关拉一下;
如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下。
n个学生按此规定走完后,长廊里电灯有几盏亮着。注:电灯数和学生数一致。
输入:电灯的数量
输出:亮着的电灯数量
样例输入:3
样例输出:1
*/
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
#define N 100
int a[N];
int main()
{
int i,j,n,sum;

while(scanf("%d",&n)!=EOF)
{
memset(a,0,sizeof(a));//0表示开,第一个人全开了
for(i=2;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(j%i==0)
{
a[j]=(a[j]==1?0:1);
}

}
}
sum=0;
for(i=1;i<=n;i++)
{
if(a[i]==0)
sum++;
}
printf("%d\n",sum);
}
return 0;
}
/*
3
8
*/

2. 描述:10个学生考完期末考试评卷完成后,A老师需要划出及格线,要求如下:


(1) 及格线是10的倍数;


(2) 保证至少有60%的学生及格;


(3) 如果所有的学生都高于60分,则及格线为60分


输入:输入10个整数,取值0~100


输出:输出及格线,10的倍数


/*
2. 描述:10个学生考完期末考试评卷完成后,A老师需要划出及格线,要求如下:
(1) 及格线是10的倍数;
(2) 保证至少有60%的学生及格;
(3) 如果所有的学生都高于60分,则及格线为60分
输入:输入10个整数,取值0~100
输出:输出及格线,10的倍数
*/
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
#define N 15
int a[N];
int main()
{
int i;

while(scanf("%d",&a[0])!=EOF)
{
for(i=1;i<10;i++)
scanf("%d",&a[i]);
sort(a,a+10);
if(a[0]>60)
{
printf("60\n");
continue;
}
else
{
printf("%d\n",a[4]/10*10);
}
}
return 0;
}
/*
10 20 30 40 50 60 70 80 90 100
10 20 20 20 20 60 70 80 90 100
60 60 60 60 60 60 60 60 60 60
*/

3 一组人(n个),围成一圈,从某人开始数到第三个的人出列,再接着从下一个人开始数,最终输出最终出列的人? 
(约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。
从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;
依此规律重复下去,直到圆桌周围的人全部出列。)

/*
一组人(n个),围成一圈,从某人开始数到第三个的人出列,再接着从下一个人开始数,最终输出最终出列的人?
(约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。
从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;
依此规律重复下去,直到圆桌周围的人全部出列。)
*/
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
#define N 1000
int main()
{
int sum,n,m,i,j,k,a[100];

while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
memset(a,0,sizeof(a));
i=k;//从k开始
j=0;
sum=n;
//sum剩余人数
//i用来在整个n中循环
//j递增报数到m,出去一个人
while(sum>0)
{
if(a[i]!=-1)
{
j++;
if(j==m)
{
a[i]=-1;
printf("%d ",i);
j=0;
sum--;
}
}
i++;
if(i>n) i=1;
}
}
return 0;
}
/*
6 3 1
*/


4. 数组中数字都两两相同,只有一个不同,找出该数字


/*
4. 数组中数字都两两相同,只有一个不同,找出该数字:
*/
#include<iostream>
#include<stdio.h>
using namespace std;
int findUnique(int* a, int len)
{
int i,temp;
temp=0;
for(i=0;i<len;i++)
temp=temp^a[i];
return temp;
}

int main()
{
int a[]={1,2,3,4,5,3,4,1,2};
int t;
t=findUnique(a,9);
printf("%d\n", t);
return 0;
}


5 数组中数字两两相同,有两个不同,找出这两个:


/*
5 数组中数字两两相同,有两个不同,找出这两个:
*/
#include<iostream>
#include<stdio.h>
using namespace std;
void findTwoUnique(int* a, int len)
{
int i,temp,m,n,k;
temp=0;//m^n
for(i=0;i<len;i++)
temp=temp^a[i];
//101 110 第0位不同 011
k=0;m=temp;
while((m&1)==0)//找出第一个不同的
{
m=m>>1;
k++;
}

m=temp;//m
for(i=0;i<len;i++)
{
if((a[i]>>k)&1)
m=m^a[i];
}
n=temp^m;
printf("%d %d\n",m,n);
}

int main()
{
int a[]={1,2,3,4,5,3,4,1,2,6};
int t;
findTwoUnique(a,10);
return 0;
}