回 帖 发 新 帖 刷新版面

主题:入门必做的题

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

191 楼

[quote]11.&#160;巧排数字。将1、2、...、20这20个数排成一排,使得相邻的两个数之
&#160;&#160;和为一个素数,且首尾两数字之和也为一个素数。编程打印出所有的排法。

11.解答:
递归的进行全排列(当然,如果未排列完就发现不符合要求,则直接去除)
判断素数采用二分查找

#include<stdio.h>
//&#160;40以内的素数表
int&#160;PrimeTable[]&#160;=&#160;{2,3,5,7,11,13,17,19,23,29,31,37};
//&#160;函数IsPrime,判断一个数是否为素数,若是,返回1,否则返回0
//&#160;实现:采用二分查找法,在PrimeTable数组中进行查找
int&#160;IsPrime(int&#160;n)
{
&#160;&#160;&#160;&#160;int&#160;low&#160;=&#160;0;
&#160;&#160;&#160;&#160;int&#160;high&#160;=&#160;12;&#160;&#160;&#160;&#160;//&#160;40以内的素数共12个
&#160;&#160;&#160;&#160;while(&#160;low&#160;<=&#160;high&#160;)
&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;int&#160;mid&#160;=&#160;(low+high)/2;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(&#160;PrimeTable[mid]&#160;==&#160;n&#160;)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;1;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;else&#160;if(&#160;PrimeTable[mid]&#160;>&#160;n&#160;)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;high&#160;=&#160;mid-1;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;else
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;low&#160;=&#160;mid+1;
&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;return&#160;0;
}

int&#160;a[20];
int&#160;used[20]&#160;=&#160;{0};

void&#160;Solve(int&#160;start)
{
&#160;&#160;&#160;&#160;int&#160;i;
&#160;&#160;&#160;&#160;if(&#160;start&#160;==&#160;20&#160;)
&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(&#160;!IsPrime(a[0]+a[19])&#160;)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for(i=0;&#160;i<20;&#160;++i)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;printf("%4d",a[i]);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return;
&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;for(i=0;&#160;i<20;&#160;++i)
&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(&#160;used[i]&#160;)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;continue;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(&#160;start!=0&#160;&&&#160;!IsPrime(a[start-1]+i+1)&#160;)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;continue;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;used[i]&#160;=&#160;1;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;a[start]&#160;=&#160;i+1;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Solve(start+1);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;used[i]&#160;=&#160;0;
&#160;&#160;&#160;&#160;}
}

int&#160;main(void)
{
&#160;&#160;&#160;&#160;Solve(0);
}
[/quote]
在我的机器上跑了3分钟还没结束
等不下去了
呵呵

192 楼

///////////////////////////////////////////////////////////////////////////////
//
//  9. 四人玩火柴棍游戏,每一次都是三个人赢,一个人输。输的人要按赢者手中的火柴
//  数进行赔偿,即赢者手中有多少根火柴棍,输者就赔偿多少根。现知道玩过四次后,
//  每人恰好输过一次, 而且每人手中都正好有16根火柴。问此四人做游戏前手中各有
//  多少根火柴? 编程解决此问题。
///////////////////////////////////////////////////////////////////////////////
#include "iostream.h"
#include "iomanip.h"
void main()
{
    int a[4] = {16, 16, 16, 16};
    int i, j;
    for(i = 0; i < 4; i++)
    {
        for(j = 0; j < 4; j++)
        {
            if(j != i)
            {
                a[j] /=2;
                a[i] += a[j];
            }
        }
    }

    cout<<"In the begining:"<<endl;
    for(i = 0; i < 4; i++)
    {
        cout<<(char)(65+i)<<" has "<<setw(3)<<a[i]<<
            " matches, and lost at round "<<4-i<<endl;
    }
}

193 楼

第一个?

194 楼

//////////////////////////////////////////////////////////////////////////////
//
//  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;
    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("%10d\n", 10000*a +9000   +100*c +10*d +e);
                    printf("%10d\n", 100*d +50);
                    printf("+%9d\n", 100*d +50);
                    printf("------------\n");
                    printf("%10d\n", 10000*x +1000*y +100*z +10*d +e);
                //    return;
                }
            }
        }
    }
}


//////////////////////////////////////////////////////////////////////////////
//
//  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>
static bool a[5];
bool judge(void)
{
    if(a[0])
        a[1] = 1;
    a[3] = a[2] = !a[1];
    if(a[4])
        return (a[0] && a[3])?true:false;
    else    
        return a[3]?true:false;
}
void main()
{
    int i = 0;
    while(!judge())
        a[i] = !a[i++];
    for(i = 0; i < 5; i++)
        printf("%c = %d  ", 65+i, a[i]);
}

195 楼

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

196 楼

//////////////////////////////////////////////////////////////////////////////
//
//  7. 读入一行文本,包含若干个单词(以空格间隔,%结尾)。将其中以 A 开头的
//  单词与以 N 结尾的单词,用头尾交换的办法予以置换。
//  
//    i am  a student what about you region code modern%
//    i ma  a student what tboua you negior code noderm
//////////////////////////////////////////////////////////////////////////////

#include "stdio.h"

void main()
{
    char str[] = "i am  a student what about you region code modern%";
    char *p, *q, temp;
    p = q = str;
    while(*p != '%')
    {
        if(*p == ' ')
            while(*p == ' ')
                printf("%c", *p++);
        q = p;
        while(*p != ' ' && *p != '%')
            p++;
        if(*q == 'a' || *(p-1) == 'n')
        {
            temp   = *q;
            *q     = *(p-1);
            *(p-1) = temp;
        }
        while(q != p)
            printf("%c", *q++);
    }
}

