杭电oj(2008-2012、2039、1720、1062、1064、1170、1197、2629)题解

目录

​编辑

2008

题目

思路

代码

2009

题目

思路

代码

2010

题目

思路

代码

2011

题目

思路

代码

2012

题目

思路

代码

2039

题目

思路

代码

1720

题目

思路

代码

法一,自定义函数进行转换

法二、 直接输入十六进制数即可

1062

题目

思路

代码

1064

题目

思路

代码

1170

题目

思路

代码

1197

题目

思路

代码

2629

题目

思路

代码


2008

题目

思路

直接统计正负0的个数即可

代码

#include<iostream>
using namespace std;
int n,f,l,z; 
double num;
signed main(){
	while(cin>>n){
		f=0;l=0;z=0;
		if(n==0) break;
		for(int i=0;i<n;i++){
			cin>>num;
			if(num>0) z++;
			else if(num==0) l++;
			else f++;
		}
		cout<<f<<" "<<l<<" "<<z<<endl;
	}
	return 0;
}

2009

题目

思路

简单的数学问题,sqrt直接计算即可,别忘了保留小数。

代码

#include<iostream>
#include<math.h>
using namespace std;
int m;
double sum,n;
int main(){
	while(cin>>n>>m){
		sum=0;
		for(int i=0;i<m;i++){
			sum+=n;
			n=sqrt(n);
		}
		printf("%.2lf\n",sum);
	}
	return 0;
}

2010

题目

思路

题目中的数据只有三位数,所以可以将100-999中所有的水仙花数都找出来再对照即可

代码

#include<iostream>
#include<math.h>
#include<vector>
using namespace std;
int g,s,b,n,m;
vector<int> a;
bool check(int a){
	g=a%10;
	s=a/10%10;
	b=a/100;
	if(pow(g,3)+pow(s,3)+pow(b,3)==a){
		return true;
	}
	return false;
}
void all_num(){
	for(int i=100;i<=999;i++){
		if(check(i)) {
			a.push_back(i);
		}
	}
}
int main(){
	all_num();
	while(cin>>m>>n){
		int cnt=0;
		for(int i=0;i<a.size();i++){
			if(a[i]>=m&&a[i]<=n) {
				cout<<a[i]<<" ";
				cnt++;
			}
		}
		if(cnt==0) cout<<"no"<<endl;
	}
	return 0;
}

2011

题目

思路

这道题的解法就多了,可以直接一个循环判断奇偶进行加减操作,也可以分开计算,正数和-负数和,我这里是第二种方法。

代码

#include<iostream>
using namespace std;
int n;
double z,f,num,sum;
int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		sum=0;
		f=0,z=0;
		cin>>num;
		for(int j=2;j<=num;j+=2){
			f+=1.0/j;
		}
		for(int j=1;j<=num;j+=2){
			z+=1.0/j;
		}
		//cout<<f<<" "<<z<<endl;
		printf("%.2lf\n",z-f);
	}
	return 0;
}

2012

题目

思路

判断运算后的数是否是素数即可

代码

#include<iostream>
using namespace std;
int x,y,num,cnt;
bool prime(int num){
	if(num<=1) return false;
	else{
		for(int i=2;i*i<=num;i++){
			if(num%i==0) return false;
		}
	}
	return true;
}
int main(){
	while(cin>>x>>y){
		cnt=0;
		if(x==0 && y==0) break;
		for(int i=x;i<=y;i++){
			num=i*i+i+41;
			//cout<<num<<" ";
			if(prime(num)) cnt++;
			//cout<<cnt<<" ";
		}
		if(cnt==y-x+1) cout<<"OK"<<endl;
		else cout<<"Sorry"<<endl;
	}
	return 0;
}

2039

题目

思路

三角形的定义,任意两边之和大于第三边

注:题目中说的是正数,并不一定都是正整数,还有浮点数

代码

#include<iostream>
#include <algorithm>
using namespace std;
double n;
double sjx[3];
int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>sjx[0]>>sjx[1]>>sjx[2];
		sort(sjx,sjx+3);
		if(sjx[0]+sjx[1]>sjx[2] && sjx[0]+sjx[2]>sjx[1] && sjx[1]+sjx[2]>sjx[0]){
			cout<<"YES";
		}else cout<<"NO";
		if(i!=n-1) cout<<endl;
	}
	return 0;
}

1720

题目

思路

十六进制数与十进制数的相互转换

注:十六进制数的输入是%x;

代码

法一,自定义函数进行转换

#include<iostream>
#include<math.h>
#include<string>
using namespace std;
int change_num(string aa){
	int l=aa.size();
	int ans=0;
	for(int i=0;i<l;i++){
		if(aa[i]>='0' && aa[i]<='9'){
			ans+=(aa[i]-'0')*pow(16,l-i-1);
		}
		else if(aa[i]>='a' && aa[i]<='f'){
			ans+=(aa[i]-'a'+10)*pow(16,l-i-1);
		}
		else if(aa[i]>='A' && aa[i]<='F'){
			ans+=(aa[i]-'A'+10)*pow(16,l-i-1);
		}
	}
	return ans;
}
int main(){
	string a,b; 
	while(cin>>a>>b){
		cout<<change_num(a)+change_num(b)<<endl;
	}
	return 0;
}

