求C++入门必做题 答案

看见一套C++入门题很好,前两道题目是1.给定等式ABCDE其中每个字母代表一个数字,且不同数字对应不DFG同字母。编程求出这些数字并且打出这个数字的+DFG算术计算竖式... 看见一套C++入门题很好,前两道题目是
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也都参加。

想找份答案,我只学过C++,最好要C++的,C也可以,先感谢了
首先谢谢各位辛苦了,前两道我会做了,我想要的是这一套题的答案,一套题的!如果有哪位高人恰好有的话,请贴出来吧,或者请发到我邮箱吧,lhj1261987@163.com ,感激不尽!
展开
 我来答
iceser
2008-03-24 · TA获得超过2708个赞
知道大有可为答主
回答量:695
采纳率:100%
帮助的人:455万
展开全部
第一题

A B C D E
D F G
+ D F G
---------
X Y Z D E

由式可知( E + G + G ) % 10 = E,意思说(G+G)是10的整数倍。所以,G可能为0,也可能为5。
现在我们考虑G=5的情况,也就是说 E + 2G = 10 + E,所以需要往前面进一位。那么就有( D + F + F + 1 ) % 10 = D,也就是说对(D + 2F + 1)求余,还是D,现在设D为奇数,

那么(D + 2F + 1)就必然为偶数,一个偶数对10求余,结果必然也是偶数,这跟结果是D(奇数)相冲突。所以,G=5是不成立的。于是只剩下一种情况,那就是G=0。
现在我们知道G=0,所以就存在等式 ( D + 2F ) % 10 = D,意思说2F也是10的整数倍。由于已经有G=0,所以F=5。
根据前面得出的结论F=5,所以有D + 2F = 10 + D,所以也会往前面进1。那么就有等式( C + 2D + 1 ) % 10 = Z
根据题意,我们知道不同的字母代表不同的数字。所以 B 和 Y 以及 A 和 X,自然代表不同的数字。由公式我们可以看出,B + ( C + 2D + 1 )/10 = Y + n * 10,这里的n,代

表向前进位的数。根据各个字母的取值范围(0,9),我们可以得出结论:
n = 1
A + 1 = X
由于 0 <= ( C + 2D + 1 )/10 <= 2,且 Y >= 1 (因为G=0)
所以有:
B = 9
( C + 2D + 1 )/10 = 2,即 C + 2D + 1 = 20 + Z

综上,可得A的取值表
_VA[] = { 1, 2, 3, 6, 7 };
同时由于 X = A + 1
所以,X的取值表
_VX[] = { 2, 3, 4, 7, 8 };
那么除去这五个值之外的取值有就为
_VLEFT[][5] = {
{ 3, 4, 6, 7, 8 },
{ 1, 4, 6, 7, 8 },
{ 1, 2, 6, 7, 8 },
{ 1, 2, 3, 4, 8 },
{ 1, 2, 3, 4, 6 }
}

所以程序代码为:

unsigned char A, B, C, D, E, F, G, X, Y, Z;
unsigned char _VA[] = { 1, 2, 3, 6, 7 };
unsigned char _VX[] = { 2, 3, 4, 7, 8 };
unsigned char _VLEFT[][5] = {
{ 3, 4, 6, 7, 8 },
{ 1, 4, 6, 7, 8 },
{ 1, 2, 6, 7, 8 },
{ 1, 2, 3, 4, 8 },
{ 1, 2, 3, 4, 6 }
};
G = 0;
F = 5;
B = 9;
unsigned char * pLeft;
bool completed = false;
for( int i = 0; i < 5; i ++ )
{
A = _VA[ i ];
X = _VX[ i ];
pLeft = &_VLEFT[ i ][ 0 ];
//C + 2D + 1 = 20 + Z
for( int j0 = 0; j0 < 5; j0 ++ )
{
C = pLeft[j0];
for( int j1 = 0; j1 < 5; j1 ++ )
{
if( j1 == j0 ) continue;
D = pLeft[j1];
for( int j2 = 0; j2 < 5; j2 ++ )
{
if( j2 == j0 || j2 == j1 ) continue;
Z = pLeft[ j2 ];
if( ( C + 2 * D ) == ( 19 + Z ) )
{
Y = ( ( C + 2 * D + 1 ) / 10 + B ) % 10;
if( Y != A && Y != Z )
{
for( int j3 = 0; j3 < 5; j3 ++ )
{
if( j3 != j0 && j3 != j1 && j3 != j2 && pLeft[ j3 ] != Y )
{
E = pLeft[ j3 ];
}
}
completed = true;
break;
}
}
}
if( completed ) break;
}
if( completed ) break;
}
if( completed ) break;
}

