杭电2008-2011笔试题目解答

  2008杭电笔试题
        /*输入一个长整型的数,从低位起取出奇数位组成一个新的数输出

#include<cstdio>

int main(){
	long long num;
	scanf("%lld",&num);
	int i=0,temp,sum1=0,sum2=0,product=1;
	do{
		temp=num%10;//取num的最低位 
		num=num/10;
		i++;
		if(i%2!=0){
			sum1=sum1*10+temp;
			sum2=sum2+temp*product; 
			product=product*10;
		} 
	}while(num!=0);
	printf("%d\n",sum1);
		printf("%d\n",sum2);
	return 0;
} 

*///

/*输入n个字符串,将他们按字母从小到大的顺序排列并输出
string二维容器存储字符串,sort排序,在输出
*/

#include<cstdio>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

bool cmp(string a,string b){
	return a>b;
} 
int main(){
	string s[100];
	char str[100];
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		cin>>s[i];//cin会以空格结束,getline(cin,s[i]); 
	}
	sort(s,s+n);//默认按照字典序对二维字符串排序 
	for(int i=0;i<n;i++){
		cout<<s[i]<<endl;
	} 
	return 0;
} 

2009杭电笔试题
/*输入一个整数,判断是否是水仙花数,指一个三位数,它的各位数字的立方和等于其本身,
/
/

#include<cstdio>

int main(){
	int num;
	scanf("%d",&num);
	int sum=0,num2=num;
	for(int i=0;i<3;i++){
		int temp=num%10;
		num=num/10;
		sum=sum+temp*temp*temp;
	}
	if(sum==num2) printf("yes\n");
	else printf("no\n");	
	return 0;
} 

*/

/*完数的定义:如果一个大于 1 的正整数的所有因子之和等于它的本身,则称这个数是完
数,比如 6,28 都是完数:6=1+2+3;28=1+2+4+7+14。输入一个整数,判断它是否是完数。
*/
//用一个数组存储所有因子,在累加数组中的数

#include<cstdio>

int fac[1010],fac_num=0; 

void get_fac(int n){
	for(int i=1;i<n;i++){
		if(n%i==0){
			fac[fac_num++]=i;
		}
	}
}
int main(){
	int num,sum=0;
	scanf("%d",&num);
	get_fac(num);
	for(int i=0;i<fac_num;i++){
		sum=sum+fac[i];
	}
	if(sum==num){
		printf("yes\n");
	}else printf("no\n");
	return 0;
} 

2010杭电笔试题

这个是自己的思考,下边的一题是杭电笔试题
/*公平的洗牌算法,从n个1–n内的数中选出m个不重复的数
1.用rand()函数,想要输出范围在[a,b]内的随机数,可以用rand()%(b-a+1)+a即可
2.对于选出来的数用hash数组存储,直到有m个不同的数为止

int r_num=0;
while(r_num<m){
	if(hash[rand()]==0){//该数没有出先过 
		hash[rand()]=1;
		r_num++; 
	}
}
*/

//公平的洗牌算法 ,n张牌一共有n!个排列,任意一个排列之间概率都是相等的叫公平
//也可以这样想,只要保证每个元素在某一位置出现的概率都相等或者每一个为止都能等概率出现任意元素
for(int i=n-1;i>=0;i–){
swap(arr[i],arr[rand()%(i+1)])//从后往前,挑选第i个位置的数与前面[0,i-1]中的随便一个数交换
}

