一:合并数字
#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;
}