结果是:
2 9 7 8 6
8 5 0
+ 8 5 0
----------
3 1 4 8 6

其中有效循环次数仅为106次。

第二题由如下代码:

unsigned char A, B, C, D, E;
A = 1;
Retry:
B = A;
C = !B;
D = C;
E = !D;
if( E && ! ( A && D ) )
{
A = 0;
goto Retry;
}
printf_s( "A = %d, B = %d, C = %d, D = %d, E = %d\n",
A, B, C, D, E );

因为A只有两种可能,去或者不去,所以只需要确定这一个就可以了,然后按照题意可以推出其它的状态,然后判断是不是自相矛盾。如果不矛盾,那么,就算正确了。

运行结果如下:

A = 0, B = 0, C = 1, D = 1, E = 0

只有C和D去了。
qwer211321
2008-03-31 · TA获得超过217个赞
知道答主
回答量:291
采纳率:0%
帮助的人:163万
展开全部
第一题

A B C D E
D F G
+ D F G
---------
X Y Z D E

由式可知( E + G + G ) % 10 = E,意思说(G+G)是10的整数倍。所以,G可能为0,也可能为5。
现在我们考虑G=5的情况,也就是说 E + 2G = 10 + E,所以需要往前面进一位。那么就有( D + F + F + 1 ) % 10 = D,也就是说对(D + 2F + 1)求余,还是D,现在设D为奇数,

那么(D + 2F + 1)就必然为偶数,一个偶数对10求余,结果必然也是偶数,这跟结果是D(奇数)相冲突。所以,G=5是不成立的。于是只剩下一种情况,那就是G=0。
现在我们知道G=0,所以就存在等式 ( D + 2F ) % 10 = D,意思说2F也是10的整数倍。由于已经有G=0,所以F=5。
根据前面得出的结论F=5,所以有D + 2F = 10 + D,所以也会往前面进1。那么就有等式( C + 2D + 1 ) % 10 = Z
根据题意,我们知道不同的字母代表不同的数字。所以 B 和 Y 以及 A 和 X,自然代表不同的数字。由公式我们可以看出,B + ( C + 2D + 1 )/10 = Y + n * 10,这里的n,代

表向前进位的数。根据各个字母的取值范围(0,9),我们可以得出结论:
n = 1
A + 1 = X
由于 0 <= ( C + 2D + 1 )/10 <= 2,且 Y >= 1 (因为G=0)
所以有:
B = 9
( C + 2D + 1 )/10 = 2,即 C + 2D + 1 = 20 + Z

综上,可得A的取值表
_VA[] = { 1, 2, 3, 6, 7 };
同时由于 X = A + 1
所以,X的取值表
_VX[] = { 2, 3, 4, 7, 8 };
那么除去这五个值之外的取值有就为
_VLEFT[][5] = {
{ 3, 4, 6, 7, 8 },
{ 1, 4, 6, 7, 8 },
{ 1, 2, 6, 7, 8 },
{ 1, 2, 3, 4, 8 },
{ 1, 2, 3, 4, 6 }
}

所以程序代码为:

unsigned char A, B, C, D, E, F, G, X, Y, Z;
unsigned char _VA[] = { 1, 2, 3, 6, 7 };
unsigned char _VX[] = { 2, 3, 4, 7, 8 };
unsigned char _VLEFT[][5] = {
{ 3, 4, 6, 7, 8 },
{ 1, 4, 6, 7, 8 },
{ 1, 2, 6, 7, 8 },
{ 1, 2, 3, 4, 8 },
{ 1, 2, 3, 4, 6 }
};
G = 0;
F = 5;
B = 9;
unsigned char * pLeft;
bool completed = false;
for( int i = 0; i < 5; i ++ )
{
A = _VA[ i ];
X = _VX[ i ];
pLeft = &_VLEFT[ i ][ 0 ];
//C + 2D + 1 = 20 + Z
for( int j0 = 0; j0 < 5; j0 ++ )
{
C = pLeft[j0];
for( int j1 = 0; j1 < 5; j1 ++ )
{
if( j1 == j0 ) continue;
D = pLeft[j1];
for( int j2 = 0; j2 < 5; j2 ++ )
{
if( j2 == j0 || j2 == j1 ) continue;
Z = pLeft[ j2 ];
if( ( C + 2 * D ) == ( 19 + Z ) )
{
Y = ( ( C + 2 * D + 1 ) / 10 + B ) % 10;
if( Y != A && Y != Z )
{
for( int j3 = 0; j3 < 5; j3 ++ )
{
if( j3 != j0 && j3 != j1 && j3 != j2 && pLeft[ j3 ] != Y )
{
E = pLeft[ j3 ];
}
}
completed = true;
break;
}
}
}
if( completed ) break;
}
if( completed ) break;
}
if( completed ) break;
}

结果是:
2 9 7 8 6
8 5 0
+ 8 5 0
----------
3 1 4 8 6
第二题
程序代码以及运行结果

#include <stdio.h>
int check(int* nums);
int main()
{int a,b,c,d,e,num[5];
printf("可能的组合是:\n");
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++)
{
num[0]=a;
num[1]=b;
num[2]=c;
num[3]=d;
num[4]=e;
if(check(num))
{
if(a==1)printf("a ");
if(b==1)printf("b ");
if(c==1)printf("c ");
if(d==1)printf("d ");
if(e==1)printf("e ");
printf("\n");
};
}
}
int check(int* nums)
{
int a,b,c,d,e;
a=nums[0];
b=nums[1];
c=nums[2];
d=nums[3];
e=nums[4];
if(a==1&&b!=1)return 0;
if(b==1&&c==1)return 0;
if(c==1&&d!=1)return 0;
if(c!=1&&d==1)return 0;
if(d!=1&&e!=1)return 0;
if(e==1&&(a!=1||d!=1))return 0;
return 1;
}

执行结果:

c d
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2008-03-27
展开全部
1. 给定等式 A B C D E 其中每个字母代表一个数字,且不同数字对应不
D F G 同字母。编程求出这些数字并且打出这个数字的
+ D F G 算术计算竖式。
———————
X Y Z D E

#include <stdio.h>
int num[13];
long i,j;
void seperate(int* nums, long abcde, long dfg, long xyzde);
int check(void);
int main()
{
for(i=10234;i<=98765;i++)
{for(j=102;j<=987;j++)
{seperate(num,i,j,i+j*2);
if(check()) goto ok;
}}
ok:
printf(" %d%d%d%d%d\n",num[0],num[1],num[2],num[3],num[4]);
printf(" %d%d%d\n",num[5],num[6],num[7]);
printf(" + %d%d%d\n",num[5],num[6],num[7]);
printf("----------\n");
printf(" %d%d%d%d%d\n",num[8],num[9],num[10],num[11],num[12]);
}
void seperate(int* nums, long abcde, long dfg, long xyzde)
{
long n,p;
n=abcde;
nums[4]=n%10;
n=n/10;
nums[3]=n%10;
n=n/10;
nums[2]=n%10;
n=n/10;
nums[1]=n%10;
n=n/10;
nums[0]=n%10;
n=dfg;
nums[7]=n%10;
n=n/10;
nums[6]=n%10;
n=n/10;
nums[5]=n%10;
n=xyzde;
nums[12]=n%10;
n=n/10;
nums[11]=n%10;
n=n/10;
nums[10]=n%10;
n=n/10;
nums[9]=n%10;
n=n/10;
nums[8]=n%10;
}
int check()
{
int temp[10],m,n;
if(num[0]==num[8]) return 0;
if(num[1]==num[9]) return 0;
if(num[2]==num[10]) return 0;
if(num[3]!=num[11]||num[3]!=num[5]) return 0;
if(num[4]!=num[12]) return 0;
temp[0]=num[0];
temp[1]=num[1];
temp[2]=num[2];
temp[3]=num[3];
temp[4]=num[4];
temp[5]=num[6];
temp[6]=num[7];
temp[7]=num[8];
temp[8]=num[9];
temp[9]=num[10];
for(m=0;m<10;m++)
{
for(n=m+1;n<10;n++)
if(temp[m]==temp[n]) return 0;
}
return 1;
}

