主题:[讨论]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个回复)
沙发
wuchengwei [专家分:1650] 发布于 2006-09-05 21:24:00
//////////////////////////////////////////////////////////////////////////////
//
// 2. A、B、C、D、E五名学生有可能参加计算机竞赛,根据下列条件判断哪些
// 人参加了竞赛:
// (1)A参加时,B也参加;
// (2)B和C只有一个人参加;
// (3)C和D或者都参加,或者都不参加;
// (4)D和E中至少有一个人参加;
// (5)如果E参加,那么A和D也都参加。
//////////////////////////////////////////////////////////////////////////////
//(4)&&(5)==>D=1 (6)
//(3)&&(6)==>C=1 (7)
//(7)&&(2)==>B=0 (8)
//设(A==1) 则(1)==>B=1 但是 (8)==>B==0 因此假设(A==1)不成立,故A==0 (9)
//设(E==1) 则(5)==>A=1 但是 (9)==>A==0 因此假设(E==1)不成立,故E==0 (10)
//综上可得: A=0, B=0, C=1, D=1, E=0
#include <stdio.h>
int main()
{
printf("A=0, B=0, C=1, D=1, E=0");
return 0;
}
//////////////////////////////////////////////////////////////////////////////
//
// 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");
}
}
板凳
wuchengwei [专家分:1650] 发布于 2006-09-05 21:25:00
//////////////////////////////////////////////////////////////////////////////
//
// 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
//////////////////////////////////////////////////////////////////////////////
#include "stdio.h"
#define N 4
static int a[N][N], count;
bool legal(int row, int col)
{
int i;
for(i = 0; i < row; i++)
{
if(a[i][col] == a[row][col])
return false;
}
for(i = 0; i < col; i++)
{
if(a[row][i] == a[row][col])
return false;
}
return true;
}
void trial(int row, int col, FILE *fp)
{
int i, j;
if(row == N)
{
printf("*********** %d **********\n", ++count);
fprintf(fp, "*********** %d **********\n", count);
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
printf("%5d", a[i][j]);
fprintf(fp, "%5d", a[i][j]);
}
putchar(10);
fputc(10, fp);
}
}
for(i = 1; i <= N; ++i)
{
a[row][col] = i;
if(legal(row, col))
trial((row*N+col+1)/N, (row*N+col+1)%N, fp);
}
}
void main()
{
FILE *fp = fopen("latin.txt", "w");
trial(0, 0, fp);
}
3 楼
wuchengwei [专家分:1650] 发布于 2006-09-05 21:25:00
//////////////////////////////////////////////////////////////////////////////
//
// 5. 输入一个十进数,将其转换成 N 进制数(0<N<=16)。
//////////////////////////////////////////////////////////////////////////////
//只能是整数型
#include "iostream.h"
#include "assert.h"
void convert(int, int);
void main()
{
int num, carry;
cout<<"input the decimal number and carry:";
cin>>num>>carry;
assert(carry <= 17);
convert(num, carry);
}
void convert(int num, int carry)
{
int *a = new int[100];
int i = 0;
cout<<"decimal value "<<num<<" convert to the value by the carry as "<<carry<<" is: ";
while(num)
{
*(a+i) = num%carry;
num /= carry;
i++;
}
while(--i >= 0)
(*(a+i) < 10)?cout<<*(a+i):cout<<(char)(55+*(a+i));
cout<<endl;
}
4 楼
wuchengwei [专家分:1650] 发布于 2006-09-05 21:25: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, start, end;
static int a[N][N];
for(sum = 0; sum < 2*N -1; sum++)
{
start = (sum < N)?0:sum-(N-1);
end = (sum < N)?sum:(N-1);
for(j = start; j <= end; 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[i][j] //用于控制方向, 若改为a[j][i], 则方向相反
#define N 10
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++)
a[i][j] = ++num;
for(j = start; j < end; j++)
a[i][j] = ++num;
for(i = end; i > start; i--)
a[i][j] = ++num;
for(j = end; j > start; j--)
a[i][j] = ++num;
if(start == end)
a[start][end] = ++num;
}
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
printf("%4d", elem);
printf("\n");
}
}
5 楼
wuchengwei [专家分:1650] 发布于 2006-09-05 21:26: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++);
}
}
6 楼
wuchengwei [专家分:1650] 发布于 2006-09-05 21:26:00
//////////////////////////////////////////////////////////////////////////////
//
// 8. 输入两个正整数X,Y,将X,Y化为二进制数,然后将这两个二进制数作二进
// 制加法运算,再将结果化为十进制数输出。
//////////////////////////////////////////////////////////////////////////////
#include "stdio.h"
#include "math.h"
#define N 18
void dtob(unsigned int, int*, char*);
unsigned int btod(int*);
void badd(int*, int*, int*);
void show(int*, char*);
void main()
{
unsigned int x, y;
static int xb[N], yb[N], resultb[N], i;
printf("input the decimal value X and Y:");
scanf("%d %d", &x, &y);
dtob(x, xb, "X");
dtob(y, yb, "Y");
badd(xb, yb, resultb);
printf("\nResult convert to be decimal is:%4d\n", btod(resultb));
}
void dtob(unsigned int n, int *nb, char *s)
{
int i = N;
while(n)
{
nb[--i] = n & 1;
n >>= 1;
}
nb[--i] = -1;
show(nb, s);
}
void badd(int *xb, int *yb, int *resultb)
{
int i = 0;
while(xb[i] != -1 && yb[i] != -1)
i++;
resultb[i++] = -1;
for(; i < N; i++)
{
if(xb[i] == -1)
resultb[i] = yb[i];
else if(yb[i] == -1)
resultb[i] = xb[i];
else
resultb[i] = xb[i] + yb[i];
}
for(i = N; resultb[i] != -1; i--)
{
if(resultb[i] > 1)
{
resultb[i] %= 2;
if(resultb[i-1] == -1)
{
resultb[i-1] = 1;
resultb[i-2] = -1;
}
else
resultb[i-1] += 1;
}
}
show(resultb, "Result");
}
unsigned int btod(int* nb)
{
static unsigned int i, sum;
for(; nb[i] != -1; i++);
for(++i; i < N; i++)
sum += nb[i]*(int)pow(2, N-1-i);
return sum;
}
void show(int *nb, char *s)
{
int i;
printf("\n%s\t= ", s);
for(i = 0; nb[i] != -1; i++);
for(++i; i < N; i++)
printf("%d", nb[i]);
}
7 楼
wuchengwei [专家分:1650] 发布于 2006-09-05 21:26: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;
}
}
8 楼
wuchengwei [专家分:1650] 发布于 2006-09-05 21:26:00
//////////////////////////////////////////////////////////////////////////////
//
// 10. 如图1所示,编写程序计算 ┎┰┰┰┰┰┰┰┰┰┒
// 大大小小正方形共有多少?当最小 ┠╂╂╂╂╂╂╂╂╂┨
// 正方行边长为1时,它们的总面积 ┠╂╂╂╂╂╂╂╂╂┨
// 共为多少? ┠╂╂╂╂╂╂╂╂╂┨
// ┠╂╂╂╂╂╂╂╂╂┨
// ┠╂╂╂╂╂╂╂╂╂┨
// ┠╂╂╂╂╂╂╂╂╂┨
// ┠╂╂╂╂╂╂╂╂╂┨
// ┠╂╂╂╂╂╂╂╂╂┨
// ┠╂╂╂╂╂╂╂╂╂┨
// ┖┸┸┸┸┸┸┸┸┸┚
//////////////////////////////////////////////////////////////////////////////
#include "stdio.h"
#define N 10
void main()
{
static int a[N][N];
int i, j, k, num, count = 0, area = 0;
for(i = 0; i < N; i++)
{
for(j = 0, num = 0; j < N; j++)
{
a[i][j] = (num > N-i-1)?num :++num;
printf("%4d", a[i][j]);
count += a[i][j];
for(k = 1; k <= a[i][j]; k++)
area += k*k;
}
putchar('\n');
}
printf("count = %d, total area = %d\n", count, area);
}
9 楼
wuchengwei [专家分:1650] 发布于 2006-09-05 21:27:00
//////////////////////////////////////////////////////////////////////////////
//
// 11. 巧排数字。将1、2、...、20这20个数排成一排,使得相邻的两个数之
// 和为一个素数,且首尾两数字之和也为一个素数。编程打印出所有的排法。
//////////////////////////////////////////////////////////////////////////////
#include "stdio.h"
#include "math.h"
static 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);
}
10 楼
wuchengwei [专家分:1650] 发布于 2006-09-05 21:27:00
//////////////////////////////////////////////////////////////////////////////
//
// 13. 有N个硬币(N为偶数)正面朝上排成一排,每次将 N-1 个硬币翻过来放在原位
// 置, 不断地重复上述过程,直到最后全部硬币翻成反面朝上为止。编程让计算机把
// 翻币的最简过程及翻币次数打印出来(用*代表正面,O 代表反面)。
//////////////////////////////////////////////////////////////////////////////
#include "stdio.h"
#include "assert.h"
#include "string.h"
#define N 10
void main()
{
assert(!(N%2));
bool s[N];
int i, j;
for(j = 0; j < N; j++)
{
s[j] = true;
printf("%3c", '*');
}
printf("\n");
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
if(j != i)
s[j] = !s[j];
printf("%3c", s[j]?'*':'0');
}
printf("\n");
}
}
我来回复