XTU 1403 菱形 求找错wwwww

本文探讨了一个编程问题,涉及根据给定的数值打印不同大小的菱形,仅使用特定字符。博主求助于解决思路,通过样例输入输出对比自己的代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

菱形 I

Submit Code ] [ Top 20 Runs ] [ Runs Status ]
Acceteped : 17Submit : 45
Time Limit : 1000 MSMemory Limit : 65536 KB

Description

菱形

题目描述

按照给定小菱形的数量n,利用字符打印菱形,要求

  1. 只使用/\,空格,回车四种字符。
  2. 行首无多余的空格,行末无空格。
  3. 菱形从上到下,从左到右,依次编码,从1到n,不要输出多余的菱形。
  4. 边长为a的大菱形,最少有(a−1)2+1个小菱形,最多有a2个小菱形。

具体格式见样例。

比如边长为3的菱形,最少有5个小菱形(左边的情况),最多有9个小菱形(右边的情况)。

   /\      /\
  /\/\    /\/\
 /\/\/   /\/\/\
 \/\/    \/\/\/
          \/\/
           \/

对应的编号分别为

  1     1
 2 3   2 3
4 5   4 5 6
       7 8
        9

输入格式

存在多个样例,每个样例是一个整数n(1≤n≤100)。如果n为0,表示输入结束,这个样例不需要处理。

输出格式

依次按要求输出对应数量的菱形。

样例输入

1
2
3
4
5
6
7
0

样例输出

/\
\/
 /\
/\/
\/
 /\
/\/\
\/\/
 /\
/\/\
\/\/
 \/
  /\
 /\/\
/\/\/
\/\/
  /\
 /\/\
/\/\/\
\/\/\/
  /\
 /\/\
/\/\/\
\/\/\/
 \/

思路很垃圾....但是不知道错哪里了,找了AC代码打印1-100文件比对也完全一致.... 


#include<stdio.h>
#include<math.h>
#include<string.h>
char a[60][60];
void solve(int n) {
    if(n == 0) return;
    int flag;
//    while(scanf("%d",&n)&&n!=0){
        double temp=sqrt(n);
        int p;
        p=int(temp); 
        if(p!=temp) p+=1; //边长;
        int h=(p+1)*p/2;
        if(n<=h) flag=1;
        else     flag=0;//要搞下一半 
        int abc=1,cnt2=0,cnt=0;
        int line=p+1;
        int cun=n;
        while(n-h>0)
        {
            n-=p;
            cnt2++;
            n+=cnt2;
        }
        line+=cnt2;


        for(int i=0;i<11;i++){
            for(int j=0;j<=i;j++){
                a[0+i][p+0-i+j*2]='/';
                a[0+i][p+1-i+j*2]=92; 
                for(int s=p+1-i+j*2;s<=45;s++){
                    if(a[0+i][s]==' '){
                        a[0+i][s]='\0';
                        break;
                    }         
                }


                a[1+i][p+0-i+j*2]=92;
                a[1+i][p+1-i+j*2]='/';     
                for(int s=p+2-i+j*2;s<=45;s++){
                    if(a[1+i][s]==' '){
                        a[1+i][s]='\0'; 
                        break;
                    }    
                }


                cnt++;
                if(cnt==cun||cnt==h)
                {
                    abc=0;
                    break;
                }
            }
            if(abc==0)    break;
        } //上一半;    
        
        int move=0,sum=0;    
        if(flag==0){
            for(int i=p+1;i<=line;i++){
                move++;
                cnt=0;
                for(int j=0;j<=33;j++){
                    a[i][1+j*2+move]=92;
                    a[i][2+j*2+move]='/';
                    cnt++;
                    sum++;
                    if(cnt==p-1||sum==cun-h){
                        p-=1;
                        a[i][3+j*2+move]='\0';//结束符设置
                        break;
                    }    
                }    
                if(sum==cun-h) break;
            }
        }
        //后半部分; 
        for(int i=0;i<line;i++){
//            for(int j=1;j<=50;j++){
//                printf("%c",a[i][j]);
//            }
            printf("%s\n", a[i] + 1);
        }
//        for(int i=0;i<=cun;i++){
//            for(int j=1;j<=45;j++)    a[i][j]=' ';
//        }
        memset(a,' ',sizeof(a));
        //输出和清零。 
//    }
} 
int main()
{    
    int x;
    while(scanf("%d", &x) != EOF && x != 0) solve(x);
//    freopen("a.out", "w", stdout); 
//    for(int i = 1; i <= 100; ++ i) printf("%d\n", i), solve(i);
    return 0; 
 }

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值