回 帖 发 新 帖 刷新版面

主题:入门必做的题

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个回复)

61 楼

8错8错,这下大家有目标了~~

62 楼

// ③ 回转填数

#include<stdio.h>

#define MAX 20
int main(void)
{
    int i,j,k,x=0;
    int n,N;
    int direct = 0;    // direct为0表示向下移动,为1表示向上移动
    int m[MAX][MAX];

    scanf("%d",&n);
    j = 0;
    i = -1;
    k = 0;
    N = n*n;

    while( k < N )
    {
        switch(direct)
        {
        case 0:    // 向下
            while( i < n-1-x )
                m[++i][j] = ++k;
              break;
        case 1:    // 向右
            while( j < n-1-x )
                m[i][++j] = ++k;
             break;
        case 2:    //向上
            while ( i > x )
                m[--i][j]=++k;
            break;
        case 3:   //向左
            while ( j > x )
                m[i][--j]=++k;
            break;
        }
        if( direct == 3 )
        {
            direct=-1;
        }
        if(direct == 2 )
        {
            x++;
        }
        direct = direct+1;
    }
    for(i=0; i<n; ++i)
    {
        for(j=0; j<n; ++j)
            printf("%4d", m[i][j]);
        printf("\n");
    }
    return 1;
}
试着运行了eastcowboy的回转填数,发现于题意不合,可能是eastcowboy兄未看清楚题目,拿他的代码改了下!

63 楼

个个都是精辟题型!!!
谢了,对我一定会有很大帮助的.

64 楼


[em10]厉害啊!!有没答案给参照一下阿!!!那么好的题不会做有不懂的话岂不是很遗憾!!!!!!!!!!!!!

65 楼

收下了,谢谢

66 楼

我做的第5题~ 大家参考下!

#include <stdio.h>
void tran(int x,int y);
void dis(int t);
void main()
{
    int input,count;
    printf("请输入要转换的数:");
    scanf("%d",&input);
    printf("请输入要转换的进制:");
    scanf("%d",&count);
    tran(input,count);
    printf("\n");
}
void tran(int x,int y)
{
    int t;
    t=x%y;
    x=x/y;
    if (x>=y)
        tran(x,y);
    else if (x>0)
        dis(x);
    dis(t);
}
void dis(int t)
{
    switch(t)
    {
    case 10:printf("A");break;
    case 11:printf("B");break;
    case 12:printf("C");break;
    case 13:printf("D");break;
    case 14:printf("E");break;
    case 15:printf("F");break;
    default :printf("%d",t);
    }
}

67 楼

我自己还好多东西没弄明白,先把自己问题搞定了再找题做了,HOHO~~~~~

68 楼

胡天下之大扯

69 楼

/************************************************************************
8. 输入两个正整数X,Y,将X,Y化为二进制数,然后将这两个二进制数作二进
  制加法运算,再将结果化为十进制数输出。
*************************************************************************/
#include <stdio.h>
#include <math.h>
void main()
{
    int x,y;
    int result=0;
    scanf("%d%d",&x,&y);
    int xrr[16],yrr[16],rerr[16]={0};
    for (int i=0 ;i<16;i++)
    {
        xrr[i]=x%2;
        yrr[i]=y%2;
        x=x/2;
        y=y/2;
        rerr[i]+=xrr[i]+yrr[i];
        if (rerr[i]>1)
        {
            rerr[i+1]+=1;
            rerr[i]%=2;
        }
        result+=rerr[i]*pow(2,i);
    }
    printf("%d\n",result);
}

70 楼

9.题目: 四人玩火柴棍游戏,每一次都是三个人赢,一个人输。输的人要按赢者手中的火柴
  数进行赔偿,即赢者手中有多少根火柴棍,输者就赔偿多少根。现知道玩过四次后,
  每人恰好输过一次, 而且每人手中都正好有16根火柴。问此四人做游戏前手中各有
  多少根火柴? 编程解决此问题。

9.解答:[color=FF0000]代码有点繁杂,对递归有比较好理解的同志们可以看看if007兄第94楼[/color]
// 假设4个人为a,b,c,d,不妨设第一次a输,第二次b输,第三次c输,第四次d输
#include<stdio.h>
int main(void)
{
    int A,B,C;
    int a,b,c,d;

    for(A=0;A<=4*16;++A)
        for(B=0;B<=4*16;++B)
            for(C=0;C<=4*16;++C)
            {
                // 计算a,b,c,d
                a = A;
                b = B;
                c = C;
                d = 4*16-a-b-c;
                if( d < 0 )
                    continue;
                // 第一次: a输
                a -= (b+c+d);
                if( a < 0 )
                    continue;
                b += b;
                c += c;
                d += d;
                // 第二次: b输
                b -= (a+c+d);
                if( b < 0 )
                    continue;
                a += a;
                c += c;
                d += d;
                // 第三次: c输
                c -= (a+b+d);
                if( c < 0 )
                    continue;
                a += a;
                b += b;
                d += d;
                // 第四次: d输
                d -= (a+b+c);
                if( d < 0 )
                    continue;
                a += a;
                b += b;
                c += c;

                if( a==b && b==c && c==d && d==16 )
                    printf("A=%d, B=%d, C=%d, D=%d\n",A,B,C,16*4-A-B-C);
            }
}

运行结果:
A=33, B=17, C=9, D=5

我来回复

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