C++入门题

一:合并数字

在这里插入图片描述

#include<iostream>
#include<cmath>
using namespace std;

const int MAXN = 1e6;
int pre[MAXN],bac[MAXN];      //建立两个数组,第一个pre数组进行输入,第二个bac数组用来判断使用 
int n,i,ans = 0,temp = 0;
int main()
{
	cin>>n;
	for(i = 1;i <= n;i++)     //输入pre数组 
		cin>>pre[i];
	bac[temp] = -5;       //这里的bac数组先输入一个值,只要保证这个值比 -1 小就行,方便第一次循环时,给bac[1]赋上值 
	for(i = 1;i <= n;i++)
	{
		if(abs(bac[temp] - pre[i])==1)
		{
			ans++;
			if(bac[temp] > pre[i])     //如果bac[temp]大于pre[i]的话,需要再比较bac[temp-1]与pre[i]的值的大小 
			{                          //如果pre[i]大的话,应该比较bac[temp]与pre[i+1]的大小 
				temp--;
				i--;                   //i--之后通过for循环还需要i++,这样是为了保证i的值还是当前值,让当前i对应的pre的值与bac[temp-1]的值做比较 
			}
		}
		else
			bac[++temp] = pre[i];   //如果相邻两个数的差的绝对值不等于 1 的话,就在bac数组中再加入pre数组对应的i的值 
	}
	cout<<ans<<endl;
	return 0;
}

参考链接:https://blog.csdn.net/Little_boy_z/article/details/79705220

二:判断素数

在这里插入图片描述
这题的题意是输入一列数字,判断它是否为素数,如果是的话,返回yes,不是返回no,题目规定的1和2不是素数
在这里插入图片描述
这是该题要求的输出格式

方法一

编写一个函数,对输入的数x从2到x-1进行循环,依照题的意思,1和2需要输出no,用函数的返回值进行判断。

#include<iostream>
using namespace std;

int isprime(int x)
{
	int i;
	if(x==2 || x==1) return 0;
	for(i=2;i<=x/2;i++)
		if(x%i==0) return 0;
	return 1;
}
int main()
{
	int a,temp=0;
	while(scanf("%d",&a)!=EOF)
	{
		temp += 1;
		if(a<=0) break;
		if(isprime(a)) cout<<temp<<": "<<"yes"<<endl;
		else cout<<temp<<": "<<"no"<<endl;
	}
	return 0;
}

方法二

针对方法一的isprime()函数进行优化,对于一个正整数x,如果用2到x的平方根之间的整数除x,如果可以整除的话,就代表x不是素数,这里的平方根可以换种表达形式只需要使 i*i<=x 即可

#include<iostream>
using namespace std;

int isprime(int x)
{
	int i;
	if(x==2 || x==1) return 0;
	for(i=2;i*i<=x;i++)
		if(x%i==0) return 0;
	return 1;
}
int main()
{
	int a,temp=0;
	while(scanf("%d",&a)!=EOF)
	{
		temp += 1;
		if(a<=0) break;
		if(isprime(a)) cout<<temp<<": "<<"yes"<<endl;
		else cout<<temp<<": "<<"no"<<endl;
	}
	return 0;
}

方法三

除了开始的2和3,其余的素数都是在6的倍数的左右,例如5,7,11,所以可以简化一下,只需要寻找六的倍数,然后判断其左右是否为素数。

#include<iostream>
using namespace std;
const int MAXN = 1e6;
int pre[MAXN];
int k;

int isprime(int x)
{
	for(int i = 2;i*i<=x;i++)
		if(x%i==0) return 0;
	return 1;
}

