2022.12.27日总结

题目1    自然数的拆分

任何一个大于 1 的自然数 n,总可以拆分成若干个小于 n 的自然数之和。现在给你一个自然数 n,要求你求出 n 的拆分成一些数字的和。每个拆分后的序列中的数字从小到大排序。然后你需要输出这些序列,其中字典序小的序列需要优先输出。数据保证1≤n≤8。

 分析

该题思路清晰,题目易理解,就是简单的拆分求和问题,可以使用暴力枚举法和dfs,这题适合刚学习dfs的人测试其用法

#include<stdio.h>  //dfs

int n, p[11]={1}, cnt=1, m;

void print(int x){
	for(int i=1; i<x; i++)
        printf("%d+",p[i]);
printf("%d\n",p[x]);
}

void dfs(int a){
	for(int i=p[a-1]; i<=m; i++){
		if(i==n) continue;
		p[a]=i;
		m-=i;
		if(m==0) print(a);
		else dfs(a+1);
		m+=i;
	}
}
int main(){
    scanf("%d",&n);
	m=n;
	dfs(1);
	return 0;
}
#include<stdio.h>//暴力枚举法
int n;
int main()
{
	scanf("%d",&n);
	if(n==1)printf("\n");
		else if(n==2)printf("1+1\n");
			else if(n==3)printf("1+1+1\n1+2\n");
				else if(n==4)printf("1+1+1+1\n1+1+2\n1+3\n2+2\n");
					else if(n==5)printf("1+1+1+1+1\n1+1+1+2\n1+1+3\n1+2+2\n1+4\n2+3\n");
						else if(n==6)printf("1+1+1+1+1+1\n1+1+1+1+2\n1+1+1+3\n1+1+2+2\n1+1+4\n1+2+3\n1+5\n2+2+2\n2+4\n3+3\n");
							else if(n==7)printf("1+1+1+1+1+1+1\n1+1+1+1+1+2\n1+1+1+1+3\n1+1+1+2+2\n1+1+1+4\n1+1+2+3\n1+1+5\n1+2+2+2\n1+2+4\n1+3+3\n1+6\n2+2+3\n2+5\n3+4\n");
								else printf("1+1+1+1+1+1+1+1\n1+1+1+1+1+1+2\n1+1+1+1+1+3\n1+1+1+1+2+2\n1+1+1+1+4\n1+1+1+2+3\n1+1+1+5\n1+1+2+2+2\n1+1+2+4\n1+1+3+3\n1+1+6\n1+2+2+3\n1+2+5\n1+3+4\n1+7\n2+2+2+2\n2+2+4\n2+3+3\n2+6\n3+5\n4+4\n");
	return 0;
}

题目2   字符串改造

一个字符串,存放在一个数组中,编程序将其改造之后输出:
(1)将S的所有第偶数个字符按照从大到小的次序放在S的后半部分;
(2)将S的所有第奇数个字符按照从小到大的次序放在S的前半部分;


分析

利用3个数组一个主,2个辅,辅的一个存奇数,一个存偶数,再按要求冒泡排序即可,最后输出时利用字符串函数strcpy复制到主数组里面,和strcat将另外一个连接到主数组里面即可。

/*一个字符串,存放在一个数组中,编程序将其改造之后输出:
(1)将S的所有第偶数个字符按照从大到小的次序放在S的后半部分;
(2)将S的所有第奇数个字符按照从小到大的次序放在S的前半部分;*/
#include<stdio.h>
#include<string.h>
char a[20],b[10],c[10];
int i,j;
int x=0,y=0,z=0;
char ch;
int main()
{
    gets(a);
    while(a[i]!=0)
    {
        if(i%2==0)
            b[x++]=a[i];//存奇数(从小到大)
        else c[y++]=a[i];//存偶数(大到小)
        i++;
    }
    for(i=0;i<x-1;i++)
    {
        for(j=0;j<x-1-i;j++)
        {
            if(b[j]>b[j+1])
               {
                    ch=b[j];
                    b[j]=b[j+1];
                    b[j+1]=ch;
               }

        }
    }
    for(i=0;i<x-1;i++)
    {
        for(j=0;j<x-1-i;j++)
        {
            if(c[j]<c[j+1])
               {
                    ch=c[j];
                    c[j]=c[j+1];
                    c[j+1]=ch;
               }

        }
    }
 memset(a,0,20);
    strcpy(a,b);
    strcat(a,c);
    puts(a);
}

题目3    你要乘坐的飞碟在这里

一个众所周知的事实,在每一慧星后面是一个不明飞行物UFO。 这些不明飞行物时常来收集来自在地球上忠诚的支持者。 不幸地,他们的空间在每次旅行只能带上一群支持者。 他们要做的是用一种聪明的方案让每一个团体人被慧星带走。 他们为每个慧星起了一个名字,通过这些名字来决定一个团体是不是特定的慧星带走。 那个相配方案的细节在下面被给出; 你的工作要写一个程序来通过团体的名字和彗星的名字来决定一个组是否应该与在那一颗慧星后面的不明飞行物搭配。团体的名字和慧星的名字都以下列各项方式转换成一个数字: 这个最后的数字代表名字中所有字母的信息,"A" 是 1 和 "Z" 是 26。举例来说,团体 "USACO" 会是 21*19*1*3*15=17955 。 如果团体的数字 mod 47 等于慧星的数字 mod 47,那么你要告诉这个团体准备好被带走 ! 写一个程序读入慧星的名字和团体的名字,如果搭配打印"GO"否者打印"STAY" 团体的名字和慧星的名字将会是没有空格或标点的一串大写字母(不超过6个字母)

分析 

题目很长,没看懂题目意思就很难,看懂就很简单,就是2组字符串的中每个字符比‘A’-1的ASCII码

值大的值的乘积,如果这个2组最终的积除以47的余数相等,就输go,else输出stay。

#include<stdio.h>
#include<string.h>
char a[7],b[7],ch;
int len1,len2,x=1,y=1,i;
int main(){
	gets(a);
	gets(b);
	len1=strlen(a);
	len2=strlen(b);

	for(i=0;i<len1;i++){
		ch=a[i];
		x*=(ch-'A'+1);
	}

	for(i=0;i<len2;i++){
		ch=b[i];
		y*=(ch-'A'+1);
	}

	if(x%47==y%47)
		printf("GO\n");
	else
		printf("STAY\n");
	return 0;
}


总结

dfs还不是很熟悉,字符串知识点有点遗忘,去补点知识。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值