197 楼

//////////////////////////////////////////////////////////////////////////////
//
// 37. 已知 N 个正整数满足 K1+K2+...+Kn=M。求一组最佳的分解,使得
// K1*K2*....*Kn 为最大。
//   例如:N=2时,给定 K1+K2=6,当 K1=3,K2=3 时,K1*K2=9 为最大
//////////////////////////////////////////////////////////////////////////////
思想是:尽量使各个分因子的数值大小相近(不知道这个思想对不)
#include "stdio.h"
void main()
{
    unsigned int n ,sum, mod, i;
    unsigned long product =1;
    printf("input N and SUM spaced by space [SUM >= N]:");
    scanf("%d %d", &n, &sum);
    unsigned int *a = new unsigned int[n];
//    ASSERT(sum >= n);
    for(i = 0; i < n; i++)
        a[i] = sum/n;
    mod = sum%n;
    for(i = 0; i < mod; i++)
        a[i] += 1;
    for(i = 0; i < n; i++)
    {
        printf("%-5d", a[i]);
        product *= a[i];
    }
    printf("\nthe maximal product is %ld\n", product);
}

198 楼

题目好啊。。可以的话把题目源说一些啊。。。。大家一起分享啊。。。谢谢。。。。

199 楼

//////////////////////////////////////////////////////////////////////////////
//
//6. 矩阵中填数. 当给出 N*N 的矩阵,要求用程序填入下列形式的数:
//   ① 倒填,例如N=5             ② 蛇形填数              ③ 回转填数
//
// ┌─┬─┬─┬─┬─┐   ┌─┬─┬─┬─┬─┐   ┌─┬─┬─┬─┬─┐
// │25│24│23│22│21│   │ 1│ 3│ 4│10│11│   │ 1│16│15│14│13│
// ├─┼─┼─┼─┼─┤   ├─┼─┼─┼─┼─┤   ├─┼─┼─┼─┼─┤
// │20│19│18│17│16│   │ 2│ 5│ 9│12│19│   │ 2│17│24│23│12│
// ├─┼─┼─┼─┼─┤   ├─┼─┼─┼─┼─┤   ├─┼─┼─┼─┼─┤
// │15│14│13│12│11│   │ 6│ 8│13│18│20│   │ 3│18│25│22│11│
// ├─┼─┼─┼─┼─┤   ├─┼─┼─┼─┼─┤   ├─┼─┼─┼─┼─┤
// │10│ 9│ 8│ 7│ 6│   │ 7│14│17│21│24│   │ 4│19│20│21│10│
// ├─┼─┼─┼─┼─┤   ├─┼─┼─┼─┼─┤   ├─┼─┼─┼─┼─┤
// │ 5│ 4│ 3│ 2│ 1│   │15│16│22│23│25│   │ 5│ 6│ 7│ 8│ 9│
// └─┴─┴─┴─┴─┘   └─┴─┴─┴─┴─┘   └─┴─┴─┴─┴─┘
//////////////////////////////////////////////////////////////////////////////

// 6.1
#include "stdio.h"
void main()
{
    int n, i, j;
    scanf("%d", &n);
    int t = n*n;
    for(i = n; i > 0; i--)
    {
        for(j = n; j > 0; j--)
            printf("%5d", t--);
        printf("\n");
    }
}

// 6.2
#include "stdio.h"
#define N 15
void main()
{
    int sum, j, t = 1;
    static int a[N][N];
    for(sum = 0; sum < 2*N -1; sum++)
        for(j = ((sum < N)?0:sum-(N-1)); j <= ((sum < N)?sum:(N-1)); j++)
            (sum%2)?(a[j][sum-j] = t++):(a[sum-j][j] = t++); //(sum%2)控制环绕方向
    for(sum = 0; sum < N; sum++)
    {
        for(j = 0; j < N; j++)
            printf("%5d", a[sum][j]);
        printf("\n");
    }
}

// 6.3
#include <stdio.h>
#define elem a[j][i] //用于控制方向, 若改为a[i][j], 则方向相反
#define N 6
void main()
{
    static int a[N][N], i, j, num;
    int start = 0, end = N -1;
    for(int t =0; t <= N/2; t++, start++, end--, i++, j++)
    {    
        for(i = start; i < end; i++)
            elem = ++num;
        for(j = start; j < end; j++)
            elem = ++num;
        for(i = end; i > start; i--)
            elem = ++num;
        for(j = end; j > start; j--)
            elem = ++num;
        if(start == end)
            a[start][end] = ++num;
    }
    for(i = 0; i < N; i++)
    {
        for(j = 0; j < N; j++)
            printf("%4d", a[i][j]);
        printf("\n");
    }
}

200 楼

//////////////////////////////////////////////////////////////////////////////
//
// 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>
#define N 15
void main()
{
    static char a[N][N], i, j, num;
    int start = 0, end = N -1;
    char str[] = "TJ12345678", ch;
    for(int t =0; t <= N/2; t++, start++, end--, i++, j++)
    {    
        ch = *(str + t);
        for(i = start; i < end; i++)
            a[i][j] = ch;
        for(j = start; j < end; j++)
            a[i][j] = ch;
        for(i = end; i > start; i--)
            a[i][j] = ch;
        for(j = end; j > start; j--)
            a[i][j] = ch;
        if(start == end)
            a[start][end] = ch;
    }
    for(i = 0; i < N; i++)
    {
        for(j = 0; j < N; j++)
            printf("%c", a[i][j]);
        printf("\n");
    }
}

我来回复

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