哈工大计算机专业机试编程题(2010)
题目描述:
求1-n内的完数,所谓的完数是这样的数,它的所有因子相加等于它自身,比如6有3个因子1,2,3,1+2+3=6,那么6是完数。即完数是等于其所有因子相加和的数。
输入:
测试数据有多组,输入n,n数据范围不大。
输出:
对于每组输入,请输出1-n内所有的完数。如有案例输出有多个数字,用空格隔开,输出最后不要有多余的空格。
样例输入:
6
样例输出:
6
参考答案:
#include<stdio.h>
int main()
{
int n, i, j, k, a, b[20]={0}; //b[20]存放小于n的完全数
while(scanf("%d",&n)!=EOF) //输入一个n
{
k = 0; //b[k]表示第k+1个完全数,每次输入n后,k清零
for(i=2;i<=n;i++) //2~n,寻找完全数
{
a = 0; //a存放所有约数的和
for(j=1;j<i;j++)
{
if(i%j==0)
{
a+=j; //判断是否为约数
}
}
if(a==i) //判断约数和与原数是否相等
{
b[k++] = a;
}
}
for(i=0;i<(k-1);i++) //输出前k-1个完全数
{
printf("%d ",b[i]);
}
printf("%d\n",b[i]); //输出第k个
}
return 0;
}
题目描述:
给定a和n,计算a+aa+aaa+a...a(n个a)的和。
输入:
测试数据有多组,输入a,n(1<=a<=9,1<=n<=100)。
输出:
对于每组输入,请输出结果。
样例输入:
1 10
样例输出:
1234567900
参考答案:
/*----------------------------------------------------------------------
1.本题是一大数求和问题,无法用已知类型表示,故采用数组进行存储。
2.可用数组表示成为一个栈,结果取值从低位到高位依次入栈,然后依次出栈。即s[0]表示为结果中的个位数,s[1]为十位数,依次类推。
3.s[i]的值可由((n - i)*a + temp)%10获得,其中temp为后一位向前的进位,temp 可由 ((n - i)*a + temp)/10表示。temp初始值为0.
4.注意结果如果为0时的情况,例输入 0 2 输出应为0 而不应是00;
-----------------------------------------------------------------------*/
#include<stdio.h>
int main()
{
int i, a, n, b[50], temp=0, counter;
while(scanf("%d%d",&a,&n)!=EOF)
{
counter = 0;
temp = 0;
for(i=0;i<n;i++)
{
b[i]=((n-i)*a + temp)%10;
temp=((n-i)*a + temp)/10;
}
b[i]=temp;
for(i=n;i>=0;i--) {
if(b[i]==0)
{
counter++;
}
}
if(counter==(n+1)) //结果全零,不能输出n个零
printf("%d",b[0]);
else //如果不全零,只能是n位或n+1位
{
if(b[n]!=0)
printf("%d",b[n]);
for(i=n-1;i>=0;i--)
{
printf("%d",b[i]);
}
}
printf("\n");
}
return 0;
}
题目描述:
输入一个数n,然后输入n个数值各不相同,再输入一个值x,输出这个值在这个数组中的下标(从0开始,若不在数组中则输出-1)。
输入:
测试数据有多组,输入n(1<=n<=200),接着输入n个数,然后输入x。
输出:
对于每组输入,请输出结果。
样例输入:
2
1 3
0
样例输出:
-1
/*----------------------------------------------------------------------
1.顺序查找问题;
2.初始化下标为j=-1,顺序查找数组,若找到某个下标为i的数等于x,则j=i,
查找完毕输出j,若查找过程中j未改变,输出结果就为-1;
-----------------------------------------------------------------------*/
#include<stdio.h>
int main()
{
int i, n, b[200], j, x;
while(scanf("%d",&n)!=EOF)
{
j = -1;
for(i=0;i<n;i++)
{
scanf("%d",&b[i]);
}
scanf("%d",&x);
for(i=0;i<n;i++)
{
if(x==b[i])
{
j = i;
}
}
printf("%d\n",j);
}
return 0;
}
题目描述:
输入一个数n,然后输入n个数值各不相同,调换数组中最大和最小的两个数,然后输出。
输入:
测试数据有多组,输入n(1<=n<=20),接着输入n个数。
输出:
对于每组输入,输出交换后的结果。
样例输入:
2
1 3
样例输出:
3 1
参考答案:
/*----------------------------------------------------------------------
1.顺序查找问题;
2.初始化mini=maxi=1,maxn=minn=a[0],顺序查找数组,
若找到某个下标为i的数大于maxn,则maxi=i,maxn=a[i],
若找到某个下标为i的数小于minn,则mini=i,minn=a[i],
查找完毕交换a[maxi],a[mini],顺序输出数组。
-----------------------------------------------------------------------*/
#include<stdio.h>
int main()
{
int i ,n ,a[50] ,maxi ,mini, temp;
while(scanf("%d",&n)!=EOF)
{
maxi=mini=0;
scanf("%d",&a[0]);
for(i=1;i<n;i++)
{
scanf("%d",&a[i]); if(a[i]>a[maxi])
{
maxi=i;
}
if(a[i]<a[mini])
{
mini=i;
}
}
temp=a[maxi];
a[maxi]=a[mini];
a[mini]=temp;
for(i=0;i<n-1;i++)
{
printf("%d ",a[i]);
}
printf("%d\n",a[i]);
}
return 0;
}
题目描述:
输入一个字符串,长度小于等于200,然后将输出按字符顺序升序排序后的字符串。
输入:
测试数据有多组,输入字符串。
输出:
对于每组输入,输出处理后的结果。
样例输入:
bacd
样例输出:
abcd
参考答案:
/*----------------------------------------------------------------------
1.统计a~z个数,存入c[26]中;
2.根据c[i],打印c[i]个ASCII码为97+i的字符;
-----------------------------------------------------------------------*/
#include<stdio.h>
#include<string.h>
int main()
{
int i, j, k, c[26]={0};
char a[202];
while(scanf("%s",a)!=EOF)
{
j=strlen(a);
for(i=0;i<j;i++)
{
k=a[i];
c[k-97]++;
}
for(i=0;i<26;i++)
{
for(j=0;j<c[i];j++)
{
k=97+i;
printf("%c",k);
}
}
for(i=0;i<26;i++)
{
c[i]=0;
}
printf("\n");
}
return 0;
}
您需要 登录账户 后才能发表评论