回 帖 发 新 帖 刷新版面

主题:入门必做的题

1.  给定等式  A B C D E     其中每个字母代表一个数字,且不同数字对应不
                    D F G     同字母。编程求出这些数字并且打出这个数字的
             +      D F G     算术计算竖式。

             ───────

                X Y Z D E



  2. A、B、C、D、E五名学生有可能参加计算机竞赛,根据下列条件判断哪些
  人参加了竞赛:

   (1)A参加时,B也参加;

   (2)B和C只有一个人参加;

   (3)C和D或者都参加,或者都不参加;

   (4)D和E中至少有一个人参加;

   (5)如果E参加,那么A和D也都参加。



  3. 打印一个 N*N 的方阵,N为每边           N=15  打印出下面图形
 字符的个数(3<N<20), 要求最               TTTTTTTTTTTTTTT
 外一层为"T", 第二层为"J", 从第三层               TJJJJJJJJJJJJJT
 起每层依次打印数字 1,2,3,...                     TJ11111111111JT
 (右图以N为15为例)                           TJ12222222221JT
                                                  TJ12333333321JT
                                                  TJ12344444321JT
                                                  TJ12345554321JT
                                                  TJ12345654321JT
                                                  TJ12345554321JT
                                                  TJ12344444321JT
                                                  TJ12333333321JT
                                                  TJ12222222221JT
                                                  TJ11111111111JT
                                                  TJJJJJJJJJJJJJT
                                                  TTTTTTTTTTTTTTT



  4. 在N行N列的数阵中, 数K(1〈=K〈=N)在每行和每列中出现且仅
  出现一次,这样的数阵叫N阶拉丁方阵。例如下图就是一个五阶拉丁方阵。
  编一程序,从键盘输入N值后,打印出所有不同的N阶拉丁方阵,并统计个数。

        1  2  3  4  5
        2  3  4  5  1
        3  4  5  1  2
        4  5  1  2  3
        5  1  2  3  4


  5. 输入一个十进数,将其转换成 N 进制数(0<N<=16)。

回复列表 (共635个回复)

111 楼

这里面有全国信息学奥林匹克大赛的题目耶

112 楼

第16题里对于所有情况,硬币问题都能称两次就解决的.
16题可以的,不用知硬币重了还是轻了的,而且称法还有很多种.

详情可以到这个网址http://www.programfan.com/club/showbbs.asp?id=151108&page=1
去参考一下.
------------------------------------
这个算法确实很牛.顶了.
但是对于16题的问题,如果用两次称量的话是不能确定其是重还是轻的.因为两次称量可以表示的情况有3的平方公9种,但是如果考虑轻重的话,应该有8*2=16种情况,所以两次称量是不能涵盖所有的情况的.

113 楼


请问你有具体的程序代码吗?

114 楼


                                  @
恭喜你,你的答对了!送你棒棒糖一只   \

不过你的解答并不是很准确.事实上并不能简单的覆盖就行的.因为所谓的一个硬币两种情况是有其内在关糸的,要看具体情况而定.
称两次天平可出现情况如下:
(0,0) (0,1) (1,0) (1,1) (0,-1) (-1,0) (-1,-1) (1,-1) (-1,1)

其中,(0,1)和(0,-1)不可分别, (1,0)和(-1,0)不可分别, (1,1)和(-1,-1)不可分别.

压缩一下就是(0,0) (0,1) (1,0) (-1,-1) (1,-1) (-1,1)这时它们具有唯一性,故称两次最多可称六个硬币.而6*2却有12种情况.

出偏差的地方就在于:12种时是能准略求出那个是硬币,并且这个硬币是轻还是重.
但如果只是要求那个是坏硬币时,有理由可不覆盖12种情况.
也正是存在这种可能,加上这帖里的题大都是经典题,故有种错觉它不会出那么简单的题来考我,偶又人懒...
于是,^-^。  ...哦,偶被人四两拨千斤了,555...那天见题就想到作法所以大意了...

呵呵,好家伙.加油.^-^
真理是越辩越明.

115 楼

发送颠覆

116 楼

晕,那么多啊?好多偶都不会,初学者!

117 楼

[quote]To&nbsp;eastcowboy&nbsp;兄,我首先非常佩服他的这种一丝不苟的精神.自己都达到这么一个水平了,还一道不落的做这种入门的题.希望他能将这种精神坚持下去,一定有一天会变的更牛的.
但是我要吹毛求疵一下了:eastcowboy&nbsp;兄的第四题的算法有一点问题,最终的拉丁矩阵总数并不是2*n!种,应该是n!*(n-1)!种,对于一种已经成立的拉丁矩阵应该是对其的行和列分别对其进行全排列才对,但是这样又会重复n倍(因为对行进行全排列的时候对列已经排列了n次了).另外对eastcowboy&nbsp;兄的程序当输入2的时候会出现重解.

还有,对于进制转换的程序,eastcowboy&nbsp;兄的程序只能转换整数,既然已经自己动手了,那就动的再好一些啦,应该能转换小数才完美呀.[/quote]
我觉得应该是有(n-1)*n!种,因为每一行,每一列都有一个i(i属于0~n),在第一行中i有n!种放法,要使第二行中的i不与第一行中的i冲突,只要在第一行中i所在列k加个j(j属于0~n),那么第二行中i的列位置为(k+j)%n,以次类推,写到n行,就得一种;说得不清楚是小弟表达问题,代码如下(在eastcowboy兄的代码下改过来的):
#include<stdio.h>
#define MAX 20
static int n,count;
void print(int start){
    static int used[MAX]={0};
    static int arr[MAX];
    int i,j,k,m;
    if(start==n){
        for(i=1;i<n;i++){
            for(j=0;j<n;j++){
                for(k=0;k<n;k++)
                    printf("%4d",arr[(i*j+k)%n]);
                printf("\n");
            }
            count++;
            printf("\n");
        }
            printf("\n");
            return;
    }
    for(m=0;m<n;m++){
        if(used[m])
            continue;
        arr[start]=m+1;
        used[m]=1;
        print(start+1);
        used[m]=0;
    }
}
void main(){
    printf("enter n:");
    scanf("%d",&n);
    count=0;
    print(0);
    printf("总共有%d种",count);
}

118 楼

这些题目真是的太经典了,南京大学那个同学真是强人哟!

本人自学了三个月的c,二个月的C++,自考过了计算机三级网络,

以为自己入门了,没想到一看到上面的这些题,我的眼睛就有点紧张了!

这些题确是有一定的挑战性啊!

不过,如果仔细想想,有些题还不是很难的!

在C++中介绍了一种分而治之的思想,我想我们大学都应该有这种思想!

像“汉诺塔”问题,用一般的方法是做不出来的,如果不知道“递归”,不知道“迭代”,是根本不能做的!

还是希望一些生手,多多看一下书,像c,c++等,我学了一个月的VC,现在才发现,vc
对我们现在来说,根本没有多少用处的!

如果你只是想写一两个游戏出来在同学们面前炫耀一下子,那你可以去学vc++,如果想学好算法这个重要的东西,那么一定要学c,c++,尤其是c++,一定要了解c++语言的多态性,封装性!

其实我也是一个新手,大家一起学习!

119 楼

谢谢gcc兄

120 楼

我也有如此困惑

我来回复

您尚未登录,请登录后再回复。点此登录或注册