主题:[讨论]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个回复)
71 楼
panheshun [专家分:120] 发布于 2006-11-17 22:33:00
辛苦了,有书没的老大,这样看太累哦。。。
72 楼
zhu860713 [专家分:30] 发布于 2006-11-24 15:42:00
强!!!!!!!
73 楼
瞬间移动 [专家分:320] 发布于 2006-11-26 01:31:00
//////////////////////////////////////////////////////////////////////////////
//
// 5. 输入一个十进数,将其转换成 N 进制数(0<N<=16)。
//////////////////////////////////////////////////////////////////////////////
//只能是整数型
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void transform( int ,int );
int main( int argc, char *argv[] )
{
int number, n;
do
{
printf("input a number and transformed system n( 2 =< n <= 16 ):");
scanf("%d %d", &number, &n );
}while( n<2 || n>16 );
transform( number, n );
system("pause");
return 0;
}
void transform( int number, int n )
{
char result[100]; //用数组表示一个数(可表示到100位)
int i = 0;
while( number )
{
if( (number%n)<=9 )
result[i++] = (number%n)+48; //得到的数存在数组中(倒序)
else
result[i++] = (number%n)-10+65; //得到A,B,C等>=10的数(11~16进制用到)
number = number/n;
}
result[i] = '\0';
printf("the number %d transformed to %d system is:\n",number, n);
for( i=strlen(result); i>=0; i-- ) //倒序打印得到顺序的数
printf("%c",result[i]);
printf("\n");
}
74 楼
瞬间移动 [专家分:320] 发布于 2006-11-27 22:46:00
#include <stdio.h>
#include <math.h>
void TransformBinary( int a, char str[] ); //转换成二进制
void BinaryAdd( char str3[], char str2[], char str1[] ); //二进制加法
int ToBackAlgorism( char str[] ); //转换回十进制
void OverturnBinary( char str[] ); //将倒序的二进制数翻转成顺序的
int main()
{
int x, y, z;
char binary1[100], binary2[100], binary3[100]; //用于存放二进制数(最高100位)
printf("input x y:");
scanf("%d %d", &x, &y );
TransformBinary( x, binary1 );
TransformBinary( y, binary2 );
BinaryAdd( binary3, binary2, binary1 );
//将二进制数转为顺序的
OverturnBinary( binary1 );
OverturnBinary( binary2 );
OverturnBinary( binary3 );
printf("%20s\n",binary1);
printf("+%19s\n",binary2);
printf("--------------------\n");
printf("%20s\n",binary3);
z = ToBackAlgorism( binary3 );
printf("x+y=%d",z);
return 0;
}
void TransformBinary( int a, char str[] ) //二进制数倒序存放在数组中
{ //即:高位存放在后面(8: 0001)
char *p;
p = str;
while( a != 0 )
{
*p++ = a%2+0x30;
a = a/2;
}
*p = '\0';
}
void BinaryAdd( char str3[], char str2[], char str1[] ) //因为倒序,故从数组第
{ //一位开始往后加
int carry=0; //判断进位
char *p1, *p2, *p3;
p1 = str1;
p2 = str2;
p3 = str3;
while( *p1 != '\0' || *p2 != '\0' )
{
//当有一个数位较长时,短的数高位补0
if( *p1 == '\0' )
{
*p1 = '0';
*(p1+1) = '\0';
}
if( *p2 == '\0' )
{
*p2 = '0';
*(p2+1) = '\0';
}
if( *p1 + *p2 == 0x60 || *p1 + *p2 == 0x61 )
{
*p3 = *p1 + *p2 - 0x30;
if( carry == 1 ) //有进位
{
*p3 = *p3 + 1;
if( *p3 == 0x32 )
{
*p3 = 0x30;
carry = 1;
}
else
carry = 0;
}
}
if( *p1 + *p2 == 0x62 )
{
*p3 = 0x30;
if( carry == 1 )
*p3 = *p3 + 1;
else
carry = 1;
}
p1++;
p2++;
p3++;
}
if( carry == 1 ) //判断是否溢出,(长数组的最高位处,有进位)
*p3++ = '1';
*p3 = '\0';
}
int ToBackAlgorism( char str[] )
{
int a=0, count=0;
char *p;
p = str;
while( *p != '\0' )
{
a = a + (int)pow(2,count) * (int)( *p - 0x30 );
count++;
p++;
}
return a;
}
void OverturnBinary( char str[] )
{
char *p, *q, temp;
p = q = str;
while( *p != '\0' )
p++;
p = p - 1;
while(1)
{
temp = *q;
*q = *p;
*p = temp;
if( p == q || p == q+1 )
break;
p--;
q++;
}
}
75 楼
求学小子 [专家分:0] 发布于 2006-11-27 22:47:00
好强呀,我可是强烈的崇拜你呀,我什么时候才能到你的水平一半的程度呀?????????????????
76 楼
瞬间移动 [专家分:320] 发布于 2006-11-27 22:48:00
上面是第8题:
输入两个正整数X,Y,将X,Y化为二进制数,然后将这两个二进制数作二进
制加法运算,再将结果化为十进制数输出。
77 楼
瞬间移动 [专家分:320] 发布于 2006-11-28 21:21:00
///////////////////////////////////////////////////////////////////////////////
//
// 9. 四人玩火柴棍游戏,每一次都是三个人赢,一个人输。输的人要按赢者手中的火柴
// 数进行赔偿,即赢者手中有多少根火柴棍,输者就赔偿多少根。现知道玩过四次后,
// 每人恰好输过一次, 而且每人手中都正好有16根火柴。问此四人做游戏前手中各有
// 多少根火柴? 编程解决此问题。
///////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
int main()
{
int a[4] = { 16, 16, 16, 16 }; //四次游戏过后,每人手中都有16根火柴
int sum;
for( int i=3; i>=0; i-- ) //第i次游戏过后(逆推),每人的火柴情况
{ //假设第i次游戏是 a[i] 输,谁输不影响结果
sum = 0;
for( int j=0; j<4; j++ )
{
if( j != i )
{
a[j] = a[j]/2; //赢的人第i次游戏前的火柴数是游戏后的一半
sum = sum + a[j]; //赢的人的火柴总数
}
}
a[i] = 64 - sum; //剩下的火柴是输的人的(第i次游戏前的数)
}
printf("游戏前的火柴数分别是:");
for( i=0; i<4; i++ )
printf("%4d",a[i]);
putchar(10);
return 0;
}
78 楼
瞬间移动 [专家分:320] 发布于 2006-11-28 21:56:00
//////////////////////////////////////////////////////////////////////////////
//
// 10. 如图1所示,编写程序计算 ┎┰┰┰┰┰┰┰┰┰┒
// 大大小小正方形共有多少?当最小 ┠╂╂╂╂╂╂╂╂╂┨
// 正方行边长为1时,它们的总面积 ┠╂╂╂╂╂╂╂╂╂┨
// 共为多少? ┠╂╂╂╂╂╂╂╂╂┨
// ┠╂╂╂╂╂╂╂╂╂┨
// ┠╂╂╂╂╂╂╂╂╂┨
// ┠╂╂╂╂╂╂╂╂╂┨
// ┠╂╂╂╂╂╂╂╂╂┨
// ┠╂╂╂╂╂╂╂╂╂┨
// ┠╂╂╂╂╂╂╂╂╂┨
// ┖┸┸┸┸┸┸┸┸┸┚
//////////////////////////////////////////////////////////////////////////////分析:
// n = 1: sum = 1;
// n = 2: sum = 1 + 4;
// n = 3: sum = 1 + 4 + 9;
// n = 4: sum = 1 + 4 + 9 + 16;
//当边长增加1(增加到n)时,正方形个数加 n^2 个
//此时边长为i的正方形有(n-i+1)^2个
//总面积为:s = s + (n-i+1)*(n-i+1)*i*i;
///////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#define N 10
int main()
{
int i, sum=0;
long s=0;
for( i=1; i<=N; i++ )
{
sum = sum + i*i;
s = s + (N-i+1)*(N-i+1)*i*i;
}
printf("正方形共%d个\n", sum);
printf("总面积为:%ld\n", s );
return 0;
}
79 楼
wuchengwei [专家分:1650] 发布于 2006-11-29 10:55:00
给不了分了,一个帖子最多只能奖励50分
80 楼
瞬间移动 [专家分:320] 发布于 2006-11-30 16:46:00
呵呵,是这样的啊。 可惜了,我还想加点分的。
不能加的话也没办法呀。
我来回复