回 帖 发 新 帖 刷新版面

主题:入门必做的题

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

101 楼

//第五题我也来一个,用栈的:
#include<iostream>
#include<stack>
using namespace std;

void NumConversion(double num)
{

    stack<int> iS;
    int sign=0;
    int N;
    cout<<"Please select the mace number(N<=16):\t";
    cin>>N;
    //处理负数
    if(num<0)
    {
        cout<<'-';
        num*=-1;
        sign=1;
    }    
    int iNum=(int)num;
    while(iNum)
    {
        iS.push(iNum%N);
        iNum/=N;
    }
    cout<<num<<"的"<<N<<"进制数表示是:\t";
    if(sign)
        cout<<'-';
    while(!iS.empty())
    {
        if(iS.top()<10)
        cout<<iS.top();
        else
        switch(iS.top())
        {
            case 10:
                cout<<'A';break;
            case 11:
                cout<<'B';break;
            case 12:
                cout<<'C';break;
            case 13:
                cout<<'D';break;
            case 14:
                cout<<'E';break;
            case 15:
                cout<<'F';break;
            default:
                break;
        }
        iS.pop();
    }
    cout<<'.';
    double dNum=num-(int)num;
    if(dNum==0.0)
        cout<<"000000";
    sign=0;
    while(dNum)
    {
        dNum*=N;        
        if((int)dNum<10)
            cout<<(int)dNum;
        else
        switch((int)dNum)
        {
            case 10:
                cout<<'A';break;
            case 11:
                cout<<'B';break;
            case 12:
                cout<<'C';break;
            case 13:
                cout<<'D';break;
            case 14:
                cout<<'E';break;
            case 15:
                cout<<'F';break;
            default:
                break;
        }
        dNum-=(int)dNum;
        sign++;
        if(sign==12)
            break;
    }
    cout<<endl;
}
void main()
{
    double num;
    cout<<"Please input the number:\t";
    cin>>num;
    NumConversion(num);
}

102 楼

大虾!~有答案吗?
  作了,但是有些不懂

  email:114005255@qq.com

103 楼

第一题是不是有问题,X的值显然是0;而且算出来的结果也很多啊。

104 楼

/******************************************************************************
16. 设有8枚硬币a,b,c,d,e,f,g,h,其中有一枚硬币是伪造的。
 真伪硬币的区别仅是重量不同,可能重,可能轻。今要求以天平为工具,用最少的
 比较次数挑出伪造硬币,并鉴定它是重还是轻。
*******************************************************************************/
/*=============================================================================
根据交叉相称法:最多为三次,最少为二次!
第一称:任取6个球相称
第二称:根据第一称情况灵活比较
第三称:根据一,二称的情况灵活比较
===============================================================================  */
#include<stdio.h>
void main()
{
    int arr[8]={0};     //8个球 初始化为0;
    int temp,dig;
    printf("请输入有问题的球号:");
    scanf("%d",&dig);
    printf("请输入是轻还是重<轻为-1,重为1>:");             //1为重,-1为轻
    scanf("%d",&temp);
    arr[dig-1]=temp;
    if (arr[0]+arr[1]+arr[2] == arr[3]+arr[4]+arr[5])  //第一称任取6个球相称   且相等
    {
        printf("第一次称: 1 2 3球与4 5 6 球相等!\n");
        if (arr[6] == arr[0])      //若一称平衡   ,则有问题的球在 7 8两球中  任取其一称
        {
            printf("第二次称: 7球与 1球相等!");         // 若取的球平衡,则是最后一球有问题  称之
            if (arr[7]<arr[0])     
            {
                printf("第三次称: 8球比 1球轻!\n");
                printf("8号球偏轻");
            }
            else
            {
                printf("第三称: 8球比 1球重!\n");
                printf("8号球偏重");
            }
        }
        else 
            if (arr[6]<arr[0])             //若取的球不平衡  则找出有问题的球
            {
                printf("第二次称: 7球比 1球轻!\n");        
                printf("7号球偏轻");
            }
            else
            {
                printf("第二次称: 7球比 1球重!\n");
                printf("7号球偏重");
            }
    }
    else                                    //若一称不平衡
        if (arr[0]+arr[1]+arr[2] > arr[3]+arr[4]+arr[5])            //左边重  
        {
            printf("第一次称: 1 2 3球比 4 5 6球重!\n");           //交换相称
            if (arr[0]+arr[3]+arr[6] == arr[4]+arr[1]+arr[7])       //若相等   则有问题的球在被换出的两球之中
            {
                printf("第二次称: 1 4 7球与 4 2 8球相等!\n");     //取任一有问题的球与一正常球称
                if (arr[2] == arr[7])                               //若相等 则另一球有问题 根据前二次称的情况判别轻重
                {
                    printf("第三次称: 3球与 8球相等!\n");
                    printf("6号球偏轻");
                }
                else
                {
                    printf("第三次称: 3球比 8球重!\n");
                    printf("3号球偏重");
                }
            }
            else 
                if(arr[0]+arr[3]+arr[6] > arr[4]+arr[1]+arr[7])        //若不等,则有问题的球在称中
                {
                    printf("第二次称: 1 4 7球比 5 2 8球轻!\n");    
                    if (arr[0] == arr[7])                            //根据前二次情况,取一球称第三次  若相等,则另一球有问题,并根据前二次判断轻重
                    {
                        printf("第三次称: 1球与 8球相等!\n");
                        printf("5号球偏轻");
                    }
                    else
                    {
                        printf("第三次称: 1球比 8球重!\n");
                        printf("1号球偏重");
                    }
                }
                else
                {
                    printf("第二次称: 1 4 7球比 5 2 8球轻!\n");
                    if (arr[3]<arr[7])                              //若不等   则该球有问题,并判断轻重
                    {
                        printf("第三次称: 4球比 8球轻!\n");
                        printf("4号球偏轻");
                    }
                    else
                    {
                        printf("第三次称: 4球与 8球相等!\n");
                        printf("2号球偏重");
                    }
                }
        }
        else
            if (arr[0]+arr[1]+arr[2] < arr[3]+arr[4]+arr[5])         //同上理
            {
                printf("第一次称: 1 2 3球比 4 5 6球轻!\n");
                if (arr[0]+arr[3]+arr[6] == arr[4]+arr[1]+arr[7])
                {
                    printf("第二次称: 1 4 7球与 4 2 8球相等!\n");
                    if (arr[2] == arr[7])
                    {
                        printf("第三次称: 3球与 8球相等!\n");
                        printf("6号球偏重");
                    }
                    else
                    {
                        printf("第三次称: 3球比 8球轻!\n");
                        printf("3号球偏轻");
                    }
                }
                else 
                    if(arr[0]+arr[3]+arr[6] < arr[4]+arr[1]+arr[7])
                    {
                        printf("第二次称: 1 4 7球比 4 2 8球轻!\n");
                        if (arr[0] == arr[7])
                        {
                            printf("第三次称: 1球与 8球相等!\n");
                            printf("5号球偏重");
                        }
                        else
                        {
                            printf("第三次称: 1球比 8球轻!\n");
                            printf("1号球偏轻");
                        }
                    }
                    else
                    {
                        printf("第二次称: 1 4 7球比 4 2 8球重!\n");
                        if (arr[3]==arr[7])
                        {
                            printf("第三次称: 4球与 8球相等!\n");
                            printf("2号球偏轻");
                        }
                        else
                        {
                            printf("第三次称: 4球比 8球重!\n");
                            printf("4号球偏重");
                        }
                    }
            }
            printf("\n");
}

105 楼

上接 第 8 页 [第  76 楼]

//第 8 题解答
//写得有点复杂了
#include <cassert>
#include <iostream>
#include <algorithm>
using namespace std;

//十进制转二进制
char* DecimalToBinary(char* Dst, int Src)
{
    assert(Dst);
    assert(Src >= 0);

    char* Dest = Dst;
    int Itr = 31;
    while((Src&(1<<Itr--)) == 0);
    ++Itr;
    while(Itr>=0)
        *Dest++ = ((Src&(1<<Itr--)) > 0)?'1':'0';
    *Dest = 0;
    return Dst;
}

//二进制转十进制
unsigned int BinaryToDecimal(unsigned int& Dst, const char* Src)
{
    assert(Src);

    Dst = 0;
    int Itr = static_cast<int>(strlen(Src)) - 1;
    while(Itr >= 0)
        Dst |= (*Src++ - '0')<<Itr--;
    return Dst;
}

//二进制加法
char* BinaryAdd(char* Result, const char* Lhs, const char* Rhs)
{
    assert(Result);
    assert(Lhs);
    assert(Rhs);

    const char* LhsEnd = Lhs + strlen(Lhs) - 1;
    const char* RhsEnd = Rhs + strlen(Rhs) - 1;
    char* Dest   = Result;
    char Carry = 0;

    while(LhsEnd >= Lhs || RhsEnd >= Rhs)
    {
        *Dest++ = '0' + ((Carry += ((LhsEnd>=Lhs)?*LhsEnd---'0':0) + 
((RhsEnd>=Rhs)?*RhsEnd---'0':0))?(Carry%2):0);
        Carry = Carry?(Carry/2):0;
    }
    if(Carry)
        *Dest++ = '0' + Carry;
    *Dest = 0;
    std::reverse(Result, Dest);
    return Result;
}

