主题:入门必做的题
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个回复)
101 楼
小村 [专家分:1800] 发布于 2006-04-24 19:55:00
//第五题我也来一个,用栈的:
#include<iostream>
#include<stack>
using namespace std;
void NumConversion(double num)
{
stack<int> iS;
int sign=0;
int N;
cout<<"Please select the mace number(N<=16):\t";
cin>>N;
//处理负数
if(num<0)
{
cout<<'-';
num*=-1;
sign=1;
}
int iNum=(int)num;
while(iNum)
{
iS.push(iNum%N);
iNum/=N;
}
cout<<num<<"的"<<N<<"进制数表示是:\t";
if(sign)
cout<<'-';
while(!iS.empty())
{
if(iS.top()<10)
cout<<iS.top();
else
switch(iS.top())
{
case 10:
cout<<'A';break;
case 11:
cout<<'B';break;
case 12:
cout<<'C';break;
case 13:
cout<<'D';break;
case 14:
cout<<'E';break;
case 15:
cout<<'F';break;
default:
break;
}
iS.pop();
}
cout<<'.';
double dNum=num-(int)num;
if(dNum==0.0)
cout<<"000000";
sign=0;
while(dNum)
{
dNum*=N;
if((int)dNum<10)
cout<<(int)dNum;
else
switch((int)dNum)
{
case 10:
cout<<'A';break;
case 11:
cout<<'B';break;
case 12:
cout<<'C';break;
case 13:
cout<<'D';break;
case 14:
cout<<'E';break;
case 15:
cout<<'F';break;
default:
break;
}
dNum-=(int)dNum;
sign++;
if(sign==12)
break;
}
cout<<endl;
}
void main()
{
double num;
cout<<"Please input the number:\t";
cin>>num;
NumConversion(num);
}
102 楼
114005255 [专家分:0] 发布于 2006-04-24 20:34:00
大虾!~有答案吗?
作了,但是有些不懂
email:114005255@qq.com
103 楼
coriase [专家分:180] 发布于 2006-04-24 21:06:00
第一题是不是有问题,X的值显然是0;而且算出来的结果也很多啊。
104 楼
xiaoqijun [专家分:660] 发布于 2006-04-24 21:09:00
/******************************************************************************
16. 设有8枚硬币a,b,c,d,e,f,g,h,其中有一枚硬币是伪造的。
真伪硬币的区别仅是重量不同,可能重,可能轻。今要求以天平为工具,用最少的
比较次数挑出伪造硬币,并鉴定它是重还是轻。
*******************************************************************************/
/*=============================================================================
根据交叉相称法:最多为三次,最少为二次!
第一称:任取6个球相称
第二称:根据第一称情况灵活比较
第三称:根据一,二称的情况灵活比较
=============================================================================== */
#include<stdio.h>
void main()
{
int arr[8]={0}; //8个球 初始化为0;
int temp,dig;
printf("请输入有问题的球号:");
scanf("%d",&dig);
printf("请输入是轻还是重<轻为-1,重为1>:"); //1为重,-1为轻
scanf("%d",&temp);
arr[dig-1]=temp;
if (arr[0]+arr[1]+arr[2] == arr[3]+arr[4]+arr[5]) //第一称任取6个球相称 且相等
{
printf("第一次称: 1 2 3球与4 5 6 球相等!\n");
if (arr[6] == arr[0]) //若一称平衡 ,则有问题的球在 7 8两球中 任取其一称
{
printf("第二次称: 7球与 1球相等!"); // 若取的球平衡,则是最后一球有问题 称之
if (arr[7]<arr[0])
{
printf("第三次称: 8球比 1球轻!\n");
printf("8号球偏轻");
}
else
{
printf("第三称: 8球比 1球重!\n");
printf("8号球偏重");
}
}
else
if (arr[6]<arr[0]) //若取的球不平衡 则找出有问题的球
{
printf("第二次称: 7球比 1球轻!\n");
printf("7号球偏轻");
}
else
{
printf("第二次称: 7球比 1球重!\n");
printf("7号球偏重");
}
}
else //若一称不平衡
if (arr[0]+arr[1]+arr[2] > arr[3]+arr[4]+arr[5]) //左边重
{
printf("第一次称: 1 2 3球比 4 5 6球重!\n"); //交换相称
if (arr[0]+arr[3]+arr[6] == arr[4]+arr[1]+arr[7]) //若相等 则有问题的球在被换出的两球之中
{
printf("第二次称: 1 4 7球与 4 2 8球相等!\n"); //取任一有问题的球与一正常球称
if (arr[2] == arr[7]) //若相等 则另一球有问题 根据前二次称的情况判别轻重
{
printf("第三次称: 3球与 8球相等!\n");
printf("6号球偏轻");
}
else
{
printf("第三次称: 3球比 8球重!\n");
printf("3号球偏重");
}
}
else
if(arr[0]+arr[3]+arr[6] > arr[4]+arr[1]+arr[7]) //若不等,则有问题的球在称中
{
printf("第二次称: 1 4 7球比 5 2 8球轻!\n");
if (arr[0] == arr[7]) //根据前二次情况,取一球称第三次 若相等,则另一球有问题,并根据前二次判断轻重
{
printf("第三次称: 1球与 8球相等!\n");
printf("5号球偏轻");
}
else
{
printf("第三次称: 1球比 8球重!\n");
printf("1号球偏重");
}
}
else
{
printf("第二次称: 1 4 7球比 5 2 8球轻!\n");
if (arr[3]<arr[7]) //若不等 则该球有问题,并判断轻重
{
printf("第三次称: 4球比 8球轻!\n");
printf("4号球偏轻");
}
else
{
printf("第三次称: 4球与 8球相等!\n");
printf("2号球偏重");
}
}
}
else
if (arr[0]+arr[1]+arr[2] < arr[3]+arr[4]+arr[5]) //同上理
{
printf("第一次称: 1 2 3球比 4 5 6球轻!\n");
if (arr[0]+arr[3]+arr[6] == arr[4]+arr[1]+arr[7])
{
printf("第二次称: 1 4 7球与 4 2 8球相等!\n");
if (arr[2] == arr[7])
{
printf("第三次称: 3球与 8球相等!\n");
printf("6号球偏重");
}
else
{
printf("第三次称: 3球比 8球轻!\n");
printf("3号球偏轻");
}
}
else
if(arr[0]+arr[3]+arr[6] < arr[4]+arr[1]+arr[7])
{
printf("第二次称: 1 4 7球比 4 2 8球轻!\n");
if (arr[0] == arr[7])
{
printf("第三次称: 1球与 8球相等!\n");
printf("5号球偏重");
}
else
{
printf("第三次称: 1球比 8球轻!\n");
printf("1号球偏轻");
}
}
else
{
printf("第二次称: 1 4 7球比 4 2 8球重!\n");
if (arr[3]==arr[7])
{
printf("第三次称: 4球与 8球相等!\n");
printf("2号球偏轻");
}
else
{
printf("第三次称: 4球比 8球重!\n");
printf("4号球偏重");
}
}
}
printf("\n");
}
105 楼
semker [专家分:4130] 发布于 2006-04-24 23:15:00
上接 第 8 页 [第 76 楼]
//第 8 题解答
//写得有点复杂了
#include <cassert>
#include <iostream>
#include <algorithm>
using namespace std;
//十进制转二进制
char* DecimalToBinary(char* Dst, int Src)
{
assert(Dst);
assert(Src >= 0);
char* Dest = Dst;
int Itr = 31;
while((Src&(1<<Itr--)) == 0);
++Itr;
while(Itr>=0)
*Dest++ = ((Src&(1<<Itr--)) > 0)?'1':'0';
*Dest = 0;
return Dst;
}
//二进制转十进制
unsigned int BinaryToDecimal(unsigned int& Dst, const char* Src)
{
assert(Src);
Dst = 0;
int Itr = static_cast<int>(strlen(Src)) - 1;
while(Itr >= 0)
Dst |= (*Src++ - '0')<<Itr--;
return Dst;
}
//二进制加法
char* BinaryAdd(char* Result, const char* Lhs, const char* Rhs)
{
assert(Result);
assert(Lhs);
assert(Rhs);
const char* LhsEnd = Lhs + strlen(Lhs) - 1;
const char* RhsEnd = Rhs + strlen(Rhs) - 1;
char* Dest = Result;
char Carry = 0;
while(LhsEnd >= Lhs || RhsEnd >= Rhs)
{
*Dest++ = '0' + ((Carry += ((LhsEnd>=Lhs)?*LhsEnd---'0':0) +
((RhsEnd>=Rhs)?*RhsEnd---'0':0))?(Carry%2):0);
Carry = Carry?(Carry/2):0;
}
if(Carry)
*Dest++ = '0' + Carry;
*Dest = 0;
std::reverse(Result, Dest);
return Result;
}
int main()
{
char Lhs[sizeof(int)*8+1];
char Rhs[sizeof(int)*8+1];
char Result[sizeof(int)*8+1];
char* Operand[] = {Lhs, Rhs};
unsigned int Tmp = 0;
for(int i = 0; i < 2; ++i)
{
cin>>Tmp;
cout<<DecimalToBinary(Operand[i], Tmp)<<endl;
}
cout<<BinaryToDecimal(Tmp, BinaryAdd(Result, Operand[0], Operand[1]))<<endl;
return 0;
}
//第 九 题解答
//输者加所有赢者的火柴数之和的一半,所有赢者手中火柴数减半。
#include <iostream>
using namespace std;
void Play(int Ary[], int nPlayers, int Winner)
{
if(Winner > nPlayers)
return;
for(int i = 0; i < nPlayers; ++i)
if(i != Winner-1)
Ary[Winner-1] += Ary[i] /= 2;
Play(Ary, nPlayers, Winner+1);
}
int main()
{
int Ary[4] = {16, 16, 16, 16};
Play(Ary, 4, 1);
for(int i = 0; i < 4; ++i)
cout<<Ary[i]<<'\t';
return 0;
}
//第 十三 题解答
#include <iostream>
#include <vector>
using namespace std;
ostream& operator<<(ostream& Dst, const vector<bool>& Src)
{
vector<bool>::const_iterator Itr = Src.begin();
while(Itr != Src.end())
Dst<<char((*Itr++)?'*':'0');
return Dst;
}
void Play(vector<bool>& Src)
{
for(unsigned int x = 0; x < Src.size(); ++x)
{
for(unsigned int y = 0; y < Src.size(); ++y)
if(y != x)
Src[y] = !Src[y];
cout<<Src<<endl;
}
}
int main()
{
unsigned n = 100;
if(cin>>n)
{
vector<bool> Src;
Src.assign(n, true);
Play(Src);
}
return 0;
}
//第 十四 题解答
#include <iostream>
#include <algorithm>
using namespace std;
void Move(char Ary[], int Size)
{
for(int x = Size/2-1, Dst = Size-1; x > 0; --x, Dst -=2)
for(int y = x+1; y < Dst; ++y)
cout<<(swap(Ary[y-1], Ary[y]), Ary)<<endl;
}
int main()
{
unsigned int n = 0;
if(cin>>n)
{
char* Buffer = new char[2*n+1];
Buffer[2*n] = 0;
for(int i = 0; i < 2*n; ++i)
Buffer[i] = (i>=n)?'0':'*';
cout<<Buffer<<endl;
Move(Buffer, n*2);
delete [] Buffer;
}
return 0;
}
//第 十七 题解答
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
void Swap(string::iterator Lhs, string::iterator Rhs)
{
char Tmp = *Lhs;
*Lhs = *Rhs;
*Rhs = Tmp;
}
string& Sort(string& Ary)
{
string::iterator FItr = Ary.begin();
string::iterator CItr;
char Alpha = 'A';
while(FItr != Ary.end())
if(*FItr <= 'A' || *FItr >= 'Z')
++FItr;
else
if((CItr = find(FItr, Ary.end(), Alpha))!= Ary.end())
Swap(FItr++, CItr);
else
if(++Alpha > 'Z')
break;
return Ary;
}
const char Delim = '^';//终止符
int main()
{
string Buffer;
if(getline(cin, Buffer, Delim))
cout<<Sort(Buffer)<<endl;
return 0;
}
//下接 第 11 页[第 107 楼]
106 楼
if007 [专家分:650] 发布于 2006-04-25 10:04:00
第16题里对于所有情况,硬币问题都能称两次就解决的.
程序也不难.
一点建议:在数据结构上作文章.
107 楼
semker [专家分:4130] 发布于 2006-04-25 17:18:00
上接 第 11 页[第 105 楼]
//第 十八 题解答
#include <iostream>
#include <algorithm>
using namespace std;
void Play(char Ary[], int Space, int Size, char Chr)
{
static char Over;
Over = true;
for(int x = (Size+1)/2; x < Size; ++x)
if(Ary[x] != Chr)
{
Over = false;
break;
}
if(Over)
{
cout<<Ary<<endl;
return;
}
for(int y = std::max(Space-2, 0); y <= std::min(Size-1, Space+2); ++y)
if((y - Space == -2 && Ary[y] == Chr && Ary[y+1] != Chr)
||(y-Space == -1 && Ary[y] == Chr)
||(y-Space == 1 && Ary[y] != Chr)
||(y-Space == 2 && Ary[y] != Chr && Ary[y-1] == Chr))
{
swap(Ary[y], Ary[Space]);
Play(Ary, y, Size, Chr);
swap(Ary[y], Ary[Space]);
if(Over)
{
cout<<Ary<<endl;
break;
}
}
}
int main()
{
unsigned int n;
if(cin>>n)
{
char* Ary = new char[n*2+2];
Ary[n*2+1] = 0;
for(int i = 0; i < n*2+1; ++i)
Ary[i] = (i<n)?'B':((i==n)?' ':'A');
Play(Ary, n, n*2+1, 'B');
delete [] Ary;
}
return 0;
}
//待续...
108 楼
semker [专家分:4130] 发布于 2006-04-25 22:47:00
[quote]第16题里对于所有情况,硬币问题都能称两次就解决的...[/quote]
在不知道伪造硬币比真硬币轻还是重的情况下,2 次应该搞不定吧...
16. 设有8枚硬币a,b,c,d,e,f,g,h,其中有一枚硬币是伪造的。
真伪硬币的区别仅是重量不同,可能重,可能轻。今要求以天平为工具,用最少的
比较次数挑出伪造硬币,并鉴定它是重还是轻。
109 楼
if007 [专家分:650] 发布于 2006-04-26 10:27:00
//18题,非穷举解法。
#include <iostream.h>
const int Max=7;
int t[Max];
int count=0;
void Init()
{
for (int i=0; i<Max/2; i++)
{
t[i]=-1;
t[Max-i-1]=1;
}
}
void output()
{
for (int i=0; i<Max; i++)
{
if (t[i]==-1) cout<<"a ";
else if (t[i]==1) cout<<"b ";
else cout<<" ";
}
cout<<endl;
}
void change(int a, int b)
{
int temp=t[a];
t[a]=t[b]; t[b]=temp;
}
int condition()
{
int sum1=0, sum2=0;
for (int i=0; i<Max/2; i++)
{
sum1+=t[i];
sum2+=t[Max-i-1];
}
if ( (sum1 == Max/2) && (sum2 == -sum1))
return 0;
return 1;
}
void a_jump(int &flag)
{
for (int i=0; i<Max-2; i++)
if ( t[i]==-1 && t[i+1]==1 && t[i+2]==0 )
{ change(i,i+2); output(); count++; flag=0;}
}
void b_jump(int &flag)
{
for (int i=0; i<Max-2; i++)
if ( t[i]==0 && t[i+1]==-1 && t[i+2]==1 )
{ change(i,i+2); output(); count++; flag=0;}
}
void a_move(int &flag)
{
for (int i=0; i<Max-1; i++)
if ( t[i]==-1 && t[i+1]==0 && (i==0 || t[i-1]!=t[i+2] ))
{ change(i, i+1); output(); count++; flag=0;}
}
void b_move(int &flag)
{
for (int i=0; i<Max-1; i++)
if ( t[i]==0 && t[i+1]==1 && (i==Max-2 || t[i-1]!=t[i+2] ))
{ change(i, i+1); output(); count++; flag=0;}
}
void fun()
{
Init();
output();
int i, flag;
while( condition() )
{
flag=1;
if (flag) a_jump(flag);
if (flag) b_jump(flag);
if (flag) b_move(flag);
if (flag) a_move(flag);
}
cout<<Max-1<<"个字母时,"<<endl;
cout<<"一共最少需移动"<<count<<"次"<<endl;
}
void main()
{
fun();
}
110 楼
if007 [专家分:650] 发布于 2006-04-26 10:32:00
16题可以的,不用知硬币重了还是轻了的,而且称法还有很多种.
详情可以到这个网址http://www.programfan.com/club/showbbs.asp?id=151108&page=1
去参考一下.
盛赞一句,他的解法是正确的和迅速的.
但有投机之嫌和思维局限:
1,它是靠人事先计算好一切的,而非靠计算机.
2,它的穷举是是穷举所有表的结果情况,可惜了点,穷举法来穷举所有可执行方案的表岂不妙哉?
(不过这也难怪,他是数学糸的嘛,半路出家的...嘻嘻^_^....)
我来回复