【iHooya】1月18日寒假作业解析

按照个位数排序
对于给定的正整数序列,按照个位数从小到大排序,个位数相同的按照本身大小从小到大排序。
输入:第一行1个整数n,表示序列的大小。( 0 < n ≤ 1000) 第二行n个正整数,表示序列的每个数,每个数不大于100000000。

输出:输出按照题目要求排序后的序列

样例输入
6
17 23 9 13 88 10

样例输出
10 13 23 17 88 9

/*方法1
可以先对原序列进行排序,也就是9 10 13 17 23 88
然后可以按照个位数进行排序 10 13 23 17 88 9
这样就解决了个位数相同按照本身大小从小到排序了*/
#include <bits/stdc++.h>
using namespace std;

int main()
{
	int n;
	cin >> n;
	int arr[n];
	for (int a = 0; a < n; a++)
		cin >> arr[a];
	sort(arr, arr + n); //对原序列排序
	for (int a = 0; a < n; a++)//用冒泡排序对以个位数为条件对整个序列排序
	{
		for (int b = 0; b < n - a - 1; b++)
			if (arr[b] % 10 > arr[b + 1] % 10)
				swap(arr[b], arr[b + 1]);
	}
	for (int c = 0; c < n; c++)
		cout << arr[c] << " ";
	return 0;
}
//方法2:
//改写sort函数
#include<bits/stdc++.h>
using namespace std;
bool cmp(int a,int b)
{
	if(a%10<b%10)
		return true;
	else if(a%10>b%10)
		return false;
	else if(a%10==b%10)
		if(a<=b)
			return true;
		else 
			return false;
}
int main()
{
	int n=0;
	cin>>n;
	int arr[n];
	for(int a=0;a<n;a++)
		cin>>arr[a];
	sort(arr,arr+n,cmp);
	for(int a=0;a<n;a++)
		cout<<arr[a]<<" ";

	return 0;
}

奇数单增序列
给定一个长度为N(不大于500)的正整数序列,请将其中的所有奇数取出,并按升序输出。

输入
共2行: 第1行为 N; 第2行为 N 个正整数,其间用空格间隔。

输出:增序输出的奇数序列,数据之间以逗号间隔。数据保证至少有一个奇数。

样例输入
10
1 3 2 6 5 4 9 8 7 10

样例输出1,3,5,7,9

//对原序列进行升序排列,排完后再把奇数输出;
#include <bits/stdc++.h>
using namespace std;

int main()
{
	int n = 0;
	cin >> n;
	int arr[n];
	for (int a = 0; a < n; a++)
		cin >> arr[a];
	sort(arr, arr + n);
	for (int b = 0; b < n; b++)
		if (arr[b] % 2 == 1)
			cout << arr[b] << ",";
	return 0;
}

偶数降序输出
给定一个长度为N(不大于500)的正整数序列,请将其中的所有偶数取出,并按降序输出。

输入:共2行:第1行为N;第2行为N个正整数,其间用空格间隔。

输出:降序输出的偶数序列,数之间以空格间隔。数据保证至少有一个偶数。

样例输入
10
l 3 2 6 5 4 9 8 7 10

样例输出10 8 6 4 2

//可以对原序列进行升序排列,然后逆序输出偶数
#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n=0;
	cin>>n;
	int arr[n];
	for(int a=0;a<n;a++)
		cin>>arr[a];
	sort(arr,arr+n);
	for(int b=n-1;b>=0;b--)
		if(arr[b]%2==0)
			cout<<arr[b]<<" ";
	return 0;
}

分解因数
给出一个正整数a,要求分解成若干个正整数的乘积,即a = a1 * a2 * a3 * … * an,并且,问这样的分解的种数有多少。注意到a = a也是一种分解。

输入:第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数a (1 < a < 32768)

输出:n行,每行输出对应一个输入。输出应是一个正整数,指明满足要求的分解的种数

样例输入
2
2
20
样例输出
1
4

