1.6.7 有趣的跳跃
有关于数组的排序(sort)
#include <cstdio>
#include <cstring>
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
int n;
scanf("%d",&n);
if(n==1){
printf("Jolly");
return 0;
}
int a[n+5];
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
int sub[n+5];
for(int i=1;i<n;i++){
sub[i]=abs(a[i+1]-a[i]);
//printf("%d
",sub[i]);
}
sort(sub+1,sub+n);
//for(int i=1;i<n;i++){
// printf("%d
",sub[i]);
//}
sub[0]=0;
int j=0;
bool q=1;
while(sub[j+1]-sub[j]==1){
if(j+1==n-1) {
q=0;
break;
}
j++;
}
if(q==0) printf("Jolly");
else printf("Not jolly");
return 0;
}
注意:
1.检查的时候多输出的部分提交的时候要注释掉(要不然自己都不知道错在哪)
2.核心部分循环的起点和终点找不准的时候要多试,如:
sub[0]=0;//一开始没加,会导致有的数据对而有的不对
int j=0;//避免两个数的时候错误特判
bool q=1;
while(sub[j+1]-sub[j]==1){
if(j+1==n-1) {
q=0;
break;
}
j++;
}
1.6.8 石头剪刀布
先对一个序列进行填充,使用语句:
for(int i=0;i<N;i++){
if(i>=NA) k1[i]=k1[i%NA];
}
for(int i=0;i<N;i++){
if(i>=NB) k2[i]=k2[i%NB];
}
填充之后诸位比较就可以了
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
int main(){
int N=0,NA=0,NB=0;
scanf("%d%d%d",&N,&NA,&NB);
int k1[N+1],k2[N+1];
int m=0,n=0;
for(int i=0;i<NA;i++){
scanf("%d",&k1[i]);
}
for(int i=0;i<NB;i++){
scanf("%d",&k2[i]);
}
for(int i=0;i<N;i++){
if(i>=NA) k1[i]=k1[i%NA];
}
for(int i=0;i<N;i++){
if(i>=NB) k2[i]=k2[i%NB];
}
//for(int i=0;i<N;i++){
// printf("%d %d
",k1[i],k2[i]);
//}
for(int i=0;i<N;i++){
if((k1[i]==5&&k2[i]==0)||(k1[i]==2&&k2[i]==5)||(k1[i]==0&&k2[i]==2)) m++;
if((k2[i]==5&&k1[i]==0)||(k2[i]==2&&k1[i]==5)||(k2[i]==0&&k1[i]==2)) n++;
}
//printf("
%d %d
",m,n);
if(m==n) printf("draw");
else if(m>n) printf("A");
else printf("B");
return 0;
}
1.6.10 高精度加法(复习)
可能有多余的前导0
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iostream>
using namespace std;
char ansa[205],ansb[205];
int ansaa[205],ansbb[205];
int numans[210];
int ans,k,t,lenm,len1,len2;
int main( ){
scanf("%s",ansa+1);
scanf("%s",ansb+1);
len1=strlen(ansa+1);
len2=strlen(ansb+1);
for(int i=1,j=len1;i<=len1;i++,j--) ansaa[i]=ansa[j]-'0';
for(int i=1,j=len2;i<=len2;i++,j--) ansbb[i]=ansb[j]-'0';
lenm=max(len1,len2);
for(int i=1;i<=lenm;i++){
numans[i]+=ansaa[i]+ansbb[i];
if(numans[i]>=10){
numans[i+1]++;
numans[i]%=10;
}
}
lenm++;
while(numans[lenm]==0){
lenm--;
if(lenm==-1){
cout<<"0";
}
}
for(int i=lenm;i>=1;i--){
printf("%d",numans[i]);
}
return 0;
}
1.6.15 阶乘和
用高精度输出(S=1!+2!+...+n!(n leq 50)),其中(n!=n imes(n-1) imes... imes2 imes1)
#include<bits/stdc++.h>
using namespace std;
int a[10001]={1};
int ans[100001]={0};
char n[1001];
int en[1001];
int lans=1;
int la=1;
int x;
int main()
{
int n;
cin>>n;
int x=0;
for(int i=1;i<=n;i++)
{
memset(a,0,sizeof(a));
a[0]=1;
for(int k=1;k<=i;k++)
{
for(int j=0;j<la;j++)
{
a[j]=a[j]*k+x;
x=a[j]/10;
if(x>0&&j==la-1)
la++;
a[j]=a[j]%10;
}
}
int l=0;
x=0;
while(l<=la||l<=lans) {
ans[l]=ans[l]+a[l]+x;
x=ans[l]/10;
if(x>0)lans++;
ans[l]=ans[l]%10;
l++;
}
}
int flag=0;
for(int i=lans;i>=0;i--){
if(ans[i]==0&&flag==0) continue;
else flag=1;
cout<<ans[i];
}
return 0;
}
对于阶乘的问题:
全排列 P1706:搜索P1706
给定正整数(n(ngeq 1)),输出(1)到(n)的全部排列方式
一共有(n!)种
注:加注释部分是八皇后的写法,ans是答案,但是没有高精度,也可以表示阶乘
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int a[25];
bool vis[25];
int n;
int ans=0;
void f(int x){
if(x==n+1){
ans++;
//if(ans<=3){
for(int i=1;i<=n;i++){
printf("%5d",a[i]);
}
printf("
");
//}
return;
}
for(int i=1;i<=n;i++)
{
if(vis[i]==1) continue;
bool q=1;
//for(int j=1;j<x;j++)
//{
// if(abs(x-j)==abs(i-a[j])){
// q=0;
// break;
// }
//
//}
if(q){
vis[i]=1;
a[x]=i;
f(x+1);
vis[i]=0;
}
}
return ;
}
int main( ){
scanf("%d",&n);
f(1);
printf("%d",ans); //...
return 0;
}