主题:入门必做的题
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个回复)
51 楼
wenxiao001 [专家分:90] 发布于 2006-04-16 19:20:00
加了注释的
#include <iostream.h> //在代码中的1为假,0为真=_=||
main(){int f,a,b,c,d,e;
f=1;;
while(f==1) //设置循环条件,当f为1时循环开始直到f不等于1
{ for(a=0;a<=1;a++) //利用穷举法输出可能的结果然后进一步比对
{for(b=0;b<=1;b++){for(c=0;c<=1;c++){
for(d=0;d<=1;d++){
for(e=0;e<=1;e++){if(a==0){if(b==0&&c==1){if(e==0){if(a==0&&d==0) //比对书上给出的条件
{f=2;
if(a==0){cout<<"a参加";} //设值为0时参加比赛,不是0时不参加,当值为0时输出
if(b==0){cout<<"b参加";}
if(c==0){cout<<"c参加";}
if(d==0){cout<<"d参加";}
if(e==0){cout<<"e参加";}
cout<<endl; //输出换行
}}}}
else if(c==0){if(d==0&&b!=0){if(e!=0){f=2;if(a==0) //比对书上给出的条件
{cout<<"a参加";} //设值为0时参加比赛,不是0时不参加,当值为0时输出
if(b==0){cout<<"b参加";}
if(c==0){cout<<"c参加";}
if(d==0){cout<<"d参加";}
if(e==0){cout<<"e参加";}}}}
}}}}} }
getchar(); //dev-c++中暂停住屏幕的语句...从网上看的
}
52 楼
jacuket [专家分:80] 发布于 2006-04-16 19:40:00
我支持你的建议!!
希望各位高手抽点时间把这些题目的答案(至少一种)给写出来。更希望你们能考虑考虑我们这些还没入门却又不敢永远站在门外的人。
尽量把,注释写的详细一点。特别是那些函数。那些没一定水平用不出来的定义方法。
我再次显谢谢各位了!!
53 楼
风雨无阻lin [专家分:120] 发布于 2006-04-16 19:56:00
/*关于第二题的代码*/
#include <stdio.h>
main()
{
int a,b,c,d,e; /*其中值1为参加,0为不参加*/
for(a=0;a<=1;a++)
for(b=0;b<=1;b++)
for(c=0;c<=1;c++)
for(d=0;d<=1;d++)
for(e=0;e<=1;e++)
if(((b&&!c)||(!b&&c))&&((c&&d)||(!c&&!d))&&(!(!d&&!e))&&(!(!d&&!e)))
/*分别代表条件2~4*/
if((a&&b||!a)&&(e&&(a&&d)||!e))/*代表条件1和5,特别注意a,e不一定参加*/
printf("\n\na=%d b=%d c=%d d=%d e=%d\n",a,b,c,d,e);
return 0;
}
54 楼
eastcowboy [专家分:25370] 发布于 2006-04-16 20:22:00
我的一点代码,2,3,4,5题
2.解答
#include<stdio.h>
#define TestBit(number,bit) (((number)&(1<<(bit)))!=0)
int main(void)
{
int i,j;
for(i=0; i<32; ++i)
{
if( TestBit(i,0) && !TestBit(i,1) ) // A参加但B不参加,不符合第一条
continue;
if( TestBit(i,1) && TestBit(i,2) ) // B和C都参加,不符合第二条
continue;
if( TestBit(i,2) != TestBit(i,3) ) // C和D只有一个参加,不符合第三条
continue;
if( !TestBit(i,3) && !TestBit(i,4) ) // D和E都没参加,不符合第四条
continue;
if( TestBit(i,4) && !(TestBit(i,0)&&TestBit(i,3)) ) // D参加,但A和D不全参加,不符合第五条
continue;
printf("参加竞赛的人是:");
for(j=0;j<5;++j)
if(TestBit(i,j))
putchar('A'+j);
printf("\n");
}
}
3.解答:
#include<stdio.h>
#define min(a,b) (((a)<(b))?(a):(b))
#define MinOfFour(a,b,c,d) min( (min(a,b)), (min(c,d)) )
int main(void)
{
char Charactor[] = "TJ123456789";
int n,mid;
int i,j;
scanf("%d",&n);
mid = n/2;
for(i=0; i<n; ++i)
{
for(j=0; j<n; ++j)
{
putchar(Charactor[MinOfFour(i,j,n-i-1,n-j-1)]);
}
putchar('\n');
}
}
4.解答[color=FF0000]小村兄在85楼指出该解法是错误的。目前我还没有找到好的方法,可能还得等上一段时间。[/color]
第一行是1到n的全排列,然后可分左斜和右斜两种,一共有2*n!种
#include<stdio.h>
#define MAX 20
static int n, count;
void print(int start)
{
static int used[MAX] = {0};
static int arr[MAX];
int i,j,k;
if( start == n )
{
// 正常
for(i=0; i<n; ++i)
{
for(j=0; j<n; ++j)
printf("%4d", arr[(i+j)%n]);
printf("\n");
}
printf("\n");
// 左右反转
for(i=0; i<n; ++i)
{
for(j=n-1; j>=0; --j)
printf("%4d", arr[(i+j)%n]);
printf("\n");
}
printf("\n");
count += 2;
return;
}
for(k=0; k<n; ++k)
{
if(used[k])
continue;
arr[start] = k+1;
used[k] = 1;
print(start+1);
used[k] = 0;
}
}
int main(void)
{
scanf("%d",&n);
count = 0;
print(0);
printf("总共有%d种\n",count);
}
5.解答
解1,利用库函数
#include<stdio.h>
#include<stdlib.h>
#define BUFFER_SIZE 30
int main(void)
{
char buf[BUFFER_SIZE];
int n,r;
scanf("%d%d",&n,&r);
itoa(n, buf, r);
printf(buf);
}
解2,自己动手[color=FF0000]在98楼支持有负数和小数的版本。[/color]
#include<stdio.h>
#include<stdlib.h>
#define BUFFER_SIZE 30
int main(void)
{
char buf[BUFFER_SIZE];
char charactor[] = "0123456789ABCDEF";
int n,r;
int i,j;
scanf("%d%d",&n,&r);
i = 0;
while( n != 0 )
{
int tmp = n%r;
buf[i++] = charactor[tmp];
n /= r;
}
buf[i--] = '\0';
j = 0;
while( i > j )
{
char tmp = buf[i];
buf[i] = buf[j];
buf[j] = tmp;
++j;
--i;
}
printf(buf);
}
55 楼
goal00001111 [专家分:4030] 发布于 2006-04-16 23:17:00
/*
第1题:
稍微简单的判断一下,以减少计算量
G=5或0;
F=5或0;
X=A+1,而且A小于9;
因为总共有10个各不相同的数字,所以:
Z=45-A-B-C-D-E-F-G-X-Y;
*/
#include <iostream>
#include <time.h>
using namespace std;
int main( )
{
time_t startTime;
time_t endTime;
int a,b,c,d,e,f,g,x,y,z;
int count=1;
time(&startTime);
for (a=0; a<9; a++)
{
for (b=0; b<=9; b++)
{
if(b!=a)
for (c=0; c<=9; c++)
{
if(c!=a && c!=b)
for (d=0; d<=9; d++)
{
if(d!=a && d!=b && d!=c)
{
for (e=0; e<=9; e++)
{
if(e!=a && e!=b && e!=c && e!=d)
for (f=0; f<=5; f+=5)
{
if(f!=a && f!=b && f!=c && f!=d && f!=e)
for (g=0; g<=5; g+=5)
{
if(g!=a && g!=b && g!=c && g!=d && g!=e && g!=f)
for (y=0; y<=9; y++)
{
if(y!=a && y!=b && y!=c && y!=d && y!=e && y!=f && y!=g)
{
x = a + 1;
if(x!=b && x!=c && x!=d && x!=e && x!=f && x!=g && x!=y)
{
z = 45 -a-b-c-d-e-f-g-x-y;
if ((a*10000+b*1000+c*100+d*10+e)+(d*100+f*10+g)+(d*100+f*10+g) == (x*10000+y*1000+z*100+d*10+e))
{
cout << count++ << ":" << endl;
cout <<" "<<a<<b<<c<<d<<e<<endl;
cout <<" "<<d<<f<<g<<endl;
cout <<"+ "<<d<<f<<g<<endl;
cout <<"_____________"<<endl;
cout <<" "<<x<<y<<z<<d<<e<<endl;
cout << endl;
}
}
}
}
}
}
}
}
}
}
}
}
time(&endTime);
cout << "time = " << difftime(endTime, startTime) << endl;
getchar();
return 0;
}
56 楼
ccpp [专家分:9360] 发布于 2006-04-17 10:27:00
GCC
什么时候 把答案贴出来啊!
57 楼
天才的我 [专家分:0] 发布于 2006-04-17 10:59:00
有没有答案啊?
[em10][em10]
58 楼
eastcowboy [专家分:25370] 发布于 2006-04-17 11:07:00
大家加油做啊,加油加油~~~
59 楼
eastcowboy [专家分:25370] 发布于 2006-04-17 11:53:00
今天又做了一点,贴上来。6,7题:
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.解答
① 倒填
#include<stdio.h>
int main(void)
{
int i,j;
int n;
scanf("%d",&n);
for(i=0; i<n; ++i)
{
for(j=0; j<n; ++j)
{
printf("%4d", (n-i)*n - j);
}
printf("\n");
}
}
② 蛇形填数
解1,
#include<stdio.h>
#define MAX 20
int main(void)
{
int i,j,k;
int n,N;
int direct = 1; // direct为1表示向左下移动,为-1表示向右上移动
int m[MAX][MAX];
scanf("%d",&n);
i = j = 0;
N = n * n;
for(k=1; k<=N; ++k)
{
m[i][j] = k;
i += direct;
j -= direct;
if( i < 0 && j < n )
i = 0, direct = -direct;
else if( i == n )
--i, j+=2, direct = -direct;
if( j < 0 && i < n )
j = 0, direct = -direct;
else if( j == n )
--j, i+=2, direct = -direct;
}
for(i=0; i<n; ++i)
{
for(j=0; j<n; ++j)
printf("%4d", m[i][j]);
printf("\n");
}
}
解2,
#include<stdio.h>
#define MAX 20
int main(void)
{
int i,j,k,x;
int n,N;
int direct = 0; // direct为0表示向左下移动,为1表示向右上移动
int m[MAX][MAX];
scanf("%d",&n);
i = j = 0;
k = 1;
// 斜着看,一共要行进n*2-1次(往左下或右上各算一次)
N = n*2-1;
for(x=0; x<N; ++x)
{
switch( direct )
{
case 0:
// 往左下填充
while( i<n && j>=0 )
m[i++][j--] = k++;
if( i == n ) // 如果到达最下方
--i, j+=2;
else //if( j < 0 )// 如果到达最左方
++j;
break;
default:
// 往右上填充
while( j<n && i>=0 )
m[i--][j++] = k++;
if( j == n ) // 如果到达最右方
--j, i+=2;
else //if( i < 0 ) // 如果到达最上方
++i;
break;
}
direct = !direct; // 下次行进时方向相反
}
for(i=0; i<n; ++i)
{
for(j=0; j<n; ++j)
printf("%4d", m[i][j]);
printf("\n");
}
}
③ 回转填数[color=FF0000]此程序不合题意,请参考62楼xiaoqijun的程序[/color]
#include<stdio.h>
#define MAX 20
int main(void)
{
int i,j,k,x;
int n,N;
int direct = 0; // direct为0表示向下移动,为1表示向上移动
int m[MAX][MAX];
scanf("%d",&n);
i = j = 0;
k = 1;
N = n*n;
while( k < N )
{
switch(direct)
{
case 0: // 向下
while( i != n )
m[i++][j] = k++;
--i;
break;
case 1: // 向上
while( i >= 0 )
m[i--][j] = k++;
++i;
break;
}
++j;
direct = !direct;
}
for(i=0; i<n; ++i)
{
for(j=0; j<n; ++j)
printf("%4d", m[i][j]);
printf("\n");
}
}
7.题目: 读入一行文本,包含若干个单词(以空格间隔,%结尾)。将其中以 A 开头的
单词与以 N 结尾的单词,用头尾交换的办法予以置换。
7.解答:
// 由于没有说要把多个空格合并成一个,使用strtok函数反而不方便了
// 输入:About about aboutN AboutN%
// 输出:tuobA about Ntuoba NtuobA
#include<stdio.h>
#include<string.h>
#define BUFFER_SIZE 300
#define EndOfLine '%'
// 函数strReverse
// 把开始于start,终止于end的字符串反转
void strReverse(char *start, char *end)
{
while( start < end )
{
register char tmp = *start;
*start = *end;
*end = tmp;
++start;
--end;
}
}
int main(void)
{
char line[BUFFER_SIZE], *p;
int c;
p = line;
while( (c=getchar()) != EndOfLine )
*p++ = c;
*p = '\0';
p = line;
while( *p != '\0' )
{
char *word_start, *word_end;
while( *p == ' ' )
++p;
word_start = p;
while( *p != ' ' && *p != '\0' )
++p;
word_end = p-1;
if( *word_start=='A' || *word_end=='N' )
strReverse(word_start, word_end);
}
printf("%s\n",line);
}
60 楼
yxs0001 [专家分:9560] 发布于 2006-04-17 17:47:00
好熟悉的题目阿
我来回复