回 帖 发 新 帖 刷新版面

主题:[讨论]GCC入门题部分题目解答

以下程序在VC6.0环境下测试通过
若出现程序编译不了,或需要注释的,可以加Q634419082
//////////////////////////////////////////////////////////////////////////////
//
//  1.  给定等式    A B C D E     其中每个字母代表一个数字,且不同数字对应不
//                      D F G     同字母。编程求出这些数字并且打出这个数字的
//          /    +      D F G     算术计算竖式。
//               ───────
//                  X Y Z D E
//////////////////////////////////////////////////////////////////////////////
//
//  (DE+FG+FG)%100 = DE -> FG = 50 
//  Z = (C+D+D+1)%10
//  Y = ((C+D+D+1)/10 + B)%10 && Y != 0 && Z != 0 
//    -> B == 9 && C +D +D +1 > 20 ->  C >= 5 && D >= 5
//  X != A ->X = A+1
//  E = 45 - (A +9 + C +D +E + 5 +0 +X +Y +Z) = 31 - A -C -D -E -X -Y -Z
/////////////////////////////////////////////////////////////////////////////
#include "stdio.h"
void main()
{
    unsigned int a, c, d, e, x, y, z;

    printf("%10s\n", "A B C D E"); 
    printf("%10s\n", "D F G");
    printf("+%9s\n", "D F G");
    printf("%10s\n", "───────");
    printf("%10s\n\n\n", "X Y Z D E");

    for(a = 1; a < 9; a++)
    {
        if(a == 5)
            continue;
        for(c = 5; c < 9; c++)
        {
            if(c == a )
                continue;
            for(d = 5; d < 9; d++)
            {
                if(d == a || d == c)
                    continue;
                x = a +1;
                y = ((c +2*d +1)/10 + 9)%10;
                z = (c +2*d +1)%10;
                e = 31-a-c-d-x-y-z;
                if(x != a && y != a && z != a && e != a
                    && x != 9 && y != 9 && z != 9 && e != 9
                    && x != c && y != c && z != c && e != c
                    && x != d && y != d && z != d && e != d
                    && x != 5 && y != 5 && z != 5 && e != 5
                    && x != 0 && y != 0 && z != 0 && e != 0                    
                    && x != y && x != z && x != e && y != z
                    && y != e && z != e
                    && 10000*a +9000   +100*c +10*d +e +2*(100*d +50)
                    == 10000*x +1000*y +100*z +10*d +e)
                {
                    printf("%2d%2d%2d%2d%2d\n", a, 9, c, d, e);
                    printf("%*d%2d%2d\n", 6, d, 5, 0);
                    printf("+%*d%2d%2d\n", 5, d, 5, 0);
                    printf("%10s------------\n", "------------");
                    printf("%2d%2d%2d%2d%2d\n", x, y, z, d, e);
                }
            }
        }
    }
}

回复列表 (共144个回复)

131 楼

关于拉丁方阵的问题,我在网上找到一种方法(与vcacm的方法相同),就是分析拉丁方阵的规律:
若将每 一行中第一列的数字和最后一列的数字连起来构成一个环,则该环正好是由1到N顺序构成;对于第i行,这个环的开始数字为i。按照 此规律可以很容易的写出程序。
按照这个方法编写程序当然很容易,同时也相当于认定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
观察这个方阵,的确每一行都是一个环,因此左上角起始的元素就决定了一个方阵,共有N种起始元素,因此总共有N个不同的方阵。
我觉得这方法真的很不错,问题是所有的拉丁方阵确实都是这样的吗?如果不是,那么这样找出所有的拉丁方阵就是错的了,如果是的话,那就不应该再使用其它方法了吧。

132 楼

作者:小村
专家分:1800
 
 会员信息
 发短消息  
 所属BLOG  
 发表时间:2006-4-20 13:03:00    [回复]  [引用] 