int main()
{
    char Lhs[sizeof(int)*8+1];
    char Rhs[sizeof(int)*8+1];
    char Result[sizeof(int)*8+1];
    char* Operand[] = {Lhs, Rhs};

    unsigned int Tmp = 0;
    for(int i = 0; i < 2; ++i)
    {
        cin>>Tmp;
        cout<<DecimalToBinary(Operand[i], Tmp)<<endl;
    }

    cout<<BinaryToDecimal(Tmp, BinaryAdd(Result, Operand[0], Operand[1]))<<endl;
    return 0;
}

//第 九 题解答
//输者加所有赢者的火柴数之和的一半,所有赢者手中火柴数减半。
#include <iostream>
using namespace std;

void Play(int Ary[], int nPlayers, int Winner)
{
    if(Winner > nPlayers)
        return;
    for(int i = 0; i < nPlayers; ++i)
        if(i != Winner-1)
            Ary[Winner-1] += Ary[i] /= 2;
    Play(Ary, nPlayers, Winner+1);
}
int main()
{
    int Ary[4] = {16, 16, 16, 16};
    Play(Ary, 4, 1);
    for(int i = 0; i < 4; ++i)
        cout<<Ary[i]<<'\t';
    return 0;
}


//第 十三 题解答
#include <iostream>
#include <vector>
using namespace std;

ostream& operator<<(ostream& Dst, const vector<bool>& Src)
{
    vector<bool>::const_iterator Itr = Src.begin();
    while(Itr != Src.end())
        Dst<<char((*Itr++)?'*':'0');
    return Dst;
}

void Play(vector<bool>& Src)
{
    for(unsigned int x = 0; x < Src.size(); ++x)
    {
        for(unsigned int y = 0; y < Src.size(); ++y)
            if(y != x)
                Src[y] = !Src[y];
        cout<<Src<<endl;
    }
}


int main()
{
    unsigned n = 100;
    if(cin>>n)
    {
        vector<bool> Src;
        Src.assign(n, true);
        Play(Src);
    }

    return 0;
}



//第 十四 题解答
#include <iostream>
#include <algorithm>
using namespace std;

void Move(char Ary[], int Size)
{
    for(int x = Size/2-1, Dst = Size-1; x > 0; --x, Dst -=2)
        for(int y = x+1; y < Dst; ++y)
            cout<<(swap(Ary[y-1], Ary[y]), Ary)<<endl;
}

int main()
{
    unsigned int n = 0;
    if(cin>>n)
    {
        char* Buffer = new char[2*n+1];
        Buffer[2*n] = 0;
        for(int i = 0; i < 2*n; ++i)
            Buffer[i] = (i>=n)?'0':'*';
        cout<<Buffer<<endl;
        Move(Buffer, n*2);
        delete [] Buffer;
    }
    return 0;
}


//第 十七 题解答
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;

void Swap(string::iterator Lhs, string::iterator Rhs)
{
    char Tmp = *Lhs;
    *Lhs = *Rhs;
    *Rhs = Tmp;
}

string& Sort(string& Ary)
{
    string::iterator FItr = Ary.begin();
    string::iterator CItr;
    char  Alpha = 'A';
    while(FItr != Ary.end())
        if(*FItr <= 'A' || *FItr >= 'Z')
            ++FItr;
        else
            if((CItr = find(FItr, Ary.end(), Alpha))!= Ary.end())
                Swap(FItr++, CItr);
            else
                if(++Alpha > 'Z')
                break;
    return Ary;
}

const char Delim = '^';//终止符

int main()
{
    string Buffer;
    if(getline(cin, Buffer, Delim))
        cout<<Sort(Buffer)<<endl;
    return 0;
}


//下接 第 11 页[第  107 楼]

106 楼

第16题里对于所有情况,硬币问题都能称两次就解决的.
程序也不难.
一点建议:在数据结构上作文章.

107 楼

上接 第 11 页[第  105 楼]

//第 十八 题解答
#include <iostream>
#include <algorithm>
using namespace std;