法二、 直接输入十六进制数即可

#include<iostream>
#include <algorithm>
using namespace std;
int main(){
	int a,b; 
	while(scanf("%x %x",&a,&b)!=EOF){
		cout<<a<<" "<<b<<endl;
		cout<<a+b<<endl;
	}
	return 0;
}

1062

题目

思路

判断前后空格的位置即可,按照单词来一个一个反转

代码

#include<iostream>
#include <algorithm>
#include<string>
using namespace std;
string s;
int n; 
int main(){
	cin>>n;
	cin.ignore();
	for(int i=0;i<n;i++){
		string ans="";
		getline(cin,s);
		int qkg=0;
		int hkg=0;
		for(int i=0;i<s.size();i++){
			if(s[i]==' '){
				hkg=i;
				for(int j=hkg-1;j>=qkg;j--){
					ans+=s[j];
				}
				qkg=hkg;
				ans+=" ";
			}
			else if(i==s.size()-1){
				hkg=i;
				for(int j=hkg;j>=qkg;j--){
					ans+=s[j];
				}
				qkg=hkg;
				ans+=" ";
			}
		}
		cout<<ans;
		cout<<endl;
	}
	return 0;
}

1064

题目

思路

算平均数保留小数即可,别忘了前置的符号

代码

#include<iostream>
#include <algorithm>
using namespace std;
double num,sum;
int main(){
	for(int i=0;i<12;i++){
		cin>>num;
		sum+=num;
	} 
	printf("$%.2lf",sum/12);
	return 0;
}

1170

题目

思路

注意判断一下是否是整数,如果是整数不用保留小数,如果是小数,保留两位小数。

代码

#include<iostream>
#include <algorithm>
using namespace std;
int n;
double a,b;
char c;
int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>c>>a>>b;
		if(c=='+') {
			if((a+b)==(int)(a+b)){
				printf("%.0lf\n",a+b);
			}else{
				printf("%.2lf\n",a+b);
			}
		}
		else if(c=='-') {
			if((a-b)==(int)(a-b)){
				printf("%.0lf\n",a-b);
			}else{
				printf("%.2lf\n",a-b);
			}
		}
		else if(c=='*') {
			if((a*b)==(int)(a*b)){
				printf("%.0lf\n",a*b);
			}else{
				printf("%.2lf\n",a*b);
			}
		}
		else if(c=='/') {
			if((a/b)==(int)(a/b)){
				printf("%.0lf\n",a/b);
			}else{
				printf("%.2lf\n",a/b);
			}
		}
	}
	return 0;
}

1197

题目

思路

就是判断一个数的十进制,十二进制,十六进制的数位和是否相等

代码

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
// 计算十进制下各位数字之和
int sjz(int num) {
    int sum = 0;
    while (num > 0) {
        sum += num % 10;
        num /= 10;
    }
    return sum;
}
// 计算十二进制下各位数字之和
int srjz(int num) {
    int sum = 0;
    while (num > 0) {
        sum += num % 12;
        num /= 12;
    }
    return sum;
}
// 计算十六进制下各位数字之和
int sljz(int num) {
    int sum = 0;
    while (num > 0) {
        sum += num % 16;
        num /= 16;
    }
    return sum;
}
int main() {
    //cout << "666" << endl;
    for (int i = 2992; i <= 9999; i++) {
        int decimalSum = sjz(i);
        int duodecimalSum = srjz(i);
        int hexadecimalSum = sljz(i);
        if (decimalSum == duodecimalSum && duodecimalSum == hexadecimalSum) {
            cout << i << endl;
        }
    }
    //cout << "999" << endl;
    return 0;
}  

2629

题目

思路

字符串的简单判断。

这个地方不知道为什么判断前六位ac不了。

代码

#include <iostream>
#include <string>
using namespace std;
int main() {
    int n;
    string s;
    cin>>n;
    for (int i = 0; i < n; i++) {
        cin >> s;
        string sf = s.substr(0, 2);
        if (sf == "33") sf = "Zhejiang";
        else if (sf == "82") sf = "Macao";
        else if (sf == "11") sf = "Beijing";
        else if (sf == "54") sf = "Tibet";
        else if (sf == "71") sf = "Taiwan";
        else if (sf == "21") sf = "Liaoning";
        else if (sf == "81") sf = "Hong Kong";
        else if (sf == "31") sf = "Shanghai";

        cout <<"He/She is from"<<" "<< sf << ",and his/her birthday is on"<<" "<<s.substr(10,2)<<"," <<s.substr(12,2)<<","<<s.substr(6,4)<<" " <<"based on the table."<<endl;
    }
    return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值