首页 > 其他分享 >中南大学(CSU)OJ 填充立方体(10分)

中南大学(CSU)OJ 填充立方体(10分)

时间:2024-12-30 22:26:15浏览次数:3  
标签:10 OJ 中南大学 ++ int while printf 立方体 句子

        孩子们,我想你们了。今天带来的题目有点难,情景有点复杂,但是我相信你们在看完我的思路和代码后一定会有收获。

填充立方体(10分)

题目描述

期中考试小南设计的填数游戏非常有意思,于是老师要小南再设计一个新的填数游戏用于期末考试。就是用“*”画出一个立方体,并将立方体图形的三面分别按照规律填上大写字母“A”~“Z”字母、小写字母“a”~“z”和数字“1”~“9”。填充的过程按照字母和数字的顺序从上到下从左至右进行。

立方体的边长n定为多少好呢?小南让老师给出一个句子,将句子的长度len和句子中单词的个数m的最大公约数设定为立方体的边长n。例如:当老师给出的句子为“you like these things sun stars and moon”时,句子长度len为40,单词个数m为8,最大公约数为8。因此立方体的边长n为8。

注意,当n为1时,对应的立方体图形为一个星号*。同时,老师要求小南将句子中的单词颠倒顺序输出,即输出“moon and stars sun things these like you”,你能帮小南编程实现吗? 

输入

多个样例。 每个样例包含一个由字母组成的句子,句子的首尾没有多余的空格,长度不超过200,句子中的单词之间用一个空格分开。

输出

每个样例首先输出一个颠倒单词顺序的句子,然后按照填充要求输出一个正确的立方体图形。样例输出结果之间用一个空行分开。

样例输入 Copy
I do
you like these things sun stars and moon
you love csu
样例输出 Copy
do I 
 **
***
**

moon and stars sun things these like you 
       ********
      *ABCDEF**
     *GHIJKL*1*
    *MNOPQR*23*
   *STUVWX*456*
  *YZABCD*7891*
 *EFGHIJ*23456*
********789123*
*abcdef*45678*
*ghijkl*9123*
*mnopqr*456*
*stuvwx*78*
*yzabcd*9*
*efghij**
********

csu love you 
  ***
 *A**
***1*
*a**
***
#include<stdio.h>
#include<string.h>
#define R 201

int Divisor(int x, int y);		//寻找最大公约数的函数
void Paint(int x);				//画立方体的函数

int main()
{
	char a[R];
	int i, j, l, len, c, n, d;
	
	while(~scanf("%[^\n]" , a)){	// *该处解释在代码后面
		while(getchar() != '\n');
		len = strlen(a);
		for(i = 0,l = 0;i < len;i ++){
			if(a[i] == ' ')
				l ++;
		}
		l += 1;
		
		if(len == 1)
		    printf("%c\n" , a[0]);	//输入字符串只有一个则直接打印
		else{
		    for(i = len - 1,d = 0,c = 1;i >= 0;i --,d ++){	//将字符串反向输出
			    if(a[i] == ' ' && c == 1){
				    for(j = i+1;j < i+1+d;j ++)
					    printf("%c" , a[j]);
				    printf(" ");
				    c = 0;
				    d = 0;
			    }
			    if(a[i] == ' '){
				    for(j = i+1;j < i+1+d;j ++)
					    printf("%c" , a[j]);
				    d = 0;
			    }
			    if(i == 0){
				    for(j = 0;j < d;j ++)
					    printf("%c" , a[j]);
				    d = 0;
			    }
		    }
		    printf("\n");
		}
		
		n = Divisor(len, l);
		if(n == 1)
		    printf("*\n\n");
		else
		    Paint(n);
	}
	
	return 0;
}

int Divisor(int x, int y){	//寻找最大公约数使用辗转相除法(欧几里得算法)
	int a, b, t;
	a = x;
	b = y;
	
	while(b){
		t = b;
		b = a % b;
		a = t;
	}
	return a;
}