void Play(char Ary[], int Space, int Size, char Chr)
{
    static char Over;
    Over = true;

    for(int x = (Size+1)/2; x < Size; ++x)
        if(Ary[x] != Chr)
        {
            Over = false;
            break;
        }

    if(Over)
    {
        cout<<Ary<<endl;
        return;
    }

    for(int y = std::max(Space-2, 0); y <= std::min(Size-1, Space+2); ++y)
        if((y - Space == -2 && Ary[y] == Chr && Ary[y+1] != Chr)
            ||(y-Space == -1 && Ary[y] == Chr)
            ||(y-Space == 1 && Ary[y] != Chr)
            ||(y-Space == 2 && Ary[y] != Chr && Ary[y-1] == Chr))
        {
            swap(Ary[y], Ary[Space]);
            Play(Ary, y, Size, Chr);
            swap(Ary[y], Ary[Space]);
            if(Over)
            {
                cout<<Ary<<endl;
                break;
            }
        }
}

int main()
{
    unsigned int n;
    if(cin>>n)
    {
        char* Ary = new char[n*2+2];
        Ary[n*2+1] = 0;
        for(int i = 0; i < n*2+1; ++i)
            Ary[i] = (i<n)?'B':((i==n)?' ':'A');
        Play(Ary, n, n*2+1, 'B');
        delete [] Ary;
    }
    return 0;
}


//待续...

108 楼

[quote]第16题里对于所有情况,硬币问题都能称两次就解决的...[/quote]

在不知道伪造硬币比真硬币轻还是重的情况下,2 次应该搞不定吧...

16. 设有8枚硬币a,b,c,d,e,f,g,h,其中有一枚硬币是伪造的。
 真伪硬币的区别仅是重量不同,可能重,可能轻。今要求以天平为工具,用最少的
 比较次数挑出伪造硬币,并鉴定它是重还是轻。

109 楼

//18题,非穷举解法。
#include <iostream.h>

const int Max=7;
int t[Max];
int count=0;
void Init()
{
    for (int i=0; i<Max/2; i++)
    {
        t[i]=-1;
        t[Max-i-1]=1;
    }
}
void output()
{
    for (int i=0; i<Max; i++)
    {
        if (t[i]==-1) cout<<"a ";
        else if (t[i]==1) cout<<"b ";
        else cout<<"  ";
    }
    cout<<endl;
}
void change(int a, int b)
{
    int temp=t[a];
    t[a]=t[b]; t[b]=temp;
}
int condition()
{
    int sum1=0, sum2=0;
    for (int i=0; i<Max/2; i++)
    {
        sum1+=t[i];
        sum2+=t[Max-i-1];
    }
    if ( (sum1 == Max/2) && (sum2 == -sum1))
        return 0;
    return 1;
}
void a_jump(int &flag)
{
    for (int i=0; i<Max-2; i++)
        if ( t[i]==-1 && t[i+1]==1 && t[i+2]==0 )
        { change(i,i+2); output(); count++; flag=0;}
}
void b_jump(int &flag)
{
    for (int i=0; i<Max-2; i++)
        if ( t[i]==0 && t[i+1]==-1 && t[i+2]==1 )
        { change(i,i+2); output(); count++; flag=0;}
}
void a_move(int &flag)
{
    for (int i=0; i<Max-1; i++)
        if ( t[i]==-1 && t[i+1]==0 && (i==0 || t[i-1]!=t[i+2] ))
        { change(i, i+1); output(); count++; flag=0;}
}
void b_move(int &flag)
{
    for (int i=0; i<Max-1; i++)
        if ( t[i]==0 && t[i+1]==1 && (i==Max-2 || t[i-1]!=t[i+2] ))
        { change(i, i+1); output(); count++; flag=0;}
}
void fun()
{
    Init();
    output();
    int i, flag;
    while( condition() )
    {
        flag=1;
        if (flag) a_jump(flag);
        if (flag) b_jump(flag);
        if (flag) b_move(flag);
        if (flag) a_move(flag);
    }
    cout<<Max-1<<"个字母时,"<<endl;
    cout<<"一共最少需移动"<<count<<"次"<<endl;
}
void main()
{
    fun();
}

110 楼

16题可以的,不用知硬币重了还是轻了的,而且称法还有很多种.

详情可以到这个网址http://www.programfan.com/club/showbbs.asp?id=151108&page=1
去参考一下.
盛赞一句,他的解法是正确的和迅速的.
但有投机之嫌和思维局限:
1,它是靠人事先计算好一切的,而非靠计算机.
2,它的穷举是是穷举所有表的结果情况,可惜了点,穷举法来穷举所有可执行方案的表岂不妙哉?
(不过这也难怪,他是数学糸的嘛,半路出家的...嘻嘻^_^....)

我来回复

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