1 条题解

  • 0
    @ 2025-8-24 22:13:47

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar MZY666
    「It's time to see what I can do_To test the limits and break through.」

    搬运于2025-08-24 22:13:47,当前版本为作者最后更新于2020-03-17 12:02:54,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    Update:之前过审过后由于文章转移博客链接没了,现在重交。真的麻烦管理了,特此说明QAQ。

    A掉这道题后,我第一次惊叹地说出了:

    我谔谔

    咳咳,进入正题了。

    原题传送门在窝的博客中食用更佳

    【 题意概括 】

    观察样例,根据输入输出不同的正方形和三角形矩阵。

    没错,就这样。

    【 思路 】

    要一步一步来。

    令输入为 nn

    在正方形中,对于第 ii 行的第 jj 个数,这个数的值为 (i1)×n+j(i-1) \times n+j.

    在三角形矩阵中,先令 where=1where=1.

    nj<in-j<i 时,此处输出 wherewhere 的值,随后 wherewhere+1+1.

    否则,此处用空格补齐。

    记得每一个数都要补零哦。

    好的,下面进入代码环节。

    【 代码实现 + 注释 】

    #include<bits/stdc++.h>//万能头文件好 
    using namespace std;
    int main(){
    	int n,i,j,wei=0,weii,where;
    	scanf("%d",&n);//输入n
    	//wei表示n*n的位数,weii表示当前数的位数(好补零)
    	while(pow(10,wei)<=n*n)wei++;//算出n*n的位数
    	if(n==0)return 0;//特判 
    //	printf("%d",wei);//测试用 
    	//下面进入正方形的输出
    	for(i=1;i<=n;i++){
    		for(j=1;j<=n;j++){
    			weii=0;//初始化为0
    			while(pow(10,weii)<=n*(i-1)+j)weii++;//算当前数的位数
    			while(weii<wei){
    				printf("0");
    				weii++;
    			}//补零
    			printf("%d",n*(i-1)+j);//输出该数
    		}
    		printf("\n");//记得换行
    	}
    	//下面进入三角形的矩阵的输出
    	printf("\n");//记得换行
    	where=1;//初始化,第一个数为1
    	for(i=1;i<=n;i++){
    		for(j=1;j<=n;j++){
    			weii=0;//初始化为0
    			while(pow(10,weii)<=where)weii++;//同理,算当前数的位数
    			if(n-j<i){//如果这个数应该输出来
    				while(weii<wei){
    					printf("0");
    					weii++;
    				}
    				printf("%d",where);
    				where++;//记得加1
    			}//同上理
    			else{//否则
    				weii=0;//把这个数当成0位
    				while(weii<wei){
    					printf(" ");
    					weii++;
    				}//输出空格
    			}
    		}
    		printf("\n");//记得换行
    	}
    	return 0;//over~
    }
    

    打完后暗想:这是不是该一道橙题把(指码量)

    结果 WA×2 \times 2。QAQ

    无奈之下看了看别人的题解。我谔谔!竟然说只要小于 1010 直接补一个 00

    这不是我的错了好伐,这是没给数据范围的锅(强行甩锅)QWQ.

    那咱们直接把 n×nn \times n 的位数改成 22 不就好了嘛。

    最后附上最终AC代码:

    #include<bits/stdc++.h>//万能头文件好 
    using namespace std;
    int main(){
    	int n,i,j,wei=0,weii,where;
    	scanf("%d",&n);
    	
    //	while(pow(10,wei)<=n*n)wei++;
    	wei=2;//唯一不同的地方就是这两行
    	if(n==0)return 0;//特判 
    //	printf("%d",wei);//测试用 
    	
    	for(i=1;i<=n;i++){
    		for(j=1;j<=n;j++){
    			weii=0;
    			while(pow(10,weii)<=n*(i-1)+j)weii++;
    			while(weii<wei){
    				printf("0");
    				weii++;
    			}
    			printf("%d",n*(i-1)+j);
    		}
    		printf("\n");
    	}
    	
    	printf("\n");
    	where=1;
    	for(i=1;i<=n;i++){
    		for(j=1;j<=n;j++){
    			weii=0;
    			while(pow(10,weii)<=where)weii++;
    			if(n-j<i){
    				while(weii<wei){
    					printf("0");
    					weii++;
    				}
    				printf("%d",where);
    				where++;
    			}
    			else{
    				weii=0;
    				while(weii<wei){
    					printf(" ");
    					weii++;
    				}
    			}
    		}
    		printf("\n");
    	}
    	return 0;
    }
    

    然而尴尬的是,当我把这份题解写完后数据范围才加了上去 QAQ。(不过好像还是没说超过10就补0?

    对了,如果有建议请私信,作者自愿禁言了。否则将无法回复您哦!

    完结撒花~(疯狂暗示 AWA.

    • 1

    信息

    ID
    4704
    时间
    1000ms
    内存
    125MiB
    难度
    1
    标签
    (无)
    递交数
    0
    已通过
    0
    上传者