杭电ACM继续,上本篇博客10道题。

杭电ACM(2010-2019)

//2010水仙花数
#include <iostream>
#include <math.h>

using namespace std;

//判断是否是水仙花数
bool shuxian(int x)
{
	//i,j,k中存放的是x的个位,十位,百位
	int i,j,k;
	//使用以下的方法来获取x的各个位
	i = x%10;
	j = x/10%10;
	k = x/100;
	if(x == pow((float)i,3)+pow((float)j,3)+pow((float)k,3))
		return true;
	return false;
}

int main()
{
	int m,n;
	bool flag;
	while(cin>>m>>n)
	{
		flag = false;
		for(int i=m;i<n+1;i++)
		{
			if(shuxian(i))
			{
				//注意输出格式的问题
				if(flag == true)
					cout<<" ";
				cout<<i;
				flag = true;
			}
		}
		if(flag == false)
			cout<<"no";
		cout<<endl;
	}

	return 0;
}

杭电ACM(2010-2019) 杭电ACM(2010-2019)

//2011多项式求和
#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
	int m,n;
	double sum;
	cin>>m;
	//读取这m个数
	for(int i=0;i<m;i++)
	{
		sum = 0.0;
		cin>>n;
		//对其中读取到的某个数单独处理
		for(int j=1;j<n+1;j++)
		{
			if(j%2 == 0)
				sum += -1.0/j;
			else
				sum += 1.0/j;
		}
		cout<<fixed<<setprecision(2)<<sum<<endl;
	}

	return 0;
}

杭电ACM(2010-2019)

//2012素数判定
#include <iostream>
#include <math.h>

using namespace std;

/*判断一个数是否为素数,应该从2开始判断,1不是素数也不是合数,2是素数。如果一个数只能被1和它本身除,那这个
数就是素数*/

bool isprime(int x)
{
	int y = x;
	x = sqrt((float)x);
	/* 由非素数的因数(1除外)的特点可知,对于非素数n=A*B,非素数的因数中必定有一个小于等于sqrt(n),而与之对应的
	另一个因数大于等于sqrt(n)。依次判断2~sqrt(n)的所有整数能否整除n。如果没有一个能整除的,那么sqrt(n)+1~n中的整
	数也必定不能被整除n,n是素数;否则不是素数。*/
	for(int i=2;i<x+1;i++)
	{
		//只要有一个数能被x整除,x就不是素数
		if(y%i == 0)
			return false;
	}
	return true;
}

int main()
{
	int x,y;
	while(cin>>x>>y && (x!=0 || y!=0))
	{
		while(x<y)
		{
			if(isprime(x*x+x+41))
				x++;
			else
				break;
		}
		if(x == y)
			cout<<"OK"<<endl;
		else
			cout<<"Sorry"<<endl;
	}

	return 0;
}

杭电ACM(2010-2019)

//2013蟠桃记
#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
	int n;
	int sum;
	while(cin>>n)
	{
		sum = 1;
		for(int i=1;i<n;i++)
		{
			//使用如下的公式倒推一共有多少个桃子
			sum = (sum+1)*2;
		}
		cout<<sum<<endl;
	}

	return 0;
}

杭电ACM(2010-2019)

//2014青年歌手大奖赛_评委会打分
#include <iostream>
#include <iomanip>

using namespace std;

//对这n个数求和
float sum(float * score,int n)
{
	float tem;
	for(int i=0;i<n-1;i++)
	{
		//将最大的得分排在最后
		if(score[i] > score[n-1])
		{
			tem = score[i];
			score[i] = score[n-1];
			score[n-1] = tem;
		}
	}

	for(int i=0;i<n-1;i++)
	{
		//将得分最小的排在最前面
		if(score[i] < score[0])
		{
			tem = score[i];
			score[i] = score[0];
			score[0] = tem;
		}
	}

	//去掉最低分和最高分,将和加起来
	float sum = 0;
	for(int i=1;i<n-1;i++)
	{
		sum += score[i];
	}

	return sum;
}