/*题目:随即产生一个 3 位的正整数,让你进行猜数字,如果猜小了,输出: “猜小了,请继续”。 如果猜大了,输出:“猜大了,请继续”。如果猜对了。输 出:“恭喜你,猜对了”。 不过最多只能猜 10 次,如果猜了 10 次还没有猜对, 就退出程序,输出:“Bye Bye”。
#include<cstdio>
#include<ctime>
#include<stdlib.h> 
int main(){
	srand((unsigned)time(NULL));//随机函数必须要的,输出在[0,32767]范围内的随机数
	int  num=rand()%(999-100+1)+100;//生成[100,999]内的随机数
	printf("%d",num);
	int cnt=0;
	int temp;
	while(cnt<3){
		scanf("%d",&temp);
		if(temp==num){
			printf("恭喜你,猜对了\n");
			break;
		}
		else if(temp<num){
			printf("猜小了,请继续\n");
		}else{
			printf("猜大了,请继续\n");
		}
		cnt++; 
	} 
	if(cnt==3) printf("Bye Bye");//10次都没猜对 
	return 0; 
}

2011杭电笔试题
/*输入三个正整数 A、B、C,判断这三个数能不能构成一个三角形。
任意两边之和大于第三边,任一两边之差小于第三边

#include<cstdio>

int main(){
	int num[5];
	scanf("%d%d%d",&num[0],&num[1],&num[2]);
	bool flag=true;
	for(int i=0;i<3;i++){
		if(num[i%3]+num[(i+1)%3]<=num[(i+2)%3]){
			flag=false;
			break;
		}
	}
	if(flag) printf("YES\n");
	else printf("NO\n"); 
	return 0;
}
/*日期的处理:有个人从 2003年1月1日开始,三天打鱼两天晒网,请输入月份、日期, 问在当年的某一天他是在打鱼还是在晒网。 统计从03年1月1日到输入的日期一共有多少天,然后对5取模后+1,1,2,3在打鱼,4和5在筛网
#include<cstdio>
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; 
int get_day(int year,int month,int day){
	if(year%4==0 && year%100!=0){//year is 闰年 
	}
	int daynum=1;
	int m1=1,d1=1;
	//从1月1日起往上加天数,直到加到输入的日期 
	while(month>m1 || day>d1){
		d1++;
		daynum++;
		if(d1>month[m1]){
			m1++;
			d1=1;//日期变为下月的1号 
		}
		if(m1>12){
			y1++;
			m1=1;
		}
	}
	return daynum;
}

int main(){
	int year,month,day;
	scanf("%d %d %d"year,month,day);
	int daynum=get_day(year,month,day);
	if(daynum%5+1<=3) printf("正在打鱼\n");
	else printf("正在筛网\n"); 
	return 0;
} 
丑数是这样定义的:如果一个正整数的素因子只包含 2、3、5、7 四种, 则它被称为丑数。以下数列 1, 2, 3,4, 5,6,7,8,9, 10,12,14,15, 16,18, 20, 21,24,25, 27.......... 就显示了前 20 个丑数。给出一个 正整数 N,判断这个数是否为丑数。 求出一个数的所有质因子,检测如果存在2.3.5.7之外的质因子则不是, 先打印出来所有的质因子 一个数的质因子要么全小于sqrt(n),要么只有一个大于sqrt(n)
#include<cstdio>
#include<math.h>

int prime[1000],p_num=0; 
int hash[10000]={0};

struct factor{
	int x,x_num;
}fac[10];
//判断n是否是质因子 ,从2到sqrt(n)之间的数都不能被他整除 
bool isprime(int n){
	int sqr=(int)sqrt(n*1.0);
	for(int i=2;i<sqr;i++){
		if(n%i==0){
			return false;
		}
	}
	return true;
} 
//得到n以内的所有质因子 
void get_prime(int n){
//	int sqr=(int)sqrt(n*1.0);
	for(int i=2;i<=n;i++){//枚举从2到n的所有数 
		if(isprime(i)){
			prime[p_num++]=i;
		} 
	}
}

int main(){
	int n;
	scanf("%d",&n);
	int sqr=(int)sqrt(1.0*n);
	int fac_num=0;
	for(int i=0;i<p_num && prime[i]<=sqr;i++){//将所有的质因子及质因子个数求出 
		if(n%prime[i]==0){
			fac[fac_num].x =prime[i];
			fac[fac_num].x_num=0;
			while(n%prime[i]==0){
				n=n/prime[i];
				fac[fac_num].x_num++;
			}
			fac_num++;
		}
		if(n==1) break;
	}
	if(n!=1){
		fac[fac_num].x =n;
		fac[fac_num].x_num =1;
		fac_num++;
	}
	bool ans=false;
	for(int i=0;i<fac_num;i++){
		if(fac[i].x!=2 && fac[i].x!=3 && fac[i].x!=5 && fac[i].x!=7 ){//2.3.5.7都不等于 
			ans=true;//不是丑数 
			break;
		}
	} 
	if(ans==false) printf("YES\n");
	else printf("NO\n");
	
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值