2021-3-27 【数据结构-起步能力自测题】【】

每日三百行代码 第二十二天

在这里插入图片描述

#include<stdio.h>
int main()
{
	int i,j=1,x=0,y=0,rest,N;
	char C;
	scanf("%d %c",&N,&C);
	while(2*j*j-1<=N)//计算层数
	{
		j++;
	}
	j--;
	y=2*j-1;	
	rest=N-2*j*j+1;//剩下字符的数量
	while(y>0)//输出沙漏上半部分
	{
		for(i=0;i<x;i++)
			printf(" ");
		for(i=0;i<y;i++)
			printf("%c",C);
		printf("\n");
		x++;
		y-=2;
	}
	x--;
	y+=2;
	while(x>0)//输出沙漏下半部分
	{
		x--;
		y+=2;
		for(i=0;i<x;i++)
			printf(" ");
		for(i=0;i<y;i++)
			printf("%c",C);
		printf("\n");	
	}
	printf("%d",rest);
	return 0;
}


在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,i,j,flag,k,sum=0,w=0;
    int a[112345];
    a[0]=2;
    scanf("%d",&n);
    for(i=3; i<=n; i++)
    {
        flag=1;
        k=sqrt(i);
        for(j=2; j<=k; j++){
            if(i%j==0){
                flag=0;
                break;
            }
        }
        if(flag){
            a[++w]=i;
        }
    }
    for(i=0; i<=w; i++)
    {
        if(a[i+1]-a[i]==2)
        {
            sum++;
        }
    }
    printf("%d",sum);
}
#include<bits/stdc++.h>
using namespace std;

bool judge(int n)
{
	if(n<=1) return false;
	int sqrtN=sqrt(1.0*n);
	for(int i=2;i<=sqrtN;i++)
	{
		if(n%i==0) return false;
	}
	return true;
}
int main()
{
	int n,cnt=0;
	scanf("%d",&n);
	for(int i=2;i<=n;i++)
	{
		if(judge(i)&&judge(i-2))
			cnt++;
	}
	printf("%d\n",cnt);
	return 0;
}

在这里插入图片描述

#include <stdio.h>

int main() {
	int n, m;
	int i, j;
	int k;
	scanf("%d %d", &n, &m);
	int a[n];
	for (i = 0; i < n; i++) {
		scanf("%d", &a[i]);
	}
	for (j = 0; j < m; j++) {
		k = a[n - 1];
		for (i = n - 1; i > 0; i--) {
			a[i] = a[(i - 1 + n) % n];
		}
		a[0] = k;
	}
	for (i = 0; i < n; i++) {
		if (i == n - 1)
			printf("%d", a[i]);
		else
			printf("%d ", a[i]);
	
	}
	printf("\n");
	return 0;
}

在这里插入图片描述
翻译:请注意,编号 123456789 是一个 9 位数字,正好由 1 到 9 的数字组成,没有重复。翻倍,我们将获得246913578,这恰好是另一个9位数字,正好由1到9的数字组成,只有在不同的排列中。检查,看看结果,如果我们再次加倍!

现在,你应该检查是否有更多的数字与这个属性。即将给定数字翻倍K数字,你要告诉,如果由此产生的数字只包括数字在原始数字的排列。

输入规范:
每个输入包含一个测试案例。每个案例包含一个不超过 20 位数字的正整数。

输出规格:
对于每个测试案例,如果输入数字翻倍仅包含原始数字中数字的排列,则首先打印在行"是"中,如果没有,则第一次打印为"否"。然后在下一行中,打印双倍的数字。

#include <stdio.h>
#include <string.h>
//大数乘法
#define MAX 30
char num[MAX];
int res[MAX]={0};
//这里易错,要11位
char a1[11] = "0000000000";
char a2[11] = "0000000000";


