您的位置:首页 > 其它

华为机试 题目

2015-03-23 19:07 399 查看
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
;
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
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: