• Openjudge 1.6 一位数组


    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;
    } 
    
    要做就做南波万
  • 相关阅读:
    【转载】使用铁哥SmartFlash快速开发方案:66行代码搞定抽奖程序!
    WPF 数据绑定方法分类
    jquerywebsocket
    [转载]as3中单例模式如何设计
    .字符的匹配识别
    paip.提升用户体验搜索功能设计
    paip.提升安全性登录密码出错次数检测
    paip.html 及css调试工具debugbar
    paip.项目开发效率提升之思索
    paip.c#图片裁剪
  • 原文地址:https://www.cnblogs.com/liuziwen0224/p/11991550.html
Copyright © 2020-2023  润新知