主题:[讨论]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个回复)
101 楼
vcacm [专家分:1500] 发布于 2007-04-06 21:14:00
[quote]to vcacm :请注意题目中的“统计个数”字样[/quote]
看花了眼!
102 楼
7zeal [专家分:370] 发布于 2007-04-07 21:29:00
自己作的第3体递归~~比楼主的差多了~~主要是练练自己的思维
见笑
#include <stdio.h>
#define M 20
char a[M][M];
int fuback(int k,int n,char u)
{
int i;
if(k==0) u='T';
if(k==1) u='J';
for(i=k;i<n;i++)
{
a[k][i]=u;
a[i][k]=u;
a[i][n-1]=u;
a[n-1][i]=u;
}
if(k==1)u='0';
if(k!=((M+1)/2)){fuback(k+1,n-1,u+1);} //无论奇偶都执行到最里面的k!=((M+1)/2);
else return 0;
}
int main(int argc, char *argv[])
{
char ut='0';//初始化字符变量,全靠它
int nt=M;//宽度
int kt=0;//表示由内到外的层数
int h,j;
fuback(kt,nt,ut);//递归
for(h=0;h<M;h++)
{
for(j=0;j<M;j++)
{
printf("%c",a[h][j]);
printf(" ");
}
printf("\n");
}
return 0;
}
103 楼
zhaoyg [专家分:4790] 发布于 2007-04-08 19:24:00
这是我写的第4题
#include<stdio.h>
int main()
{
int i,j,n,p,num;
printf("please enter a number\n");
scanf("%d",&num);
for (i=1;i<=num;i++)
{
n=i;
p=0;
for (j=1;j<=num;j++)
{
if(n<=num) printf("%d",n++);
else printf("%d",++p);
}
printf("\n");
}
getchar();
getchar();
return 0;
}
本人初学,如有不对之处还望各位大侠指出
104 楼
shanhuyu [专家分:60] 发布于 2007-04-10 23:19:00
谢谢楼主分享!
自己先研究研究,等做好了在参照你的
105 楼
vcacm [专家分:1500] 发布于 2007-04-11 08:42:00
我做的第三题:
[quote]
#include <stdio.h>
#define MAX 101
int main(int argc, char **argv)
{
int st[MAX][MAX];
int s[MAX] ;
int N , i,j,k,l ;
scanf("%d",&N);
for(i=2 ; i<= MAX ;i++)
s[i] = i-1 ;
s[0] = 'T';
s[1] = 'J';
for(i=N,j=0,l=1; i>=1; i--,j++, l++)
{
for(k= l; k<= i ; k++)
st[k][l] = st[k][i]= s[j] ;
for(k= l+1 ; k<= i-1 ; k++)
st[l][k] = st[i][k] = s[j] ;
}
for(i= 1; i<= N ; i++)
{
for(j = 1; j<= N ; j++)
{
if(st[i][j]== 'J' || st[i][j]== 'T')
printf("%4c",st[i][j]);
else
printf("%4d",st[i][j]);
}
printf("\n");
}
return 0;
}
[/quote]
106 楼
vcacm [专家分:1500] 发布于 2007-04-11 08:47:00
我做的第一题:
通过推理可知:
F=5,G=0,Y=1,X=A+1,B= 9 ;
[quote]
#include <stdio.h>
#define MAX 11
int A,B,C,D,E,F,G,X,Z,Y;
int compute (int *a, int *b,int *sum)
{
int i,j,index=0;
for(i=1 ; i<=3 ;i++)
{
sum[++index] = a[i]+2*b[i] ;
}
for(j = 4 ; j <= 5 ; j++)
sum[j] = a[j] ;
for(i=1 ; i<=index; i++)
if(sum[i] >= 10)
{
if(sum[index] >= 10)
index ++ ;
sum[i+1] += sum[i] / 10 ;
sum[i] %= 10 ;
}
if(sum[1]==E && sum[2]== D && sum[3] == Z
&& sum[4] == Y && sum[5] == X)
return 1 ;
else
return 0 ;
}
void output(int *a,int *b , int *sum)
{
int i,j;
printf("\n\n=============The result is ============\n\n");
for(i=5 ;i>=1 ; i--)
printf("%3d",a[i]);
printf("\n");
printf("\n%9d%3d%3d\n",b[3],b[2],b[1]);
printf("\n+%8d%3d%3d\n",b[3],b[2],b[1]);
printf("__________________________\n");
printf("\n");
for(j=5 ; j>=1 ;j--)
printf("%3d",sum[j]);
printf("\n\n");
}
void Init ( int *a, int *b , int *sum)
{
memset(a,0,sizeof(a) );
memset(b,0,sizeof(b) );
memset(sum,0, sizeof(sum) );
}
[/quote]
107 楼
vcacm [专家分:1500] 发布于 2007-04-11 08:48:00
[quote]
续.........
int main()
{
//int A,B,C,D,E,F,G;
int a[MAX],b[MAX],sum[MAX];
int flag = 0;
Init ( a, b, sum) ;
printf("\n===========Begin to compute the express !==========\n");
printf(" A B C D E \n");
printf(" D F G \n");
printf(" + D F G \n");
printf(" --------------\n");
printf(" X Y Z D E \n");
B = 9 ;
G = 0 ;
F = 5 ;
Y = 1 ;
for(A = 2 ; A < 8 ; A++)
if(A != F)
{
X = A+1 ;
for(C=6 ; C<= 8 ; C++)
if(C != A && C != X )
{
for(D = 6 ;D <= 8 ; D++)
if(D != A && D!= C && D!=X)
{
for(E = 2 ; E<= 8 ; E++)
if(E != F && E!= A && E!= C && E!= D && E!=X)
{
for(Z = 2 ; Z<= 8 ; Z++)
{
if(Z != X && Z!= Y && Z!= A && Z!=B && Z!=C && Z!=D && Z!=E
&& Z!= F && Z!= G )
{
a[1] = E ; a[2] = D ; a[3] = C ; a[4] = B ; a[5] = A ;
b[1] = G ; b[2] = F ; b[3] = D ;
flag = compute(a,b,sum) ;
if(flag)
goto end ;
else
Init(a,b,sum);
}
}
}
}
}
}
end :
if(flag)
output(a,b,sum);
else
printf("\nNO ANSWERS!\n");
return 0;
}
比较沉.....
[/quote]
108 楼
vcacm [专家分:1500] 发布于 2007-04-11 16:00:00
[quote]
以下几道题不知道自己的想法是不是太天真了
//////////////////////////////////////////////////////////////////////////////
//
// 37. 已知 N 个正整数满足 K1+K2+...+Kn=M。求一组最佳的分解,使得
// K1*K2*....*Kn 为最大。
// 例如:N=2时,给定 K1+K2=6,当 K1=3,K2=3 时,K1*K2=9 为最大
//////////////////////////////////////////////////////////////////////////////
#include "stdio.h"
#include "assert.h"
void main()
{
unsigned int n ,sum, mod, i;
unsigned long product =1;
printf("input N and SUM spaced by space [N <= SUM]:");
scanf("%d %d", &n, &sum);
unsigned int *a = new unsigned int[n];
assert(sum >= n);
for(i = 0; i < n; i++)
a[i] = sum/n;
mod = sum%n;
for(i = 0; i < mod; i++)
a[i] += 1;
for(i = 0; i < n; i++)
{
printf("%-5d", a[i]);
product *= a[i];
}
printf("\nthe maximal product is %ld\n", product);
}
[/quote]
均值定理:
当a>b>e(自然对数)时,a的b次方大于b的a次方,如3*3*3*3>4*4*4,而2*2*2<3*3,故多分出3!
由于N是由键盘输入,所以要分情况讨论:
(1) . 当N =M /3 时,M= 3+3+....+3 ( N个3相加)时, 把M全部分成3,即可得到最大值!
(2) . 当N < M / 3 时, 尽可能地多分成3相加!
109 楼
vcacm [专家分:1500] 发布于 2007-04-11 16:12:00
[quote]
//////////////////////////////////////////////////////////////////////////////
//
// 74. (NOI'95.1_5) m、n为整数,且满足下列两个条件:
// ① m、n∈{1, 2, …, k}, (1≤k≤109)
// ② (n^2-m*n-m^2)^2=1
// 编一程序, 由键盘输入k, 求一组满足上述两个条件的 m、n, 并且使m^2+n^2
// 的值最大.
// 例如, 若 k=1995, 则 m=987, n=1597 时, 则 m、n 满足条件, 且可使
// m^2+n^2的值最大.
//////////////////////////////////////////////////////////////////////////////
#include "stdio.h"
void main()
{
int m, n, k;
scanf("%d", &k);
for(m = k; m >0; m--)
for(n = m+1; n <= k; n++)
if(((n+m)*(n-m)-m*n) == 1)
{
printf("m = %4d n = %4d\n", m, n);
return;
}
}
[/quote]
[code]
楼主:
这题没那么简单吧!
题目的要求是:
(1)满足1,2条件;
(2)要使 M ^2 + N ^2 最大;
[/code]
110 楼
vcacm [专家分:1500] 发布于 2007-04-12 08:30:00
我做的第二十四题:
[code]
/*&&&&&&&& N 后问题解答 &&&&&&&&&&*/
#include <stdio.h>
#include <math.h>
#include <time.h>
#define MAX 10001
#define true 1
#define false 0
#define MAX_N 100
int N,sum=0;
int a[MAX] ;
int flag (int k )
{
int j ;
for( j = 1 ; j< k ; j++)
if( (abs(k-j) == abs (a[j]-a[k]) ) || a[j] == a[k] )
return false ;
return true ;
}
void output( )
{
int i,j,k ;
char m[MAX_N][MAX_N] ;
//memset(m , '+', sizeof(char)*(N+1) );
for(k=1 ; k<=N ; k++)
for(j=1 ; j<=N ; j++)
m[k][j] = '#' ;
for(i= 1 ; i<=N ; i++)
m[i][a[i]]='Q' ;
for(i= 1 ; i<=N ; i++)
{
for(j=1 ; j<=N ; j++)
printf("%5c",m[i][j]);
printf("\n\n");
}
}
void backtrack (int n)
{
int i,j ;
if( n > N )
{
sum ++ ;
printf("\n\n=============The %d of graph is========\n\n",sum);
output() ;
//memset(a , 0 , sizeof(a) ) ;
}
else
for( i= 1 ;i<=N ;i++)
{
a[n] = i ;
if( flag(n) )
backtrack( n + 1) ;
}
}
int main(int argc, char *argv[] )
{
int i,j,k ;
clock_t end , begin ;
printf("Please Input the num of n : ");
scanf("%d", &N );
begin = clock();
backtrack (1) ;
end = clock() ;
printf("\nThe n of %d has %d kind sulation!\n",N , sum );
printf("\nThe program has run %f seconds !\n\n",(double)(end-begin)/1000) ;
return 0 ;
}
[color=AAAFFF]打成的图较好看一些!
[/color]
[/code]
我来回复