void Paint(int x){
	int up, f, i, g, k, j, down;
	char Ch, ch, h;
	up = x - 1; f = x; g = x - 2;
	
	while(up){
		printf(" ");
		up --;
	}	
	while(f){
		printf("*");
		f --;
	}
	printf("\n");
	
	Ch = 'A'; ch = 'a'; h = '1'; k = 0;
	while(g){
		for(i = 0;i < g;i ++)
			printf(" ");
		printf("*");
		for(i = 0;i < x - 2;i ++){
			if(Ch > 'Z')
				Ch -= 26;
			printf("%c" , Ch ++);
		}
		printf("*");
		for(i = 0;i < k;i ++){
			if(h > '9')
				h -= 9;
			printf("%c" , h ++);
		}
		printf("*\n");
		g --;
		k ++;	
	}
	
	f = x;
	while(f){
		printf("*");
		f --;
	}
	for(i = 0;i < x - 2;i ++){
		if(h > '9')
			h -= 9;
		printf("%c" , h ++);
	}
	printf("*\n");
	
	down = x - 2; j = x - 2; ch = 'a';
	while(j){
		printf("*");
		for(i = 0;i < x - 2;i ++){
			if(ch > 'z')
				ch -= 26;
			printf("%c" , ch ++);
		}
		printf("*");
		for(i = 0;i < j - 1;i ++){
			if(h > '9')
				h -= 9;
			printf("%c" , h ++);
		}
		printf("*\n");
		j --;
	}
	
	down = x;
	while(down){
		printf("*");
		down --;
	}
	printf("\n\n");
}

        " * "处说明:孩子们,这题“ * ”处如何处理读入多样例字符串是一个难点。普通的scanf("%s" , a);在遇到空格就会停止,显然没法读入一行句子。而fgets(a, N, stdin);函数则会一直读入直到换行符\n为止或数组元素达到N个为止,由于这一题样例输入就直接是句子,所以没法对fgets函数中的N进行调整,自然会出现读入过多或者过少的问题。

        因此这题我找到两个解决的办法,其中都需要使用scanf("%[^\n] , a);来读入字符串。[] 表示一个字符集合,^ 表示取反,\n 表示换行符,所以 %[^\n] 整体的意思是读取输入的字符,直到遇到换行符 \n 为止。但是需要注意:这种读取方式不会读取换行符。因此在输入完数据后,换行符仍然留在输入缓冲区中,这可能会影响后续的输入操作。例如,如果后续使用 scanf 或 getchar 读取下一个字符,可能会读取到这个遗留的换行符,而不是期望的数据。

        为了处理掉烦人的换行符,孩子们,我来告诉你们两种办法。

        第一种是使用while(getchar() != '\n');,其主要作用是清空输入缓冲区。程序会不断地从输入缓冲区中读取字符,直到读取到换行符 '\n' 为止,而循环体执行语句为空,不会对已读入的数据产生任何影响,从而清空缓冲区中当前行的剩余字符。当然,你不妨试试不要这一行语句,那样在OJ上答案肯定是错误的,因为除第一行字符串之外其他所有读入的字符串都乱套了。

        第二种则是将读入函数稍加修改为scanf("%[^\n]%*c", a);。%*c 是一个特殊的格式说明符:%c 表示读取一个字符,* 表示该输入项被抑制,即读取该字符但不存储它,也就是丢弃该字符。

        以上两种方法都是能处理掉烦人的字符串的方法,这些应该会对你们有所帮助。

        孩子们,这题确实比较难。不仅仅是需要完成的任务比较多,而且每一项小任务都需要注意处理细节或者运用一定的数学知识,就像计算最大公约数的函数就使用了欧几里得法,还有打印图形时将复杂的立方体简单化,将视觉上三维的立体图形转化为二维的平行四边形,这样就更方便找到其图形的规律。孩子们,题目虽难,但是只要我们耐心做好每一个小模块,就一定可以成功。Man!

标签:10,OJ,中南大学,++,int,while,printf,立方体,句子
From: https://blog.csdn.net/2401_87217723/article/details/144773818

相关文章

  • CSU中南大学OJ平台2024级C语言期末复习
        临近期末,相信还有人因OJ平台没做出来而发愁。没事的孩子们,我给你们带来了法宝,解题思路和代码。奇偶数做风车七夕节消消乐水果店问题V:奇偶数(20分)题目描述小南在网上看到了一个关于奇偶数的定义:如果一个正整数n既能拆成两个奇数之和也能拆成两个......
  • Leecode热题100——1.哈希
    1.两数之和给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。你可以按任意顺序返回答案。示例1:输入:nums=[2,7,11,15],target......
  • BHQ-3 amine|BHQ-3氨基|BHQ-3 amino|BHQ-3 NH2|CAS号:1661064-89-6
    BHQ-3amine(也称为BHQ-3氨基)是一种广泛使用的荧光猝灭剂,以下是关于BHQ-3amine的详细介绍:一、基本特性英文名称:BHQ-3amine,BHQ-3amino,BHQ-3NH2CAS号:1661064-89-6分子式:C32H36N7+分子量:518.69外观:固体,有文献指出其呈淡紫色粉末状纯度:≥95%溶解性:溶于部分有机溶液结构式:二......
  • 【Leetcode_Hot100】链表
    链表160.相交链表206.反转链表234.回文链表141.环形链表142.环形链表II21.合并两个有序链表2.两数相加19.删除链表的倒数第N个结点25.K个一组翻转链表138.随机链表的复制148.排序链表23.合并K个升序链表146.LRU缓存160.相交链表方法一:模拟依......
  • 8086汇编(16位汇编)学习笔记10.寄存器总结
    8086汇编(16位汇编)学习笔记10.寄存器总结-C/C++基础-断点社区-专业的老牌游戏安全技术交流社区-BpSend.net寄存器8086CPU有14个寄存器它们的名称为:AX、BX、CX、DX、SI、DI、SP、BP、 IP**、CS、DS、ES、**SS、PSW。8086CPU所有的寄存器都是16位的,可以存放两个字节。AX、......
  • UVA 10829
    首先发现不固定长度是困难的,所以应该枚举长度。但是如果这样了,还是得枚举起始点啊,怎么办?那么尝试看看开始位置在\(i\simi+len-1\)之间的能不能统一计算?由于我脑子不好,所以先讲讲我的假做法和蒸馍修正。考虑一个|...|...|...|的东东,我们枚举开始位置是什么区间,考虑是[...].[......
  • Neovim(文本编辑器) v0.10.2 绿色版
    Vim是一款基于Vi编辑器的文本编辑器,Neovim是Vim的一个分支,旨在解决Vim的一些缺点并提供额外特性。Neovim具有更好的性能和稳定性,支持异步插件和脚本,改进了对现代用户界面和Unicode字符的支持。Neovim可在Windows、Linux、MacOS上安装,配置遵循XDG基本目录规范。软件特色简化维护......
  • ssm实验室预约管理+vue(10871)
     有需要的同学,源代码和配套文档领取,加文章最下方的名片哦一、项目演示项目演示视频二、资料介绍完整源代码(前后端源代码+SQL脚本)配套文档(LW+PPT+开题报告)远程调试控屏包运行三、技术介绍Java语言SSM框架SpringBoot框架Vue框架JSP页面Mysql数据库IDEA/Eclipse开发四、项......
  • ssm图书馆智能选座系统设计与实现+jsp(10877)
     有需要的同学,源代码和配套文档领取,加文章最下方的名片哦一、项目演示项目演示视频二、资料介绍完整源代码(前后端源代码+SQL脚本)配套文档(LW+PPT+开题报告)远程调试控屏包运行三、技术介绍Java语言SSM框架SpringBoot框架Vue框架JSP页面Mysql数据库IDEA/Eclipse开发四、项......
  • Proj CJI Paper Reading: OffsetBias: Leveraging Debiased Data for Tuning Evaluato
    目的:reducebiasofLLMsMethod:使用GPT4生成off-topic(完全无关的话题)用GPT3.5生成遵照off-topic回答的badresponse用goodresponse,badresponse来微调模型,减少bias注意:这里off-topic不会作为用于防止注入的dataAbstract5.......