F.奇偶交换
思路:对于串中的每一个数字,如果它是奇数(偶数)的话,无论它怎么交换,之前在它前面的奇数(偶数)还是在它前面,所以你可以把奇数和偶数分离出来,顺序还是和它在原串中的奇数(偶数)顺序不变,然后进行偶数和奇数比较,小的就先输出来
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn=300005;
char s[maxn];
int p[maxn],q[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(s,0,sizeof(s));
memset(p,0,sizeof(p));
memset(q,0,sizeof(q));
scanf("%s",s);
int m=strlen(s);
int k=0,l=0;
for(int a=0;a<m;a++)
{
if((s[a]-'0')%2)
{
p[k++]=s[a]-'0';
}
else
{
q[l++]=s[a]-'0';
}
}
int i=0,j=0;
for(int a=0;a<m;a++)
{
if(i==k)
{
for(int b=j;b<l;b++)
{
printf("%d",q[b]);
}
break;
}
if(j==l)
{
for(int b=i;b<k;b++)
{
printf("%d",p[b]);
}
break;
}
if(p[i]>=q[j])
{
printf("%d",q[j]);
j++;
}
else
{
printf("%d",p[i]);
i++;
}
}
printf("\n");
}
return 0;
}
G.聚餐
思路:类似于素数筛选的算法,比如n%2==0,表示2和n不互素,那么2的倍数和n都有2这个公因数,也不会互素,然后把2的倍数全都标记,这个算法类似于素数筛选
#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
int n;
int vis[33000];
void solve()
{
memset(vis,0,sizeof(vis));
vis[1]=0;
for(int i=2;i<=n;i++)
{
if(!vis[i])
{
if(n%i==0)
{
for(int j=i;j<=n;j+=i)
{
vis[j]=1;
}
}
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
int sum=0;
solve();
for(int i=1;i<=n;i++)
{
if(!vis[i])
sum++;
}
printf("%d\n",sum);
}
return 0;
}
J.大数加法的模板题
#include <iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
using namespace std;
char v[105],s[105];
int x[105],y[105],z[105];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(x,0,sizeof(x));
memset(y,0,sizeof(y));
memset(z,0,sizeof(z));
scanf("%s",v);
scanf("%s",s);
int a=strlen(v),b=strlen(s);
int c=max(a,b);
for(int i=a-1,j=0;i>=0;i--)
{
x[j++]=v[i]-'0';
}
for(int i=b-1,j=0;i>=0;i--)
{
y[j++]=s[i]-'0';
}
for(int i=0;i<c;i++)
{
z[i]+=x[i]+y[i];
if(z[i]>=10)
{
z[i+1]=z[i]/10;
z[i]=z[i]%10;
}
}
int j=0;//如果前导为0,那么j=0,然后就一直向下判断,直到j=1时表示前导不为0的数然后剩余的全部输出即可
for(int i=c;i>=0;i--)
{
if(z[i]!=0)
{
j=1;
}
if(j==1)
printf("%d",z[i]);
}
printf("\n");
}
return 0;
}