int main()
{
	int n;
	float * score;
	float result;
	while(cin>>n)
	{
		//读取这n个数
		score = new float[n];
		for(int i=0;i<n;i++)
		{
			cin>>score[i];
		}
		result = sum(score,n);
		cout<<fixed<<setprecision(2)<<result/(n-2)<<endl;
	}

	return 0;
}

杭电ACM(2010-2019)

//2015偶数求和
#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
	int n,m;
	int sum;
	int j,k;
	while(cin>>n>>m)
	{
		sum = 0;
		//j代表的是数列的每一项
		j = 2;
		//k用来计算sum加了多少项的和了
		k = 0;
		for(int i=1;i<n+1;i++)
		{
			sum += j;
			j+=2;
			k++;
			//将前边的m个数加起来,如果是最后的几个数则不加,到最后处理
			if(k == m && i != n)
			{
				cout<<sum/m<<" ";
				sum = 0;
				k=0;
			}
		}
		cout<<sum/k<<endl;
	}

	return 0;
}

杭电ACM(2010-2019)

//2016数据的交换输出
#include <iostream>

using namespace std;

int main()
{
	int n;
	int * num;
	int j;
	int tem;
	while(cin>>n && n!=0)
	{
		num = new int[n];
		//j是用来记录最小的数的位置的
		j = 0;
		//读入这n个数
		for(int i=0;i<n;i++)
		{
			cin>>num[i];
		}
		//找出最小的数所在的位置,开始的时候假设最小的位置是0
		for(int i=0;i<n-1;i++)
		{
			if(num[i+1] < num[j])
			{
				j = i+1;
			}
		}
		//交换
		tem = num[j];
		num[j] = num[0];
		num[0] = tem;
		//输出
		for(int i=0;i<n;i++)
		{
			if(i<n-1)
				cout<<num[i]<<" ";
			else
				cout<<num[i]<<endl;
		}

		delete num;
	}

	return 0;
}

杭电ACM(2010-2019)

//2017字符串统计
#include <iostream>
#include <string>
#include <cctype> //包含对字符处理的函数

using namespace std;

int main()
{
	int n;
	int count;
	cin>>n;
	string str;
	//ignore函数是用来将读取n值留下的空格清空
	cin.ignore();
	for(int i=0;i<n;i++)
	{
		count = 0;
		//从标准输入中读取一行字符串
		getline(cin,str);
		for(int j=0;j<str.size();j++)
		{
			//判断某个字符是否是数字字符
			if(isdigit(str[j]))
			{
				count++;
			}
		}
		cout<<count<<endl;
	}

	return 0;
}

杭电ACM(2010-2019)

//2018母牛的故事
#include <iostream>

using namespace std;

int main()
{
	int n;
	int * year;
	while(cin>>n && n!=0)
	{
		//year数组用来存放牛的头数
		year = new int[n];
		for(int i=0;i<n;i++)
		{
			//前三年牛的头数为1,2,3
			if(i==0 || i==1 || i==2)
			{
				year[i] = i+1;
			}
			//从第四年开始,每年牛的头数是上一年牛的头数加上三年牛的头数
			else
			{
				year[i] = year[i-1]+year[i-3];
			}
		}
		cout<<year[n-1]<<endl;
		delete year;
	}

	return 0;
}

杭电ACM(2010-2019)

//2019数列有序
#include <iostream>
#include <set> //使用multiset集合解决问题

using namespace std;

int main()
{
	int n,m;
	//这里注意要使用multiset集合而不是set集合,因为元素可能重复
	multiset<int> num;
	int tem;
	while(cin>>n>>m && (n!=0 || m!=0))
	{
		num.clear();
		for(int i=0;i<n;i++)
		{
			cin>>tem;
			//添加到set集合中
			num.insert(tem);
		}
		num.insert(m);
		//遍历集合
		for(multiset<int>::const_iterator iterator = num.begin();iterator != num.end();iterator++)
		{
			if(iterator != num.begin())
				cout<<" ";
				cout<<*iterator;
		}
		cout<<endl;
	}

	return 0;
}

以上的题目都是基础,也很简单,细节问题注意一下就好了,我在做的时候遇到的问题是最后一道,我使用的是set集合,最后结果正确却提交老是错误,原来set集合是不允许元素重复的,我忽略了这个问题,导致了错误,改用了multiset就好了。