int main()
{

	int a,temp;
	for(int i=0;i<MAXN;i++)      //给数组赋上1e6个值,当值为1,代表当前数值为素数,为0代表不是素数 
		pre[i] = 0;
	pre[2] = pre[3] = 1;
	for(int i = 1;i*6<=MAXN;i++)                 //1e6内所有的素数 
	{
		k = i * 6;
		if(isprime(k-1)==1) pre[k-1] = 1;
		if(isprime(k+1)==1) pre[k+1] = 1;	
	}
	while(scanf("%d",&a)!=EOF)
	{
		temp += 1;
		if(a<=0) break;
		if(isprime(a)) cout<<temp<<": "<<"yes"<<endl;
		else cout<<temp<<": "<<"no"<<endl;
	}
	return 0;
}

三:Game 23

在这里插入图片描述

在这里插入图片描述

给定两个数n和m,每次只能乘2或者乘3,看能否得到m。

#include<iostream>
using namespace std;

int n,m,ans=0,temp;

int nums(int x)
{
	while(x%2==0)
	{
		x = x/2;
		ans++;
	}
	while(x%3==0)
	{
		x = x/3;
		ans++;
	}
	if(x==1) return ans;
	else return -1;
}

int main()
{
	cin>>n>>m;
	if(m%n!=0)
	{
		cout<<-1<<endl;
		return 0;
	}
	else
	{
		temp = m/n;
		if(nums(temp)==-1)
		{
			cout<<-1<<endl;
			return 0;	
		}
		else 
		{
			cout<<ans<<endl;
			return 0;	
		}	
	}
	return 0;
}

这种代码太过冗长,可以再改进一下,遍历{2,3},只要满足取模等0,就一直循环。

四:WeirdSort

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
输入一组数,并给出指定的索引值,能否通过指定的索引值得出一个递增的数列,输出YES,否则输出NO.
这道题可以反过来,利用给定的索引,使数组在指定索引处的大小顺序一致,在遍历整个数组,判断这个数组是不是递增的数组。

#include<iostream>
#include <algorithm>
using namespace std;
const int MAXN = 1e6;
int pre[MAXN],bac[MAXN];
int t,n,m;
bool sort()        //利用布尔函数进行判断
{
	int cnt;
	while(true)    //重复循环,避免出现下一个相邻数的大小顺序改变
	{
		cnt = 0;
		for(int i=1;i<=m;i++)
		{
			int idx = bac[i];
			if(pre[idx] > pre[idx+1])
			{
				swap(pre[idx],pre[idx+1]);     //swap函数完成两个数的交换
				cnt = 1;			
			}
		}
		if(cnt==0) break;
	}
	for(int i = 1;i<n;i++)         //判断交换完后的数组是否是一个递增的数组
		if(pre[i] > pre[i+1])
			return false;
	return true;
}

int main()
{
	cin>>t;
	while(t--)
	{
		cin>>n>>m;
		for(int i=1;i<=n;i++) cin>>pre[i];
		for(int i=1;i<=m;i++) cin>>bac[i];
		if(sort()) printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}

五:Integer divisibilite

在这里插入图片描述

在这里插入图片描述
如果一个数不能被2和5整除的话,那么这个数一定存在一个序列,这个序列能够被这个数整除。
这个题需要考虑这个序列会超出范围,所以选用long long 类型。
下面这种算法超时,

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
ll T,n,cnt,num,ans,temp;
ll choose()
{
	ans = 0,num=0;
	while(true)
	{
		ans = ans*10 + cnt;
		num += 1;
		if(ans%n==0)
			break;
	}
	return num;
}
int main()
{
	cin>>T;
	while(T--)
	{	
		temp++;
		cin>>n>>cnt;
		num = choose();
		cout<<"Case "<<temp<<": "<<num<<endl;
	}
	return 0;
}
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
ll T,n,cnt,num,ans,temp;
ll choose()
{
	ans = 0,num=0;
	while(true)
	{
		ans = (ans*10 + cnt)%n;
		num += 1;
		if(ans==0)
			break;
	}
	return num;
}
int main()
{
	cin>>T;
	while(T--)
	{	
		cin>>n>>cnt;
		num = choose();
		cout<<"Case "<<++temp<<": "<<num<<endl;
	}
	return 0;
}
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值