/*
1.首先在找因数之前你要判断这个数是否为质数,如果是质数那么就只有一直分解种数。
2.如果一个数n%a取余等于0,说明a是n的因子,那么n/a就表明这是除了a以外的其它因子乘积,比如:48%2==0,2就是48的因子,48/2=24,24就是48的其它因子或者因子乘积。
*/
#include<bits/stdc++.h>
using namespace std;
int count_s=1;//计数器
bool prime(int n)//判断质数
{
	if(n<2)
		return false;
	if(n==2)
		return true;
	if(n>2){
		for(int a=2;a<=sqrt(n);a++)
			if(n%a==0)
				return false;//说明不是质数
		return true;//说明是质数
	}	
}
void divide(int n,int m){
	if(prime(n)==true)//如果是质数直接跳出返回
		return ;
	else
		for(int a=m;a<=sqrt(n);a++)
		{
			if(n%a==0)//说明a是n的因子
			{
				count_s++;//记录因子数量
				divide(n/a,a);// n/a是其它因子的乘积 下一次遍历从a开始遍历
			}		
		}		
}
int main(){
	int n=0;
	cin>>n;
	int arr[n];
	for(int a=0;a<n;a++)
		cin>>arr[a];
	
	for(int b=0;b<n;b++)
	{
		divide(arr[b],2);
		cout<<count_s<<endl;
		count_s=1;//重新计数
	}
	return 0;
}

算24
给出4个小于10个正整数,你可以使用加减乘除4种运算以及括号把这4个数连接起来得到一个表达式。现在的问题是,是否存在一种方式使得得到的表达式的结果等于24。 这里加减乘除以及括号的运算结果和运算的优先级跟我们平常的定义一致(这里的除法定义是实数除法)。 比如,对于5,5,5,1,我们知道5 * (5 – 1 / 5) = 24,因此可以得到24。又比如,对于1,1,4,2,我们怎么都不能得到24。

输入:输入数据包括多行,每行给出一组测试数据,包括4个小于10个正整数。最后一组测试数据中包括4个0,表示输入的结束,这组数据不用处理。

输出:对于每一组测试数据,输出一行,如果可以得到24,输出“YES”;否则,输出“NO”。

样例输入
5 5 5 1
1 1 4 2
0 0 0 0

样例输出
YES
NO

/*
把原问题n个数中的任意两个数通过六种运算方式变成一个数,再把这个数和剩下的n-2个数进行合并,递归地求解n-1个数的24点问题。

由于涉及浮点数的计算,在判断是否等于24时不能直接判等,而要采取与24做差、判断差是否小于EPS的做法来判断。
*/
/*
	1e-6(也就是0.000001)叫做epslon,用来抵消浮点运算中因为误差造成的相等无法判断的情况。它通常是一个非常小的数字(具体多小要看你的运算误差)
	比如说因为精度误差,用十进制举例,我们要算1/3+1/3+1/3==1(从数学上说,肯定相等),但是因为精度问题,等号左边算出来是0.3333333+0.3333333+0.3333333=0.9999999,
	存在了误差,右边是1.0000000,那么如果直接用==,返回false,我们希望它被视作相等。那么就要两数相减取绝对值小于epslon的办法。
*/
#include<bits/stdc++.h>
using namespace std;
bool search(double a[],int x) 
{
	if(x==1&&fabs(a[1]-24)<=1e-6)
		return 1;  //题目要求除法运算为实数;
	double b[6]={0};        //存放加减乘除的运算结果
	for(int i=1;i<=x-1;++i)
	{
		for(int j=i+1;j<=x;++j)
		{
			int p=1;
			for(int k=1;k<=x;++k)
			{
				if(k!=i&&k!=j)
				{
					b[p++]=a[k];
				}
			}
			b[p]=a[i]+a[j]; 
			if(search(b,x-1))
				return 1;//分别递归,依次穷举;
			b[p]=a[i]*a[j]; 
			if(search(b,x-1))
				return 1;
			b[p]=a[i]-a[j]; 
			if(search(b,x-1))
				return 1;
			b[p]=a[j]-a[i]; 
			if(search(b,x-1))
				return 1;
			if(a[j]!=0)
			{
				b[p]=a[i]/a[j];
				if(search(b,x-1))
					return 1;
			}
			if(a[i]!=0)
			{
				b[p]=a[j]/a[i];
				if(search(b,x-1))
					return 1;
			}
		}
	}
	return 0;
}
int main()
{
	while(true)
	{
		double a[5]={0};
		int sum=0;
		for(int i=1;i<=4;++i)
		{
			cin>>a[i];
			sum+=a[i];
		}
		if(sum==0)//结束测试
			break;
		bool flag=search(a,4);
		if(flag==1)
			cout<<"YES"<<endl;
		else
			 cout<<"NO"<<endl;  
	}
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值