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 \n",sub[i]); } sort(sub+1,sub+n); //for(int i=1;i<n;i++){ // printf("%d \n",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 \n",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("\n%d %d\n",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 \times(n-1)\times...\times2\times1\)
#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(n\geq 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("\n"); //} 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; }