int main() {
//方便输入
    scanf("%s", num);
    int len = strlen(num);
    int temp, carry = 0, index;
    for(int j=len-1, m=0; len>=0; --len, --j, ++m) {
    //这个分支保证可以最高位可以进位
        if(len==0) {
            temp = carry;
        }
        else {
            temp = (int)(num[j]-'0')*2 + carry;
        }
        res[m] = temp%10;
        carry = temp/10;
    }
    //去除前导0,得到index
    for(index=MAX-1; index>=0; --index) {
        if(res[index]!=0) break;
    }
    //下面两个循环比较,桶~~
    for(int i=0; i<strlen(num); ++i) {
        ++a1[(int)(num[i]-'0')];
    }
    for(int i=0; i<=index; ++i) {
        ++a2[res[i]];
    }
    //注意考虑0的情况
    if(strcmp(a1,a2)==0 || strcmp(num, "0")==0) 
        printf("Yes\n");
    else
        printf("No\n");

    if(strcmp(num, "0")==0) {
        printf("0");
    }
    else {
        while(index>=0) {
            printf("%d", res[index]);
            --index;
        }   
    }
    return 0;
}

#include<stdio.h>
int main()
{
    int ch1[21], ch2[22] = { 0 };
    char temp;
    int i = 0, num[10] = { 0 };
    while ((temp = getchar()) != '\n')
    {
        ch1[i] = temp - '0';
        i++;
        num[(temp - '0')]++;
    }
    int i2 = 21;
    ch2[i2] = (ch1[i-1] * 2) % 10;
    i2--;
    int j = i - 2;
    for (; j >= 0; j--)
    {
        int buf = ch1[j + 1] * 2 / 10 + ch1[j] * 2 % 10;
        ch2[i2] = buf;
        i2--;
    }
    ch2[i2] = ch1[j + 1] * 2 / 10;
    if(ch2[i2]!=0)
    i2--;
    for (int k = 21; k > i2; k--)
    {
        num[ch2[k]]--;
    }
    int flag = 0;
    for (int i = 0; i < 10; i++)
    {
        if (num[i] != 0)
        {
            printf("No\n");
            flag = 1;
            break;
        }
    }
    if(flag==0)
    printf("Yes\n");
    int k = 0;
    while (ch2[k] == 0)
    {
        k++;
    }
    for (; k < 22; k++)
    {
        printf("%d", ch2[k]);
    }
    return 0;
}


#include<bits/stdc++.h>
using namespace std;

int ht[10]={0};
string DoubleS(string str)
{
	int temp=0,r,carry=0;
	string result="";
	for(int i=str.size()-1;i>=0;i--)
	{
		ht[str[i]-'0']++;
		r=(str[i]-'0')*2+carry;
		carry=r/10;
		ht[r%10]--;
		result+=(r%10+'0');
	}
	if(carry!=0) 
	{
		result+=(carry+'0');
		ht[carry]--;
	}
	reverse(result.begin(),result.end());
	return result;
}
int main()
{
	string ori,res;
	cin>>ori;
	res=DoubleS(ori);
	bool flag=true;
	for(int i=0;i<res.size()&&flag;i++)
	{
		if(ht[i]!=0) flag=false;
	}
	if(flag) cout<<"Yes\n";
	else cout<<"No\n";
	cout<<res<<endl;
	return 0;
}

在这里插入图片描述

#include<stdio.h>
#include<string.h>
int main()
{
    char card1[54][4] = { "S1","S2","S3","S4","S5","S6","S7","S8","S9","S10","S11","S12","S13",
    "H1","H2","H3","H4","H5","H6","H7","H8","H9","H10","H11","H12","H13",
    "C1","C2","C3","C4","C5","C6","C7","C8","C9","C10","C11","C12","C13",
    "D1","D2","D3","D4","D5","D6","D7","D8","D9","D10","D11","D12","D13",
    "J1","J2" }, card2[54][4] = {};
    int n, shuffle[54];
    scanf("%d\n", &n);
    for (int i = 0; i < 54; i++)
    {
        scanf("%d", &shuffle[i]);
    }
    for (int i = 1; i <= n; i++)
    {
        if (i % 2 == 1)
        {
            for (int j = 0; j < 54; j++)
            {
                strcpy(card2[shuffle[j] - 1], card1[j]);
            }
        }
        if (i % 2 == 0)
        {
            for (int j = 0; j < 54; j++)
            {
                strcpy(card1[shuffle[j] - 1], card2[j]);
            }
        }
    }
    if (n % 2 == 1)
    {
        printf("%s", card2[0]);
        for (int i = 1; i < 54; i++)
            printf(" %s", card2[i]);
    }
    else
    {
        printf("%s", card1[0]);
        for (int i = 1; i < 54; i++)
            printf(" %s", card1[i]);
    }
    return 0;
}

