回 帖 发 新 帖 刷新版面

主题:入门必做的题

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

91 楼

不错不错,这些题让我发现了很多问题,这些问题是看书习题不会发现的。真的是好东东啊!!强烈支持GCC兄

92 楼

请问各位高手第九题能不能用递归来做啊,那位高人能不能贴上代码。小弟用递归没有弄出来。晕中。。。

93 楼

喜欢挑战!有挑战才有进步!!!

94 楼

哈,大家兴致好高,那我也解一条吧.
/*******************************************************************************
问题描述:
四人玩火柴棍游戏,每一次都是三个人赢,一个人输。输的人要按赢者手中的火柴
数进行赔偿,即赢者手中有多少根火柴棍,输者就赔偿多少根。现知道玩过四次后,
每人恰好输过一次, 而且每人手中都正好有16根火柴。问此四人做游戏前手中各有
多少根火柴? 编程解决此问题。
********************************************************************************/
#include <iostream.h>

void fun(int a, int b, int c, int d, int n)
{
    if (n>1)
        fun(b/2,c/2,d/2,a+b/2+c/2+d/2, n-1);
    else
        cout<<a<<" "<<b<<" "<<c<<" "<<d<<" ";
}

void main()
{
    fun(16,16,16,16,5);
}

95 楼

我是新手,好多都不会, 有没有参考答案??那样就更好了,

96 楼


有没有参考答案啊

97 楼

第一道题好多循环,不过验证过结果是正确的,不知道有没更好的算法。
#include <iostream>
using namespace std;
int main ()
{int A,B,C,D,E,F,G,X,Y,Z,DFG,XYZDE;
for(A=0;A<10;A++)
for(B=0;B<10;B++)if(B!=A)
for(C=0;C<10;C++)if(C!=A&&C!=B)
for(D=0;D<10;D++)if(D!=A&&D!=B&&D!=C)
for(E=0;E<10;E++)if(E!=A&&E!=B&&E!=C&&E!=D)
for(F=0;F<10;F++)if(F!=A&&F!=B&&F!=C&&F!=D&&F!=E)
for(G=0;G<10;G++)if(G!=A&&G!=B&&G!=C&&G!=D&&G!=E&&G!=F)
for(X=0;X<10;X++)if(X!=A&&X!=B&&X!=C&&X!=D&&X!=E&&X!=F&&X!=G)
for(Y=0;Y<10;Y++)if(Y!=A&&Y!=B&&Y!=C&&Y!=D&&Y!=E&&Y!=F&&Y!=G&&Y!=X)
for(Z=0;Z<10;Z++)if(Z!=A&&Z!=B&&Z!=C&&Z!=D&&Z!=E&&Z!=F&&Z!=G&&Z!=X&&Z!=Y)
{
DFG=D*100+F*10+G;XYZDE=X*10000+Y*1000+Z*100+D*10+E;
if(XYZDE==DFG+DFG)
{cout<<"A:"<<A<<", B:"<<B<<", C:"<<C<<", D:"<<D<<", E:"<<E<<", F:"<<F<<", G:"<<G
<<", X:"<<X<<", Y:"<<Y<<", Z:"<<Z<<endl;
cout<<"      "<<D<<F<<G<<endl;
cout<<"  +"<<endl;
cout<<"      "<<D<<F<<G<<endl;
cout<<" ____________"<<endl;
cout<<"    "<<X<<Y<<Z<<D<<E<<endl<<endl;}

}
return 0;
}

98 楼

第5题,输入一个十进数,将其转换成 N 进制数(0<N<=16)。
支持小数和负数的版本:

#include<stdio.h>
#define BufferSize 30
int main()
{
    double f,g;
    int i,N;
    char buf[BufferSize];
    char Charactor[] = "0123456789ABCDEF";
    scanf("%lf%d", &f, &N);
    // 处理负数
    if( f<0.0 )
    {
        printf("-");
        f = -f;
    }
    // 保存小数部分
    g = f-((double)(int)f);
    // 处理整数部分
    i = BufferSize-1;
    buf[i--] = '\0';
    while( f >= 1.0 )
    {
        int c = ((int)f)%N;
        buf[i--] = Charactor[c];
        f /= ((double)N);
    }
    printf("%s", buf+i+1);
    // 处理小数部分
    if( g==0.0 )
    {
        printf("\n");
        return 0;
    }
    printf(".");
    i = 0;
    while( g != 0.0 )
    {
        int c = (int)(g*((double)N));
        printf("%c", Charactor[c]);
        g = g*((double)N)-((double)c);
        ++i;
        if( i==10 )    // 最多显示10位,避免因无限循环小数而出现的死循环
            break;
    }
    printf("\n");
    return 0;
}

99 楼


做完才算入门呀,路漫漫其修远兮,我将上下C++

100 楼

97楼似乎理解错题意了,依那种解法应该出现不少种答案.
第一题解(顺带一说,用暴力法是俺感觉最没劲的事了,期待有高手不用暴力法解的^-^):
#include <iostream.h>
const int len=10;
int number[len]={0,1,2,3,4,5,6,7,8,9};
int order(int n)
{
    int i,temp;
    if(n==len)
    {
        int abcde=number[0]*10000+number[1]*1000+number[2]*100+number[3]*10+number[4];
        int xyzde=number[7]*10000+number[8]*1000+number[9]*100+number[3]*10+number[4];
        int dfg=number[3]*100+number[5]*10+number[6];
        if (xyzde == abcde+dfg+dfg) return 1;
        return 0;
    }
    for(i=n; i<len; i++)
    {  
        temp = number[i]; number[i] = number[n]; number[n] = temp;
        if ( order(n+1) ) break;
        temp = number[i]; number[i] = number[n]; number[n] = temp;
    }
    if (i<len) return 1;
    return 0;
}

void main()
{
    order(0);
    cout<<"A:"<<number[0]<<", B:"<<number[1]<<", C:"<<number[2];
    cout<<", D:"<<number[3]<<", E:"<<number[4]<<", F:"<<number[5];
    cout<<", G:"<<number[6]<<", X:"<<number[7]<<", Y:"<<number[8];
    cout<<", Z:"<<number[9]<<endl;
    cout<<endl;
    cout<<"        "<<number[0]<<number[1]<<number[2]<<number[3]<<number[4]<<endl;
    cout<<"         "<<number[3]<<number[5]<<number[6]<<endl;
    cout<<"   +     "<<number[3]<<number[5]<<number[6]<<endl;
    cout<<"   ________________"<<endl;
    cout<<"        "<<number[7]<<number[8]<<number[9]<<number[3]<<number[4]<<endl;
    cout<<endl;
}

我来回复

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