执行结果:
29786
850
+ 850
----------
31486
2. A、B、C、D、E五名学生有可能参加计算机竞赛,根据下列条件判断哪些人参加了竞赛:
(1)A参加时,B也参加;
(2)B和C只有一个人参加;
(3)C和D或者都参加,或者都不参加;
(4)D和E中至少有一个人参加;
(5)如果E参加,那么A和D也都参加。

#include <stdio.h>
int check(int* nums);
int main()
{int a,b,c,d,e,num[5];
printf("可能的组合是:\n");
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++)
{
num[0]=a;
num[1]=b;
num[2]=c;
num[3]=d;
num[4]=e;
if(check(num))
{
if(a==1)printf("a ");
if(b==1)printf("b ");
if(c==1)printf("c ");
if(d==1)printf("d ");
if(e==1)printf("e ");
printf("\n");
};
}
}
int check(int* nums)
{
int a,b,c,d,e;
a=nums[0];
b=nums[1];
c=nums[2];
d=nums[3];
e=nums[4];
if(a==1&&b!=1)return 0;
if(b==1&&c==1)return 0;
if(c==1&&d!=1)return 0;
if(c!=1&&d==1)return 0;
if(d!=1&&e!=1)return 0;
if(e==1&&(a!=1||d!=1))return 0;
return 1;
}

执行结果:

可能的组合是:
c d

参考资料: 题和答案在http://www.nclg.cn/bbs/thread-71001-1-1.html

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
y11022053
2008-03-23
知道答主
回答量:5
采纳率:0%
帮助的人:3.8万
展开全部
我试着帮你做下...做出来我就告诉你...

我又来了,这次带着答案过来的。
我刚才尝试写了下,我算出来的结果是6;
把十进制的6化成二进制的数 即00110;
A B C D E
0 0 1 1 0 // 1代表去了,0代表没去

我给代码加了些注释,希望你能看懂

我用VC++可以运行。

把十进制数N写成二进制数XXXXXXXX
那低五位的数字赋给ABCED,那么N++时,
ABCDE就能取遍00000~11111
然后就按照您的5个要求来求解问题
第一个题目,我没看懂啥意思
我给的是第二题的答案
#include<stdio.h>
#include<stdlib.h>
void main ()
{

int a,b,b1,c1,d1,c,d,e,n;

for(n=1;n<=31;n++)
{
a = n>>4;
b1= n>>3;
b = b1&1;
c1= n>>2;
c = c1&1;
d1= n>>1;
d = d1&1;
e = n&1;
if(a==1&&b==0)//第一个条件不满足就继续循环
continue;
else
if(b==c)//
continue;
else
if(c!=d)//
continue;
else
if(d==0&&e==0)//
continue;
else
if((e==1&&a==0&&d==0)||(e==1&&a==0&&d==1)||(e==1&&a==1&&d==0))
continue;
else
printf("%d\n",n);
}

system("pause");

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2008-03-23
展开全部
第一题没看懂什么意思。。。

第二题:
---------------------------
#include <stdio.h>
int main()
{
int A,B,C,D,E;
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==1&&B==1)||(A==0))
&&((B==1&&C==0)||(B==0&&C==1))
&&((C==1&&D==1)||(C==0&&D==0))
&&((D==1&&E==0)||(D==0&&E==1)||(D==1&&E==1))
&&((E==1&&A==1&&D==1)||(E==0)))
printf("the rusult is A=%d B=%d C=%d D=%d E=%d\n",A,B,C,D,E);
}
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(6)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式