主题:入门必做的题
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个回复)
81 楼
eastcowboy [专家分:25370] 发布于 2006-04-19 15:43:00
16. 设有8枚硬币a,b,c,d,e,f,g,h,其中有一枚硬币是伪造的。
真伪硬币的区别仅是重量不同,可能重,可能轻。今要求以天平为工具,用最少的
比较次数挑出伪造硬币,并鉴定它是重还是轻。
16.解答:
第一次,取任意四个,在天平中左右两边各放两个。
如果平衡,则伪造硬币在剩余四个之中;
如果不平衡,则伪造硬币在天平上的四个之中。
第二次,在上一次的结果中取任意两个,在天平左右两边各放一个。
如果平衡,则伪造硬币在剩余两个中;
如果不平衡,则伪造硬币在天平上的两个之中。
第三次,在上一次结果中取任意一个记为a,另一个记为b,
再在剩余六个中取任意一个,分别放天平两边。
如果平衡,b就是伪造硬币。
如果不平衡,a就是伪造硬币。
82 楼
eastcowboy [专家分:25370] 发布于 2006-04-19 15:44:00
17. 编写一个程序,当输入不超过60个字符组成的英文文字时,计算机将这个句子
中的字母按英文字典字母顺序重新排列,排列后的单词的长度要与原始句子中的长度
相同。例如:
输入:
THE PRICE OFBREAD IS ¥1 25 PER POUND
输出:
ABC DDEEE EFHIINO OP ¥1 25 PPR RRSTU
并且要求只对A到Z的字母重新排列,其它字符保持原来的状态。
17.解答
#include <stdio.h>
#include <ctype.h>
#define N 60
int main(void)
{
char Input[N+1];
int count[26] = {0};
int i,j;
gets(Input);
for(i=0; Input[i]!='\0'; ++i)
{
int c = Input[i];
if( isupper(c) )
++count[c-'A'];
}
for(i=j=0; Input[i]!='\0'; ++i)
{
int c = Input[i];
if( isupper(c) )
{
if( count[j] != 0 )
--count[j];
else
{
while( count[j] == 0 )
++j;
--count[j];
}
Input[i] = 'A' + j;
}
}
puts(Input);
}
83 楼
abc8401 [专家分:30] 发布于 2006-04-19 18:55:00
做了下,真的不错,谢谢。
84 楼
chong232 [专家分:0] 发布于 2006-04-20 11:14:00
楼主,不会的怎么查找参考呢
85 楼
小村 [专家分:1800] 发布于 2006-04-20 13:03:00
To eastcowboy 兄,我首先非常佩服他的这种一丝不苟的精神.自己都达到这么一个水平了,还一道不落的做这种入门的题.希望他能将这种精神坚持下去,一定有一天会变的更牛的.
但是我要吹毛求疵一下了:eastcowboy 兄的第四题的算法有一点问题,最终的拉丁矩阵总数并不是2*n!种,应该是n!*(n-1)!种,对于一种已经成立的拉丁矩阵应该是对其的行和列分别对其进行全排列才对,但是这样又会重复n倍(因为对行进行全排列的时候对列已经排列了n次了).另外对eastcowboy 兄的程序当输入2的时候会出现重解.
还有,对于进制转换的程序,eastcowboy 兄的程序只能转换整数,既然已经自己动手了,那就动的再好一些啦,应该能转换小数才完美呀.
86 楼
chong232 [专家分:0] 发布于 2006-04-20 13:49:00
第一题
#include <stdio.h>
#define Length 9
#define check(x) (x+1)%Length !=B //防止无穷循环
#define Express a[B]*100+a[C]*10+a[E]+a[B]+a[C]*10+a[D]*100==a[E]*100+a[E]*10+a[F]
void main()
{
int a[9]={1,2,3,4,5,6,7,8,9};
int s[9]={1,1,1,1,1,1,1,1,1};//1表示可用,0表示已取走
unsigned B,C,D,E,F,G;
for(B=0;B<=8;B++)
{
s[B]=0;
for(C=(B+1)%Length;check(C);C++,C%=Length)
{
if(s[C])//can get the data
{
s[C]=0;//get the capture
for(D=(B+1)%Length;check(D);D++,D%=Length)
if(s[D])
{
s[D]=0;//get the capture
for(E=(B+1)%Length;check(E);E++,E%=Length)
{
if(s[E])
{
s[E]=0;
for(F=(B+1)%Length;check(F);F++,F%=Length)
if(s[F])
if(Express) printf("%d%d%d%d%d\n",a[B],a[C],a[D],a[E],a[F] );
s[E]=1;
}
}
s[D]=1;//release the capture
}
s[C]=1;//release the capture
}
}
s[B]=1;
}
}
87 楼
haoge [专家分:140] 发布于 2006-04-20 15:02:00
第2题
/*
2. A、B、C、D、E五名学生有可能参加计算机竞赛,根据下列条件判断哪些
人参加了竞赛:
(1)A参加时,B也参加;
(2)B和C只有一个人参加;
(3)C和D或者都参加,或者都不参加;
(4)D和E中至少有一个人参加;
(5)如果E参加,那么A和D也都参加。
假设参加为1,不参加为0
*/
void main()
{
int a,b,c,d,e;
a=1;
if(a==1)
{
b=1;
c=0;
d=0;
e=1;
if(e==1)
{
a=1;
d=1;
/*这与上边d=0矛盾,所以a==0*/
}
a=0;
if(b==1)
{
c=0;
d=0;
e=1;
a=1;
d=1;
/*这与上边d=0矛盾,所以b==0*/
}
a=0;
b=0;
c=1;
d=1;
e=0;
}
clrscr();
printf("\na=%d\nb=%d\nc=%d\nd=%d\ne=%d\n",a,b,c,d,e);
printf("\only C,D atend");
}
88 楼
小车 [专家分:50] 发布于 2006-04-22 14:13:00
这些题目真的不错 值得推荐!!
89 楼
ll007 [专家分:20] 发布于 2006-04-23 09:24:00
请问一下楼主这些题有没有一个大概的算法可以参考嘛???
90 楼
ll007 [专家分:20] 发布于 2006-04-23 09:27:00
请问一下楼主你给出的这些题有没有一个大概的算法可以参考呀?谢谢!
我来回复