85 楼  
To eastcowboy 兄,我首先非常佩服他的这种一丝不苟的精神.自己都达到这么一个水平了,还一道不落的做这种入门的题.希望他能将这种精神坚持下去,一定有一天会变的更牛的.
但是我要吹毛求疵一下了:eastcowboy 兄的第四题的算法有一点问题,最终的拉丁矩阵总数并不是2*n!种,应该是n!*(n-1)!种,对于一种已经成立的拉丁矩阵应该是对其的行和列分别对其进行全排列才对,但是这样又会重复n倍(因为对行进行全排列的时候对列已经排列了n次了).另外对eastcowboy 兄的程序当输入2的时候会出现重解.

还有,对于进制转换的程序,eastcowboy 兄的程序只能转换整数,既然已经自己动手了,那就动的再好一些啦,应该能转换小数才完美呀.

133 楼

[quote]关于拉丁方阵的问题,我在网上找到一种方法(与vcacm的方法相同),就是分析拉丁方阵的规律:
若将每 一行中第一列的数字和最后一列的数字连起来构成一个环,则该环正好是由1到N顺序构成;对于第i行,这个环的开始数字为i。按照 此规律可以很容易的写出程序。
按照这个方法编写程序当然很容易,同时也相当于认定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
观察这个方阵,的确每一行都是一个环,因此左上角起始的元素就决定了一个方阵,共有N种起始元素,因此总共有N个不同的方阵。
我觉得这方法真的很不错,问题是所有的拉丁方阵确实都是这样的吗?如果不是,那么这样找出所有的拉丁方阵就是错的了,如果是的话,那就不应该再使用其它方法了吧。
[/quote]

兄弟,我实在是误人子弟,我那时把问题想得太简单了,根本没有去思考,你怎么也这样呀.

这只不过是表面的,不全.

它应该有好多种方法.N!*(N-1)! .

你用计算机摸拟搜索一下就明白了...

真的很对不起!!!

可以加我QQ聊聊:85541211

134 楼

大哥们,帮我解解吧,明天要交卷的

135 楼

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

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

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

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

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

   (5)如果E参加,那么A和D也都参加。
*/
#include <stdio.h>
#include "Functions.h"

typedef unsigned short bool;
bool A,B,C,D,E; 

bool Verify()
{
    return 
    (
        (!A || (A && B)) 
        && (B^C)
        && !(C^D) 
        && (D||E) 
        && (!E || (E&&A&&D))
    );
}

int main()
{
    for(A=0;A<=1;A++)
        for(B=0;B<=1;B++)
            for(C=0;C<=1;C++)
                for(D=0;D<=1;D++)
                    for(E=0;E<=1;E++)
                    {
                        if(Verify())
                            printf("A=%d,B=%d,C=%d,D=%d,E=%d\r\n",A,B,C,D,E);
                        else
                            printf("Error:A=%d,B=%d,C=%d,D=%d,E=%d\r\n",A,B,C,D,E);
                    }

}

136 楼

/*
 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
*/
#include <stdio.h>
#include "Functions.h"

char printChars[]={'T','J','1','2','3','4','5','6','7','8','9'};

int Min(int a,int b)
{
    return (a>b)?b:a;
}

int Max(int a,int b)
{
    return (a>b)?a:b;
}

char getPrintChar(int N,int i)
{
    if(i==1 || i==N) return 'T';
    if(i==2 || i==N-1) return 'J';
    if(i<=N/2)
        return (i-2)+'0';
    else
        return (N-1-i)+'0';    
}


void PrintNMatrix(int N)
{
    if(N<=3 || N>=20)
    {
        WriteLn("Error!!Please make N>3 And N<20");
        exit(1);
    }
    int i=1,j=1;
    for(j=1;j<=N;j++)
    {
        for(i=1;i<=N;i++)
        {
            printf(" %c",getPrintChar(N,Min(abs(i-1),abs(i-N))<=Min(abs(j-1),abs(j-N))?i:j));
        }
        printf("\r\n");
    }
}

