南京理工大学2013年复试上机题(含答案)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.输入一个整数转换成二进制输出

/*********************************************************************************程序源码*************************************************************************************/
#include<iostream>
#include<string>

using namespace std;

int main()
{
int num;
char arr[50];
cout<<"请输入一个十进制整数:"<<endl;
while(cin>>num)
{
int temp=num;
int i=0;
while(num)
{
arr[i++]=num%2+'0';
num/=2;
}
cout<<temp<<"对应的二进制序列是:\n";
for(int j=i-1;j>=0;j--)
cout<<arr[j];
cout<<endl;
cout<<"\n请输入一个十进制整数:"<<endl;
//cin>>num;
}
return 0;
}

2.试想32位整型数据所能表示的最大数阶乘。假设y=x!,在32位整型内,x最大为多少y不溢出,输出x和y的值。

/*********************************************************************************程序源码*************************************************************************************/
#include<iostream>
#include<limits>

using namespace std;

double jie(int num)
{
if(num==0)
return 1;
else
return num*jie(num-1);
}

int main()
{
int maxint=numeric_limits<int>::max();//或者int maxint=INT_MAX;
int num=0;
while(jie(num)<=maxint)
{
num++;
}
cout<<"保证阶乘不溢出的整型数据最大为\n"<<num-1<<"\n其阶乘为:\n"<<maxint<<endl;
return 0;
}

3.输入一个卡号判断是否合法。其中卡号长度为16-19位,只能是数字。满足:
(1)从卡号最后一位开始,逆向将奇数位相加。
(2)从卡号最后一位开始逆向将偶数位数字,先乘以2(如果乘积是两位数,则将其减去9)再相加。
(3)将奇数位总和与偶数位总和相加,结果应能被10整除。
例如:5432123456788881合法,改变其中任何一位就不合法。

/*********************************************************************************程序源码*************************************************************************************/
#include<iostream>
#include<string>

using namespace std;

//求一串数字和
int sum(char arr[])
{
int len=strlen(arr);
int sum1=0,sum2=0;
for(int i=len-1,j=1;i>=0;i--,j++)
{
if(j%2!=0&&j<=len)
sum1+=(arr[i]-'0');
else
if(j%2==0&&j<=len)
{
int temp=arr[i]-'0';
if(temp*2>=10)
temp=2*temp-9;
else
temp=temp*2;
sum2+=temp;
}

}
return sum1+sum2;
}

//判断一个字符串中有没有非数字
bool isnum(char arr[])
{
for(int i=0;i<strlen(arr);i++)
{
if(arr[i]>='0'&&arr[i]<='9')
continue;
else
{
return false;
break;
}
}
return true;
}

int main()
{
char id[19];
cout<<"请输入一个卡号:\n"

;
while(cin>>id)
{
int leng=strlen(id);
if(leng>19||leng<16)
cout<<"卡号不合法:不符合长度要求!"<<endl;
else
{
if(!isnum(id))
cout<<"卡号不合法:含有非
数字!"<<endl;
else
{
if(sum(id)%10==0)
cout<<"卡号合法!"<<endl;
else
cout<<"卡号不合法!"<<endl;
}
}
cout<<"\n请输入一个卡号:\n";
}//while

return 0;
}


4.A、B、C、D、E五个人去捕鱼。第二天,A将捕到的鱼分成五份,把多余的一条扔掉,并拿走自己的一份。接下来的四个人用同样的方法都能拿走鱼。问他们总共捕了至少多少条鱼。
(本题用了两种方法做的,一种是递归,一种非递归)

/*********************************************************************************程序源码*************************************************************************************/
4.1 非递归方法

#include<iostream>

using namespace std;

bool pan(int num,int n)
{
for(int i=1;i<=n-1;i++)
{
num=num-(num-1)/5-1;
if(num>0&&num%5==1)
continue;
else
{
return false;
break;
}
}
return true;
}

int main()
{
int n,fish;
while(cin>>n)
{
for(fish=6;;fish=fish+5)
{
if(pan(fish,n))
{
cout<<"当人数为"<<n<<"时,鱼的总数至少为:\n"<<fish<<endl<<endl;
break;
}
else
{
continue;
}
}
}//while
return 0;
}

/*********************************************************************************程序源码*************************************************************************************/
4.2递归方法

#include<iostream>
using namespace std;
int f1=0;
bool flag=false;
int f(int n)
{
if(n==1)
return f1;
else
{
if((f(n-1)-1)%5!=0||f(n-1)%4!=0)
{
flag=true;
return 0;
}
else
{
return 5*f(n-1)/4+1;
}
}
}
int main()
{
int n=0;
while(cin>>n)
{
for(int i=6;;i++)
{
if((i-1)%5==0)
{
f1=i;
flag=false;
int fish=f(n);
if(flag)
continue;
else
{
cout<<fish<<endl;
break;
}
}
}
}
return 0;
}

