排序的题目
问题 H: 整数奇偶排序
因为此题目在奇偶排序的基础上要去奇数和偶数的排序相反,不宜采用奇偶排序(快排变体代码),应分开排序,分开输出。
//题解代码(多点测试)
#include<cstdio>
#include<algorithm>
using namespace std;
bool cmp(int x,int y){
return x>y;
}
int main(){
int n,odd[12],even[12];
while(~scanf("%d",&n)){ //或者scanf("%d",&n)!=EOF
int a=0,b=0;
if(n%2==0)
even[a++]=n;
else
odd[b++]=n;
for(int i=0;i<9;i++){
scanf("%d",&n);
if(n%2==0)
even[a++]=n;
else
odd[b++]=n;
}
sort(even,even+a);
sort(odd,odd+b,cmp);
for(int i=0;i<b;i++)
printf("%d ",odd[i]);
for(int i=0;i<a;i++)
{
printf("%d",even[i]);
if(i!=a-1) printf(" ");
}
printf("\n");
}
return 0;
}
数学的问题
数字拆分:数字<->数组
//数字转数组
void to_array(int n, int num[]){
//这里函数形参传的是数组名,即传地址,对实参数组的值发生的改变,
//如果不想数组的改变形参使用const int num[]
for(int i=0;i<n;i++){
num[i]=n%10;
n/=10;
}
}
//数组转数字
int to_number(int num[],int n){
int sum=0;
for(int i=0;i<n;i++)
sum=sum*10+num[i];
return sum;
}
最大公约数与最小公倍数
int gcd(int a,int b){
if(b==0) return a;
else gcd(b,a%b);
}//求最大公约数
int lcm(int a, int b){
int tmp=gcd(a,b);
return a/tmp*b;
}//最小公倍数
求三位数及以上的最大公约数与最小公倍数:先求两个数的公约数或公倍数,再求该公约数或公倍数与其他数的公约数或功能公倍数。
守形数:数字->数组
使用sprintf()将数字转化成字符数组
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
char a[10],b[10];
while(~scanf("%d",&n)){
int sqr=n*n;
sprintf(a,"%d",n);
sprintf(b,"%d",sqr);
int len=strlen(b)-1;
bool flag=true;
for(int i=strlen(a)-1;i>=0;i--){
if(a[i]!=b[len--]){
flag=false;
break;
}
}
if(flag) printf("Yes!\n");
else printf("No!\n");
}
return 0;
}
活用递归
double y(int n){
if(n==0) return x;
else{
return y(n-1)*(2.0/3.0)+x/(3*y(n-1)*y(n-1));//错误写法,会超时,正确写法如下
}
}
#include<bits/stdc++.h>
using namespace std;
double x;//注意x定义为全局变量
double y(int n){
if(n==0) return x;
else{
double tmp=y(n-1);//防止超时
return tmp*(2.0/3.0)+x/(3*tmp*tmp);
}
}
int main(){
int n;
while(~scanf("%lf%d",&x,&n)){
printf("%.6f\n",y(n));
}
return 0;
}