#include <stdlib.h>
#include <stdio.h>
 
int main(){
	int a[55],b[55],c[55];
	int i,j,count,m,n;
	scanf("%d",&count);
	for(i=0;i<54;i++){
		a[i] = i+1;
		//printf("%d ",a[i]);                //创建1-54的数字列表a,对应54张卡牌 
	}
	//printf("\n");
	
	for(i=0;i<54;i++){
		scanf("%d",&b[i]);                 //输入排列顺序,存储在b数组内 
		//printf("%d ",b[i]);
	}
	//printf("\n");
	
	for(i=0;i<54;i++){
		b[i] = b[i]-1;                     //顺序数全部减一,方便对应数组中的下标值 
		//printf("%d ",b[i]);
	}
	//printf("\n");
	
	for(j=0;j<count;j++){
		for(i=0;i<54;i++){
			c[b[i]]=a[i];                    //循环赋值count次,得出洗牌后的卡牌数值 
		} 
		for(i=0;i<54;i++){
			a[i] = c[i];
		}
	}
	for(i=0;i<54;i++){
		//printf("%d ",c[i]);
		
		m = c[i]/13;
		n = c[i]%13;
		if(n==0){
			n=13;
			m--;
		}
		if(m==0){
			printf("S%d",n);
		}else if(m==1){
			printf("H%d",n);
		}else if(m==2){
			printf("C%d",n);
		}else if(m==3){
			printf("D%d",n);
		}else if(m==4){
			printf("J%d",n);
		}
		if(i != 53){
			printf(" ");
		}
		
	}
	
	return 0;
} 
//zc-5
#include <stdio.h>

typedef struct PK{
	char c;
	int i;
}P;

int main ( void )
{
	int k, i, j;
	P p[54];
	scanf( "%d", &k ); 
	int a[54];
	for( i = 0; i < 54; i++ )
		scanf( "%d", &a[i] );
	for( i = 0; i < 54; i++ ){
		if( i < 13 ){
			p[i].c = 'S';
			p[i].i = i % 13 + 1;
		}
		else if( i < 26 ){
			p[i].c = 'H';
			p[i].i = i % 13 + 1;
		}
		else if( i < 39 ){
			p[i].c = 'C';
			p[i].i = i % 13 + 1;
		}
		else if( i < 52 ){
			p[i].c = 'D';
			p[i].i = i % 13 + 1;
		}
		else{
			p[i].c = 'J';
			p[i].i = i % 13 + 1;
		}
	}

	for( j = 0; j < k; j++ )
	{
		P s1[54];
		for( i = 0; i < 54 ; i++ )
			s1[ a[i] - 1 ] = p[i];
		for( i = 0; i < 54; i++ )
			p[i] = s1[i];
	}
	for( i = 0; i < 54; i++ ){
		if( i != 53 )
			printf( "%c%d ", p[i].c, p[i].i );
		else
			printf( "%c%d", p[i].c, p[i].i );
	}
	return 0;	
}

#include<bits/stdc++.h>
using namespace std;
char s1[5]={'S','H','C','D','J'};
int main(){
	int card1[55],n,operate[55],card2[55]={0};
	for(int i=1;i<55;i++){
		card1[i]=i;
	}
	scanf("%d",&n);
	for(int i=1;i<55;i++){
		scanf("%d",&operate[i]);
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<55;j++){
			card2[operate[j]]=card1[j];
		}
		for(int k=1;k<55;k++){
			card1[k]=card2[k];
		}
	}
	for(int i=1;i<55;i++){
		if(i!=1){
			printf(" ");
		}
		card2[i]--;
		printf("%c%d",s1[card2[i]/13],card2[i]%13+1);
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eternity_GQM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值