int main()
{
    int N;
    WriteLn("Please Input N:");
    scanf("%d",&N);
    PrintNMatrix(N);    
}

137 楼

/*
  5. 输入一个十进数,将其转换成 N 进制数(0<N<=16)。
*/
#include <stdio.h>
#include "functions.h"

//#include <winsock2.h>

int main()
{
    char nums[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    unsigned int bits;
    int num;
    int i=0,j=0;
    
    input:
    WriteLn("请输入进制数,以及一个十进制数字:");
    scanf("%u,%d",&bits,&num);
    if(bits<1 || bits>16)
    {
        WriteLn("请输入正确的数字,格式:%d,%d");
        goto input;
        exit(1);
    }
        
    int num_div=abs(num);
    int num_mod;
    char nBitsMods[100];
    char nBitsNums[100];
    memset(nBitsMods,0,100);
    memset(nBitsNums,0,100);
    
    //使用短除法获取N进制数字 
    for(i=0;i<100;i++)
    {
        if(bits != 1)
        { 
            num_mod=num_div%bits;
            num_div=num_div/bits;
            nBitsMods[i]=nums[num_mod];
            if(num_div==0)
                break;
        }
        else
        {
            nBitsMods[i]='1';
            if(i==num_div-1)
                break;
        } 
    }
    
    //判断输入的数字是否负数 
    if(num<0)
        nBitsNums[j++]='-';
        
    //通过指针获取 
    char* ptr = &nBitsMods[i];
    while(ptr>=nBitsMods)
    {
        nBitsNums[j++]=*ptr;
        ptr--;
    }
    
    /*
    for(;i>=0;i--)
    {
        nBitsNums[j++]=nBitsMods[i];
    }
    */
    
    //printf("%s\r\n",ptr);
    printf("%s\r\n",nBitsNums);
    //printf("%d",-10%3); 
     
}

138 楼

简化了一下
/*
  5. 输入一个十进数,将其转换成 N 进制数(0<N<=16)。
  修改日期:2007-07-14 
*/
#include <stdio.h>
#include "functions.h"

int main()
{
    unsigned int bits;
    int num,i=0;
    
    input:
    WriteLn("请输入进制数,以及一个十进制数字:");
    scanf("%u,%d",&bits,&num);
    if(bits<1 || bits>16)
    {
        WriteLn("请输入正确的数字,格式:%d,%d");
        goto input;
        exit(1);
    }
        
    int num_div=abs(num);
    unsigned char nBitsMods[100];

    do
    {
        if(bits != 1)
        {
            nBitsMods[i++]=num_div%bits;
            num_div=num_div/bits;
        }
        else
        {
            nBitsMods[i++]='1';
            num_div--;
        }
    }
    while(num_div);
    
    //判断输入的数字是否负数 
    if(num<0)
        printf("-");
    for(--i;i>=0;i--)
    {
        printf("%x",nBitsMods[i]);
    }
    printf("\r\n");

}

139 楼

/*第三题*/
#include <stdio.h>
int main()
{
    int i,j,n,min;
    printf("Please input the value of n:\n");
    scanf("%d",&n);
    if(n > 3 && n < 20)
    {
        for (i = 1; i <= n; i++)
        {
            for(j = 1; j <= n; j++)
            {
             min =(i>j?j:i)>(n+1-i>n+1-j?n+1-j:n+1-i)?(n+1-i>n+1-j?n+1-j:n+1-i):(i>j?j:i);
              switch(min)
               {
                case 1: printf("T"); break;
                case 2: printf("J"); break;
                default: printf("%d",min - 2);
                 }
            }
            printf("\n");
        }
    }
    else
    {
        printf("The value of n should larger than 3 and smaller than 20!");
    }
    return 0;
}

140 楼

楼主太强了,看了你的解答,感觉自己学的C语言只能算点皮毛了,汗颜,得加把劲了;》。。。。。。

我来回复

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