5.求亲密数。如果正整数A的全部因子(包括1,不包括A本身)之和等于B,B的全部因子(包括1,不包括B本身)之和也等于A,则A、B是一对亲密数。输出1—3000之间的亲密数,注意不要重复输出。

/*********************************************************************************程序源码*************************************************************************************/
#include<iostream>
#include<math.h>

using namespace std;

int subsum(int num)
{
int sum=0;
for(int i=1;i<num;i++)
{
if(num%i==0)
{
sum+=i;
continue;
}
}
return sum;
}

int main()
{
cout<<"1到3000之内的亲密数对有:\n";
for(int a=1;a<=3000;a++)
{
int

b=subsum(a);
if(subsum(b)==a&&b>=1&&b<=3000&&a<=b)
cout<<a<<" "<<b<<endl;
}
return 0;
}

6.一个N位的十进制正整数,如果其每一位数字的N次方之和等于这个数本身,则称其是一个花朵数。
例如:N=3时,
153满足条件。共有4个。
N=4时,1634满足,共3个。
N=5时,92727满足,共3个。
N=6时,548834满足,共1个。
N=7时,1741725满足,共4个。
要求:(1)用一个宏定义N,例如#define N 3
(2)函数int getP(int x,int y)计算x的y次方。
(3)函数int getWei(int n,int *s)将n的每一位数字按次序存放到数组s中。例如n=567,那么s[0]=5,s[1]=6,s[2]=7,返回3,表示n是一个三位数。
确保N等于4、5、6、7时输出正确结果,每行输出一个。

/*********************************************************************************程序源码*************************************************************************************/
#include<iostream>
#include<string>
#define N 3

using namespace std;

//计算一个数x的y次方
int getP(int x,int y)
{
int xx=x;
if(y==0)
return 1;
else
{
for(int j=1;j<y;j++)
xx*=x;
}
return xx;
}
//
int getWei(int n,int *s)
{
int count=0,tempn=n;
while(tempn)
{
count++;
tempn/=10;
}
int p=count-1;
while(n)
{
*(s+p)=n%10;
n/=10;
p--;
}
return count;
}

int main()
{
int arr[7];
int *p=arr;
cout<<N<<"位数的花朵数有:\n";
for(int num=getP(10,N-1);num<getP(10,N);num++)
{
int count=getWei(num,p);
int temp=0;
for(int i=0;i<count;i++)
{
temp+=getP(arr[i],N);
}
if(num==temp)
cout<<num<<endl;
}
return 0;
}

7.从键盘输入一个由字母构成的字符串(不大于30个字符),要求从该串中取出3个不重复的字符,求所有不同的取法。如果字符串中没有取到3个不同的字符,则提示没有结果。对取出的字符要求按字母升序排列成串,对于不同的取法,输出次序无所谓,但要保证数目正确。
例1:
输入:abc或bccaab
输出:abc
例2:
输入:abcd或daadbac
输出:
abc
abd
bcd
acd

/*********************************************************************************程序源码*************************************************************************************/
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

void getdf(char arr1[],char arr2[])
{
int len1=strlen(arr1),len2=0;
//arr2[0]='\0';
for(int i=0;i<len1;i++)
{
int flag=0;
if(len2==0)
{
arr2[0]=arr1[0];
len2++;
continue;
}
else
{
for(int j=0;j<len2;j++)
{

if(arr1[i]!=arr2[j])
{
flag=0;
continue;
}
else
{
flag=1;
break;
}
}
}//第一个else
if(flag==0)
{
arr2[len2++]=arr1[i];
}
}//第一个for
arr2[len2]='\0';
}

//自

定义cmp函数
bool cmp(char a,char b)
{
return a<b;
}


int main()
{
char arr1[30],arr2[30];
cout<<"请输入一个字符串:\n";
cin>>arr1;
getdf(arr1,arr2);
int leng=strlen(arr2);
sort(arr2,arr2
+leng,cmp);//对arr2按字母表从大到小排序
cout<<"从该字符串中取3个不同字符组成字符串,不同取法有:\n";
for(int i=0;i<leng-2;i++)
for(int j=i+1;j<leng-1;j++)
for(int k=j+1;k<leng;k++)
{
cout<<arr2[i]<<arr2[j]<<arr2[k]<<endl;
}
return 0;
}

相关文档
最新文档