主题:[讨论]GCC入门题部分题目解答
wuchengwei
[专家分:1650] 发布于 2006-11-03 03:44:00
以下程序在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);
}
}
}
}
}
最后更新于:2007-06-01 02:37:00
回复列表 (共144个回复)
81 楼
瞬间移动 [专家分:320] 发布于 2006-11-30 20:55:00
//////////////////////////////////////////////////////////////////////////////
//
// 11. 巧排数字。将1、2、...、20这20个数排成一排,使得相邻的两个数之
// 和为一个素数,且首尾两数字之和也为一个素数。编程打印出所有的排法。
///////////////////////////////////////////////////////////////////////////
[em10][color=FF0000]看不懂啊,递归好难看懂。楼主能解释一下么[/color]?
#include "stdio.h"
#include "math.h"
static int used[21], link[21];
bool isprime(int a)
{
for(int i = 2; i <= sqrt(a); i++)
{
if(!(a%i))
return false;
}
return true;
}
void trace(int node) //不知道这个函数是怎么运行的,递归出口在哪?
{ //怎么算完所有情况的?好难明白呀!运行时又一
int i; //直在跳,都不停下,好多种排列啊!
if((node == 21) && isprime(link[20] + link[1]))
{
for(i = 1; i < 21; i++)
printf("%4d", link[i]);
putchar(10);
}
for(i = 1; i <= 20; i++)
{
if(!used[i])
{
link[node] = i;
used[i] = 1;
if(isprime(link[node]+link[node-1]))
trace(node+1);
used[i] = 0;
}
}
}
void main()
{
trace(1);
}
82 楼
wuchengwei [专家分:1650] 发布于 2006-11-30 22:40:00
[quote]
//////////////////////////////////////////////////////////////////////////////
//
// 11. 巧排数字。将1、2、...、20这20个数排成一排,使得相邻的两个数之
// 和为一个素数,且首尾两数字之和也为一个素数。编程打印出所有的排法。
///////////////////////////////////////////////////////////////////////////
[em10][color=FF0000]看不懂啊,递归好难看懂。楼主能解释一下么[/color]?
#include "stdio.h"
#include "math.h"
static int used[21], link[21];
bool isprime(int a)
{
for(int i = 2; i <= sqrt(a); i++)
{
if(!(a%i))
return false;
}
return true;
}
void trace(int node) //不知道这个函数是怎么运行的,递归出口在哪?
{ //怎么算完所有情况的?好难明白呀!运行时又一
int i; //直在跳,都不停下,好多种排列啊!
if((node == 21) && isprime(link[20] + link[1]))
{
for(i = 1; i < 21; i++)
printf("%4d", link[i]);
putchar(10);
}
for(i = 1; i <= 20; i++)
{
if(!used[i])
{
link[node] = i;
used[i] = 1;
if(isprime(link[node]+link[node-1]))
trace(node+1);
used[i] = 0;
}
}
}
void main()
{
trace(1);
}[/quote]
这是回溯,不明白的话先看下递归,再搞清基本的回溯结构,
递归的出口就是if语句,
周五白天在线,
83 楼
瞬间移动 [专家分:320] 发布于 2006-12-01 14:21:00
//////////////////////////////////////////////////////////////////////////////
//
// 11. 巧排数字。将1、2、...、20这20个数排成一排,使得相邻的两个数之
// 和为一个素数,且首尾两数字之和也为一个素数。编程打印出所有的排法。
///////////////////////////////////////////////////////////////////////////
20个数太多了,改小点就可以看到结果了,我改成1,2,3,4,5,6 六个数了
这样好象容易理解点。总算是有点眉目了,这个算法真是厉害呀!要完全弄明白
还得发点时间才行。
#include <stdio.h>
#include <math.h>
static int link[7], used[7]; //link[]用于存储排列,used[]用于标记i位置是否
//已经有数了
bool Isprime( int n )
{
int i;
for( i=2; i<=sqrt(n); i++ )
if( n%i == 0 )
return false;
return true;
}
void Trace( int node )
{
int i;
if( node==7 && Isprime(link[6]+link[1]) ) //当排列出一组后将其打印出来
{
for( i=1; i<=6; i++ )
printf("%5d", link[i]);
putchar(10);
}
for( i=1; i<=6; i++ )
{
if( !used[i] )
{
link[node] = i; //每个结点值遍历1~6的所有情况
used[i] = 1;
if( Isprime(link[node]+link[node-1]) )
Trace(node+1);
used[i] = 0; //将标记归零,以便用于下一组排列,从数组最后一个
//数开始变
}
}
}
int main()
{
Trace(1);
return 0;
}
84 楼
zy1121 [专家分:7950] 发布于 2006-12-03 11:05:00
呵呵~~
楼主强啊,做了这么多.
不过楼主的第18好像把意思理解错了~
A,B都只能跳到空格,是不能互换的.
下面是我写的,还请指教.
呵呵~~
[code]
/* 18. 在一线性七个格位置的图上有两种不同颜色的棋子A,B. 排列如下图所示,中间
格的位置为空。
┌─┬─┬─┬─┬─┬─┬─┐
│A │A │A │ │B │B │B │
└─┴─┴─┴─┴─┴─┴─┘
要求将A,B的现行位置交换,形成下图中的排列:
┌─┬─┬─┬─┬─┬─┬─┐
│B │B │B │ │A │A │A │
└─┴─┴─┴─┴─┴─┴─┘
移动棋子的条件:
(1) 每个格中只准放一个棋子。
(2) 任意一个棋子均可移动一格放入空格内。
(3) 一方的棋子均可跳过另一方的一个棋子进入空格。
(4) 任何棋子不得跳跃两个或两个以上棋子(无论颜色同异)
(5) 任何一个颜色棋子只能向前跳,不准向后跳。
编程完成有关的移动,并且完成具有2N+1个格子的情形. 其中两种颜色各有
N个棋子,且中间为空格.
*/
#include <stdio.h>
#include <stdlib.h>
#define MAX 82
void InitChessman(char *grid, int n);
void Swap(char *grid, int &SapcePos, int chess);
void MoveChessman(char *grid, int &SapcePos, bool Black);
void Exchange(char *grid, int n);
int main()
{
int n = 3;
char Grid[MAX] = {0};
printf("Please input the chessman number (n <= 40):");
scanf("%d",&n);
InitChessman(Grid,n);
printf(" 0 : %s\n",Grid);
Exchange(Grid,n);
system("pause");
return 0;
}
void InitChessman(char *grid, int n)
{
grid[n] = ' ';
for(int i = 0;i < n;++i)
grid[i] = '*';
for(int i = 2 * n;i > n;--i)
grid[i] = 'o';
}
void Swap(char *grid, int &SapcePos, int chess)
{
static int count = 1;
char temp = grid[SapcePos];
grid[SapcePos] = grid[chess];
grid[chess] = temp;
SapcePos = chess;
printf("%4d : %s\n",count++,grid);
}
void MoveChessman(char *grid, int &SapcePos, bool Black)
{
if(Black)
grid[SapcePos - 1] == '*'?
Swap(grid,SapcePos,SapcePos - 1):
Swap(grid,SapcePos,SapcePos - 2);
else
grid[SapcePos + 1] == 'o'?
Swap(grid,SapcePos,SapcePos + 1):
Swap(grid,SapcePos,SapcePos + 2);
}
void Exchange(char *grid, int n)
{
int SpacePos = n,i,j;
bool Black = true;
for(i = 1;i <= n;++i)
{
for(j = 0;j < i;++j)
MoveChessman(grid,SpacePos,Black);
Black = !Black;
}
for(j = 0;j < i - 1;++j)
MoveChessman(grid,SpacePos,Black);
Black = !Black;
for(--i;i > 0;--i)
{
for(j = 0;j < i;++j)
MoveChessman(grid,SpacePos,Black);
Black = !Black;
}
}
[/code]
85 楼
wuchengwei [专家分:1650] 发布于 2006-12-03 11:56:00
谢谢了
86 楼
北极星愿 [专家分:210] 发布于 2006-12-08 23:00:00
太厉害了!
87 楼
taoshiyao [专家分:0] 发布于 2006-12-13 20:14:00
超市购物结账系统
主要功能:
1. 输入新商品信息存入数据文件中
2. 显示所有商品信息
3. 修改变化了的商品信息
4. 删除已不再销售的商品信息。
5. 按商品名称排序。
6. 输入顾客所购商品编码,屏幕上显示顾客所购商品清单,货款合计及收款数、找零;
基本信息:商品编号、商品名称、单价、计价单位
高手们谁能解决?
88 楼
taoshiyao [专家分:0] 发布于 2006-12-13 20:15:00
超市购物结账系统
主要功能:
1. 输入新商品信息存入数据文件中
2. 显示所有商品信息
3. 修改变化了的商品信息
4. 删除已不再销售的商品信息。
5. 按商品名称排序。
6. 输入顾客所购商品编码,屏幕上显示顾客所购商品清单,货款合计及收款数、找零;
基本信息:商品编号、商品名称、单价、计价单位
89 楼
taoshiyao [专家分:0] 发布于 2006-12-13 20:17:00
超市购物结账系统
主要功能:
1. 输入新商品信息存入数据文件中
2. 显示所有商品信息
3. 修改变化了的商品信息
4. 删除已不再销售的商品信息。
5. 按商品名称排序。
6. 输入顾客所购商品编码,屏幕上显示顾客所购商品清单,货款合计及收款数、找零;
基本信息:商品编号、商品名称、单价、计价单位
90 楼
wuchengwei [专家分:1650] 发布于 2006-12-13 22:22:00
不难,自己做
可以参看《datastructure using java》的第二章(也可能是第三章,忘了),有具体程序
我来回复