主题:入门必做的题
GCC
[专家分:14380] 发布于 2006-04-14 11:53:00
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 楼
wuchengwei [专家分:1650] 发布于 2006-05-19 21:25:00
[quote]11. 巧排数字。将1、2、...、20这20个数排成一排,使得相邻的两个数之
  和为一个素数,且首尾两数字之和也为一个素数。编程打印出所有的排法。
11.解答:
递归的进行全排列(当然,如果未排列完就发现不符合要求,则直接去除)
判断素数采用二分查找
#include<stdio.h>
// 40以内的素数表
int PrimeTable[] = {2,3,5,7,11,13,17,19,23,29,31,37};
// 函数IsPrime,判断一个数是否为素数,若是,返回1,否则返回0
// 实现:采用二分查找法,在PrimeTable数组中进行查找
int IsPrime(int n)
{
    int low = 0;
    int high = 12;    // 40以内的素数共12个
    while( low <= high )
    {
        int mid = (low+high)/2;
        if( PrimeTable[mid] == n )
            return 1;
        else if( PrimeTable[mid] > n )
            high = mid-1;
        else
            low = mid+1;
    }
    return 0;
}
int a[20];
int used[20] = {0};
void Solve(int start)
{
    int i;
    if( start == 20 )
    {
        if( !IsPrime(a[0]+a[19]) )
            return;
        for(i=0; i<20; ++i)
            printf("%4d",a[i]);
        return;
    }
    for(i=0; i<20; ++i)
    {
        if( used[i] )
            continue;
        if( start!=0 && !IsPrime(a[start-1]+i+1) )
            continue;
        used[i] = 1;
        a[start] = i+1;
        Solve(start+1);
        used[i] = 0;
    }
}
int main(void)
{
    Solve(0);
}
[/quote]
在我的机器上跑了3分钟还没结束
等不下去了
呵呵
192 楼
wuchengwei [专家分:1650] 发布于 2006-05-19 21:34:00
///////////////////////////////////////////////////////////////////////////////
//
// 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 楼
njelement [专家分:0] 发布于 2006-05-20 10:27:00
第一个?
194 楼
wuchengwei [专家分:1650] 发布于 2006-05-20 11:39:00
//////////////////////////////////////////////////////////////////////////////
//
// 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 楼
396786806 [专家分:0] 发布于 2006-05-20 12:12:00
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 楼
wuchengwei [专家分:1650] 发布于 2006-05-20 13:22:00
//////////////////////////////////////////////////////////////////////////////
//
// 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 楼
wuchengwei [专家分:1650] 发布于 2006-05-20 13:39:00
//////////////////////////////////////////////////////////////////////////////
//
// 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 楼
AWT8GUI [专家分:320] 发布于 2006-05-20 19:09:00
题目好啊。。可以的话把题目源说一些啊。。。。大家一起分享啊。。。谢谢。。。。
199 楼
wuchengwei [专家分:1650] 发布于 2006-05-20 21:42:00
//////////////////////////////////////////////////////////////////////////////
//
//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 楼
wuchengwei [专家分:1650] 发布于 2006-05-20 22:02:00
//////////////////////////////////////////////////////////////////////////////
//
// 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");
}
}
我来回复