请教一道C语言题,简单!!
输入N,输出如下图示的字符图形,如N=3时
1
1 2 1
1 3 3 1
1 2 1
1
我写的程序只有在N<=3时才正确,N=4就不对了,请高手指点
问题点数:50、回复次数:42Top
1 楼yangkun110(狼的传人)回复于 2005-04-01 21:48:48 得分 5
你的程序都没帖上来,怎么知道你什么地方错了 ?Top
2 楼Cathryn0000000(苹果雹冰oοО)回复于 2005-04-01 21:55:16 得分 0
不是帮我改错,是重写啊
哦,要是可以帮我改改也行
#include<stdio.h>
void main(){
int n,i,j;
printf("input N:\n");
scanf("%d",&n);
printf("\n");
for(i=1;i<=n;i++){
for(j=n-2*i+2;j>0;j--)
printf(" ");
printf("1 ");
for(j=1;j<i;j++)
printf("%d ",i);
if(i!=1) printf("1\n");
else printf("\n");
}
for(i=n-1;i>0;i--){
for(j=1;j<=n-2*i+2;j++)
printf(" ");
printf("1 ");
for(j=1;j<i;j++)
printf("%d ",i);
if(i!=1)printf("1\n");
else printf("\n");
}
}Top
3 楼Cathryn0000000(苹果雹冰oοО)回复于 2005-04-01 22:03:14 得分 0
请大家帮帮忙啊,谢谢了
Top
4 楼yangkun110(狼的传人)回复于 2005-04-01 22:10:06 得分 0
你能不能把N=5的图形打出来给我看看啊Top
5 楼Dijer(>龙龙<)回复于 2005-04-01 22:11:52 得分 0
N=4是什么样啊?
1
1 2 1
1 3 3 1
1 4 6 4 1
1 3 3 1
1 2 1
1
这个样么??Top
6 楼Cathryn0000000(苹果雹冰oοО)回复于 2005-04-01 22:15:16 得分 0
一样的啊,应该是这样的才对:
1
1 2 1
1 3 3 1
1 4 4 4 1
1 5 5 5 5 1
1 4 4 4 1
1 3 3 1
1 2 1
1
Top
7 楼yangkun110(狼的传人)回复于 2005-04-01 22:15:19 得分 0
龙龙,你能看出有什么规律吗?Top
8 楼yangkun110(狼的传人)回复于 2005-04-01 22:16:41 得分 0
哦,是这个样子啊
你等等啊Top
9 楼tianhxk(c++<>_JAVA(拒绝回答中文作为字段的问题))回复于 2005-04-01 22:38:16 得分 5
不能超过10 否则不对称
#include <iostream>
#include<string>
using namespace std;
void Print_hex(const string & str)
{
int i,len;
unsigned char ch;
len = str.size();
for( i = 0;i < len ;i ++ )
{
ch = str[i];
if(ch <= 16)
cout<<'0'<<(char)(ch>9?(ch - 10 + 'A'):(ch + '0'));
else
cout<<(char)(ch/16>9?(ch / 16 - 10 + 'A'):(ch / 16 + '0')) \
<<(char)(ch%16 > 9 ?(ch % 16 - 10 + 'A'):(ch % 16 + '0'));
cout<<" ";
if( ( i + 1 ) % 10 == 0 )
cout<<endl;
}
cout<<endl;
}
int main()
{
int i,j,all,n;
while( 1 )
{
cin >> n;
if( n == 0)
break;
if( n == 1)
{
cout<<1<<endl;
cout<<1<<endl;
}
else
{
all = n ;
for( j = 0 ;j < all ;j++)
cout << " ";
cout << 1 << endl;
all -= 2;
i = 2 ;
while( i <= n )
{
for( j = 0 ;j < all ;j ++ )
cout << " ";
cout << 1 << " ";
for(j = 1 ; j < i ; j++)
cout <<i << " ";
cout << 1 <<endl;
i ++ ;
all --;
}
i -= 2;
all += 2;
while ( i >= 2)
{
for ( j = 0 ;j < all ;j ++ )
cout << " ";
cout << 1 << " ";
for( j = 1 ; j < i ;j++)
cout << i << " ";
cout << 1 << endl;
i -- ;
all ++ ;
}
all = n ;
for ( j = 0 ;j < n ;j++)
cout<< " " ;
cout << 1<<endl;
}
}
return 0;
}Top
10 楼Cathryn0000000(苹果雹冰oοО)回复于 2005-04-01 22:47:29 得分 0
tianhxk的太复杂了吧,也不太一样啊
这是今天复试的三道上机题中的一道,还有一道是四则运算表达式(不含括号)求值,总共只给一个小时,哎~~~好BT啊Top
11 楼tianhxk(c++<>_JAVA(拒绝回答中文作为字段的问题))回复于 2005-04-01 22:48:00 得分 0
第一个函数不用的,忘记拿掉了
#include <stdio.h>
int main()
{
int i,j,n;
while( 1 )
{
scanf("%d",&n);
if( n == 0)
break;
if( n == 1)
printf("1\n1\n");
else
{
for( j = 0 ;j < n ;j++)
printf(" "); //输出1时空格数为n个
printf("1\n"); //然后输出1回车
i = 2 ;
while( i <= n ) //以后每个数开头的空格为n - i i 为当前数
{
for( j = 0 ;j < n - i ;j ++ )
printf(" ");
printf("1 ");
for(j = 1 ; j < i ; j++)
printf("%d ",i);
printf("1\n");
i ++ ;
}
i -= 2;
while ( i >= 2)
{
for ( j = 0 ;j < n - i ;j ++ )
printf(" ");
printf("1 ");
for( j = 1 ; j < i ;j++)
printf("%d ",i);
printf("1\n");
i -- ;
}
for ( j = 0 ;j < n ;j++)
printf(" ");
printf("1\n");
}
}
return 0;
}Top
12 楼tianhxk(c++<>_JAVA(拒绝回答中文作为字段的问题))回复于 2005-04-01 22:53:01 得分 0
对你的程序进行一点修改后就好了,修改出已经作出说明,我要分的哦
/*#include <stdio.h>
int main()
{
int i,j,n;
while( 1 )
{
scanf("%d",&n);
if( n == 0)
break;
if( n == 1)
printf("1\n1\n");
else
{
for( j = 0 ;j < n ;j++)
printf(" "); //输出1时空格数为n个
printf("1\n"); //然后输出1回车
i = 2 ;
while( i <= n ) //以后每个数开头的空格为n - i i 为当前数
{
for( j = 0 ;j < n - i ;j ++ )
printf(" ");
printf("1 ");
for(j = 1 ; j < i ; j++)
printf("%d ",i);
printf("1\n");
i ++ ;
}
i -= 2;
while ( i >= 2)
{
for ( j = 0 ;j < n - i ;j ++ )
printf(" ");
printf("1 ");
for( j = 1 ; j < i ;j++)
printf("%d ",i);
printf("1\n");
i -- ;
}
for ( j = 0 ;j < n ;j++)
printf(" ");
printf("1\n");
}
}
return 0;
}*/
#include<stdio.h>
void main(){
int n,i,j;
printf("input N:\n");
scanf("%d",&n);
//printf("\n"); //去掉
for(i=1;i<=n;i++){
for(j=n-i;j>0;j--) //你原来的为for (j = n - 2*i + 2; j > 0 ;j --)
printf(" ");
if ( i == 1) //1为特例
printf(" ");
printf("1 ");
for(j=1;j<i;j++)
printf("%d ",i);
if(i!=1) printf("1\n");
else printf("\n");
}
for(i=n-1;i>0;i--){
for(j=1;j<=n-i;j++)
printf(" ");
if( i == 1)
printf(" ");
printf("1 ");
for(j=1;j<i;j++)
printf("%d ",i);
if(i!=1)printf("1\n");
else printf("\n");
}
}
Top
13 楼tianhxk(c++<>_JAVA(拒绝回答中文作为字段的问题))回复于 2005-04-01 22:56:03 得分 5
每次都是多粘,真郁闷
#include<stdio.h>
void main(){
int n,i,j;
printf("input N:\n");
scanf("%d",&n);
//printf("\n"); //去掉
for(i=1;i<=n;i++){
for(j=n-i;j>0;j--) //你原来的为for (j = n - 2*i + 2; j > 0 ;j --)
printf(" ");
if ( i == 1) //1为特例
printf(" ");
printf("1 ");
for(j=1;j<i;j++)
printf("%d ",i);
if(i!=1) printf("1\n");
else printf("\n");
}
for(i=n-1;i>0;i--){
for(j=1;j<=n-i;j++)
printf(" ");
if( i == 1)
printf(" ");
printf("1 ");
for(j=1;j<i;j++)
printf("%d ",i);
if(i!=1)printf("1\n");
else printf("\n");
}
}
Top
14 楼yangkun110(狼的传人)回复于 2005-04-01 23:00:05 得分 0
老兄,这个问题有点棘手啊, 我得好好想想Top
15 楼qqfig()回复于 2005-04-01 23:00:25 得分 0
不会吧,N=4时应该是
1
1 2 1
1 3 3 1
1 4 6 4 1
1 3 3 1
1 2 1
1
这是杨辉三角的对称扩充。要是是
1
1 2 1
1 3 3 1
1 4 4 4 1
1 3 3 1
1 2 1
1
这样就没有什么意思了!!!
Top
16 楼yangkun110(狼的传人)回复于 2005-04-01 23:02:10 得分 0
楼上,这么代码啊,能不能 浓缩点啊Top
17 楼tianhxk(c++<>_JAVA(拒绝回答中文作为字段的问题))回复于 2005-04-01 23:04:04 得分 0
那是楼主要求的,就算你要求杨辉三角,一旦超过10就失去对称性了,也没什么意思,这道题的N<10,如果杨辉三角,N将更小Top
18 楼tianhxk(c++<>_JAVA(拒绝回答中文作为字段的问题))回复于 2005-04-01 23:07:25 得分 0
我贴出来的最后一个就是比较短的程序,其余的都是带上了其他没有用的函数或者注释掉的程序,Top
19 楼du51(郁郁思扬)回复于 2005-04-01 23:16:30 得分 5
#include<iostream>
using namespace std;
void print(int n)
{
int i=0,j=0;
for(i=0;i<n;i++)cout<<" ";cout<<1<<endl;
for(i=1;i<n;i++)
{
for(j=1;j<n-i;j++)cout<<" ";
cout<<1<<" ";
for(j=0;j<i;j++)cout<<i+1<<" ";
cout<<1;
cout<<endl;
}
for(i=2;i<n;i++)
{
for(j=0;j<i-1;j++)cout<<" ";cout<<1<<" ";
for(j=1;j<n-i+1;j++)cout<<n-i+1<<" ";
cout<<1;
cout<<endl;
}
for(i=0;i<n;i++)cout<<" ";cout<<1<<endl;
}
int main()
{
int n;
cin>>n;
print(n);
system("PAUSE");
return 0;
}Top
20 楼du51(郁郁思扬)回复于 2005-04-01 23:17:20 得分 5
这个应该是最直观的了.也不长.呵呵.Top
21 楼du51(郁郁思扬)回复于 2005-04-01 23:19:37 得分 0
完全符合楼主的要求.呵呵.分来.Top
22 楼Cathryn0000000(苹果雹冰oοО)回复于 2005-04-01 23:28:25 得分 0
也有可能是要求杨辉三角,我也不清楚,555Top
23 楼Cathryn0000000(苹果雹冰oοО)回复于 2005-04-01 23:29:19 得分 0
算了,结贴算了,反正都考完了...Top
24 楼yangkun110(狼的传人)回复于 2005-04-01 23:31:50 得分 0
#include<stdio.h>
main()
{
int i,j,k,m,n;
printf("n=");
scanf("%d",&n);
for(k=1;k<=n;k++)
printf(" ");
printf("1\n");
for(i=2;i<=n;i++)
{
for(j=i;j<n;j++)
printf(" ");
printf("1 ");
for(m=2;m<=i;m++)
printf("%d ",i);
printf("1\n");
}
}Top
25 楼yangkun110(狼的传人)回复于 2005-04-01 23:33:53 得分 0
呵呵,写了一半Top
26 楼yangkun110(狼的传人)回复于 2005-04-01 23:57:14 得分 5
#include<stdio.h>
tt(int u)
{
int k;
for(k=1;k<=u;k++)
printf(" ");
printf("1\n");
}
aa(int i,int u)
{
int j,m;
for(j=i;j<u;j++)
printf(" ");
printf("1 ");
for(m=2;m<=i;m++)
printf("%d ",i);
printf("1\n");
}
main()
{
int i,n;
printf("n=");
scanf("%d",&n);
tt(n);
for(i=2;i<=n;i++)
aa(i,n);
for(i=n-1;i>=2;i--)
aa(i,n);
tt(n);
}
哈哈,OK了
虽然慢了些,但还是成功了。Top
27 楼vagrant__82(谢国庆)回复于 2005-04-02 00:54:12 得分 5
经过调试,输出完全正确的程序。供参考!
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void print(unsigned int line);
int main(int argc, char *argv[])
{
unsigned int LineNum;
printf( "\r\n Pls input the line number wanted to print!\r\n" );
scanf( "%u", &LineNum );
if ( LineNum >= 10 )
{
printf( "\r\n you should input a integer between 1 and 9" );
return 1;
}
print( LineNum );
printf( "\r\n" );
system("PAUSE");
return 0;
}
void print(unsigned int line)
{
int i = 0;
int j = 0;
int k = 0;
int lineIndex = 2;
/* first print the first line ,because it is not same as other */
for ( i = 0; i < line; i++ )
{
printf( " " );
}
printf( "1\r\n" );
if ( line == 1 )
{
return;
}
/* now print the middle lines periodicly */
for ( i = (int)(2-line); i <= (int)(line-2); i++ )
{
lineIndex =(int)(line - abs(i));
for( j = 0; j < (line-lineIndex); j++ )
{
printf( " " );
}
printf( "1" );
for ( k = (int)(1-lineIndex); k <= (int)(lineIndex-1); k++ )
{
if ( (abs(k)%2) == ( (lineIndex-1)%2 ) )
{
printf( " " );
}
else
{
printf( "%d", lineIndex );
}
}
printf( "1\r\n" );
/* record the line number printing now */
//lineIndex++;
}
/* now it is time to print the last "1" */
for ( i = 0; i < line; i++ )
{
printf( " " );
}
printf( "1" );
}Top
28 楼david_wrt(沧海一声笑)回复于 2005-04-02 16:33:07 得分 5
楼上的,用行着那么麻烦么?
//include "stdafx.h"
int main(int argc, char* argv[])
{
int i,j,n,a;
printf("please input n:");
scanf("%d",&n);
printf("\n");
for ( i = 1; i < 2*n; i++)//共有2n-1行
{
if ( (i == 1)||(i== 2*n-1))//上下两端
{
for (j = 0; j < n; j++) printf(" ");//输出空格
printf("1\n");//上下两端只输出一个“1”
continue;
}
if ( i <= n )//第二行到第n行
{
a = i;//要输出的数字
for( j = 0; j < n-1; j++ ) printf(" "); printf("1 ");//左边的“1”
for( j = 0l j < a-1; j++ ) printf("%d ",a);//中间的数字
printf("1\n");//右边的"1"
}
else //第n+1到第2n-2行
{
a = 2*n-i//要输出的数字
for ( j = 0; j < i-n; j++)printf(" ");printf("1 ");//左边的“1”
for ( j = 0; j < a-1; j++)printf("%d ",a);//中间的数字
printf("1\n");
}
}//全部输出
getchar();
return 0;
}Top
29 楼david_wrt(沧海一声笑)回复于 2005-04-02 16:35:03 得分 0
也用不着调来调去的Top
30 楼FreeFice(庄鱼)回复于 2005-04-02 17:19:28 得分 5
#include<stdio.h>
void main(){
int n,i,j;
printf("input N:\n");
scanf("%d",&n);
printf("\n");
for(i=1;i<=n;i++){
for(j=2*(n-i);j>0;j--)//-------------------
printf(" ");
printf("1 ");
for(j=1;j<(i-1)*2;j++)//-------------------
printf("%d ",i);
if(i!=1) printf("1\n");
else printf("\n");
}
for(i=n-1;i>0;i--){
for(j=1;j<=2*(n-i);j++)//------------------
printf(" ");
printf("1 ");
for(j=1;j<(i-1)*2;j++)//------------------
printf("%d ",i);
if(i!=1)printf("1\n");
else printf("\n");
}
}
原程序改动Top
31 楼FreeFice(庄鱼)回复于 2005-04-02 17:36:42 得分 0
#include<stdio.h>
void main(){
int n,i,j;
printf("input N:\n");
scanf("%d",&n);
printf("\n");
for(i=1;i<=n;i++){
for(j=2*(n-i);j>0;j-=2)//-------------------
printf(" ");
if(i==1)printf(" 1"); //-------------------
else printf("1 "); //-------------------
for(j=1;j<(i-1)*2;j+=2)//-------------------
printf("%d ",i);
if(i!=1) printf("1\n");
else printf("\n");
}
for(i=n-1;i>0;i--){
for(j=1;j<=2*(n-i);j+=2)//------------------
printf(" ");
if(i==1)printf(" 1"); //------------------
else printf("1 "); //------------------
for(j=1;j<(i-1)*2;j+=2)//------------------
printf("%d ",i);
if(i!=1)printf("1\n");
else printf("\n");
}
}
完全按照图形改动原程序Top
32 楼alwanv(苏永邦;;;春天,我把老婆埋了;夏天,我就有好多老婆了。)回复于 2005-04-02 20:06:34 得分 0
哈哈,我输入10就变成这样了。。根据楼主的代码实现的:
1
1 2 1
1 3 3 1
1 4 4 4 1
1 5 5 5 5 1
1 6 6 6 6 6 1
1 7 7 7 7 7 7 1
1 8 8 8 8 8 8 8 1
1 9 9 9 9 9 9 9 9 1
1 10 10 10 10 10 10 10 10 10 1
1 9 9 9 9 9 9 9 9 1
1 8 8 8 8 8 8 8 1
1 7 7 7 7 7 7 1
1 6 6 6 6 6 1
1 5 5 5 5 1
1 4 4 4 1
1 3 3 1
1 2 1
1
Top
33 楼buguty(系统级别)回复于 2005-04-02 20:57:37 得分 0
其实很简单的一个程序怎么!·~#?·%#¥%?¥?……¥%……—?Top
34 楼zhaodan23(灵山城主)回复于 2005-04-02 21:51:01 得分 0
期待Top
35 楼cao12m(★草上飞★)回复于 2005-04-02 21:57:16 得分 0
杨辉三角阵 算法比较简单就是生成有点难啊 我不太会控制Top
36 楼dream2013(每个人都有魔鬼的一面( http://blog.sina.com.cn/u/1422260677 ))回复于 2005-04-02 23:11:41 得分 0
mark,有时间在写Top
37 楼woodcord(我心飞翔)回复于 2005-04-03 07:27:21 得分 0
我觉得应该是问杨辉三角的问题!!!Top
38 楼FreeFice(庄鱼)回复于 2005-04-03 11:32:49 得分 0
杨辉三角形?
1
1 1
1 2 1
1 3 3 1
...这样才是!楼主的是
1
1 2 1
1 3 3 1
...愣比上面少了一层,天知道他的算法依据是什么,只能根据他的图形给出答案Top
39 楼QunKangLi(心里面疼得有点发酸 一定是有雾来了 打湿了我的眼眶)回复于 2005-04-03 11:45:05 得分 0
#define N 10
void print( int n )
{
static char *P[N] = {
"\n",
"1\n",
" 1\n" /*注意有无逗号可是大有区别的~~~*/
"1 1\n"
" 1\n",
..../*列出1到10的字符串即可,嘿嘿~~~~*/
} ;
puts( n >= 0 && n < N ? P[n] : "sorry..." ) ;
}
虽然有最大N的限制,编码也太无味了些,不过,不相信有比这更快的算法!Top
40 楼dongfei(风月无影)回复于 2005-04-03 11:49:51 得分 0
markTop
41 楼hanyaocsdn()回复于 2005-04-03 12:20:33 得分 0
markTop
42 楼sangxiaoqiang(我是一只小虾米)回复于 2005-04-04 01:17:33 得分 5
上面的程序都太麻烦了,注意:技巧,在处理这种类型的题时,首先应该注意上下左右对称的东东,可以使用数组将其数字先写入二维数组,最后输出数组即可,数组的定义:
#define num[2*n-2][4*n-7],这个程序,不知对于N为5以上是如何,我推出了这个公式
这种程序的扩充性很好,仅需要根据n填充数组Top




