📄 c题目答案.txt
字号:
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]);
}
///////////////////////////////////////////////////////////////////////////////
//
// 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;
}
}
//////////////////////////////////////////////////////////////////////////////
//
// 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);
}
//////////////////////////////////////////////////////////////////////////////
//
// 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);
}
//////////////////////////////////////////////////////////////////////////////
//
// 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");
}
}
//////////////////////////////////////////////////////////////////////////////
//
// 14. 有黑白棋子各有N个(分别用*和O代替),按下图方式排列
//
// ***...***OOO...OOO
//
// N个黑棋 N个白棋
//
// 允许将相邻两个棋子互换位置,最后使队形成黑白交替排列,试编程实现该操作。
//////////////////////////////////////////////////////////////////////////////
#include "stdio.h"
#define N 5
void main()
{
char *str = new char[2*N], temp;
int i, start, end;
for(i = 0; i < N; i++)
str[i] = '*';
for(; i < 2*N; i++)
str[i] = 'o';
printf("%s\n", str);
for(start = N-1, end = 2*N-2; start < end; start–,end-=2)
{
for(i = start; i < end; i++)
{
temp = str[i];
str[i] = str[i+1];
str[i+1] = temp;
printf("%s\n",str);
}
}
delete[] str;
}
//////////////////////////////////////////////////////////////////////////////
//
// 15. 已知6个城市,用c[i,j]表示从i城市到城市j是否有单向的直达汽车
//
// (1=<i〈=6,1〈=j〈=6), c[i,j]=1 表示城市i到城市j有单向直达汽
// 车; 否则 c[i,j]=0. 试编制程序,对于给出的城市代号i,打印出从该城市出
// 发乘车(包括转车)可以到达的所有城市。
//////////////////////////////////////////////////////////////////////////////
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <assert.h>
#define N 6
int visited[N] = {0};
void visit(int c[][N], int i)
{
if(!visited[i])
{
visited[i] = 1;
for(int j = 0; j < N; j++)
if(c[i][j] && !visited[j])
visit(c, j);
}
}
void main( void )
{
int c[N][N], i, j, n;
srand((unsigned)time(NULL));
for (i = 0; i < N; i++ )
{
for(j = 0; j < N; j++)
{
c[i][j] = rand()%2;
printf( "%6d", c[i][j]);
}
putchar('\n');
}
scanf("%d", &n);
assert(n < N);
visit(c, n);
for (i = 0; i < N; i++ )
{
if(visited[i])
printf( "%6d", i);
}
}
//////////////////////////////////////////////////////////////////////////////
//
// 17. 编写一个程序,当输入不超过60个字符组成的英文文字时,计算机将这个句子
// 中的字母按英文字典字母顺序重新排列,排列后的单词的长度要与原始句子中的长度
// 相同。例如:
//
// 输入:
//
// THE PRICE OFBREAD IS ¥1 25 PER POUND
//
// 输出:
//
// ABC DDEEE EFHIINO OP ¥1 25 PPR RRSTU
//
// 并且要求只对A到Z的字母重新排列,其它字符保持原来的状态。
//////////////////////////////////////////////////////////////////////////////
#include "stdio.h"
#include "ctype.h"
#include "string.h"
#define MAX 60
void main()
{
char str[MAX+1] = " THE PRICE OFBREAD IS $1 25 PER POUND", *p, *q, temp;
int len = strlen(str);
for(p = str; p < str+len-1; p++)
{
for(q = p; q < str+len; q++)
{
if(!isalpha(*q))
continue;
if(*p > *q)
{
temp = *p;
*p = *q;
*q = temp;
}
}
}
printf("%s\n", str);
}
//////////////////////////////////////////////////////////////////////////////
//
// 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"
#define N 7
void swapc(int a, int b, char *str)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -