17480-2009-2012年哈尔滨工业大学计算机研究生考试机试编程带答案

哈工大计算机院研究生入学考试机试编程题(09-12)

哈工大计算机专业机试编程题(2009)
题目描述:
    用小于等于n元去买100只鸡,大鸡5元/只,小鸡3元/只,还有1/3元每只的一种小鸡,分别记为x只,y只,z只。编程求解x,y,z所有可能解。
输入:
    测试数据有多组,输入n。
输出:
    对于每组输入,请输出x,y,z所有可行解,按照x,y,z依次增大的顺序输出。
样例输入:
40
样例输出:
x=0,y=0,z=100
x=0,y=1,z=99
x=0,y=2,z=98
x=1,y=0,z=99

参考答案:
#include<stdio.h>
int main()
{
    int x, y, z;
    float n;
    while(scanf("%f",&n)!=EOF)
    {
        for(x=0;5*x<=n;x++)
        {
            for(y=0;3*y<=n;y++)
            {
                z=100-x-y;
                if((5*x+3*y+(float)z/3)<=n)
                {
                    printf("x=%d,y=%d,z=%d\n",x,y,z);
                }
            }
        }
    }
    return 0;
}

题目描述:
输入10个数,要求输出其中的最大值。
输入:
测试数据有多组,每组10个数。
输出:
对于每组输入,请输出其最大值(有回车)。
样例输入:
10 22 23 152 65 79 85 96 32 1
样例输出:
max=152

参考答案:
#include<stdio.h>
int main()
{
    int i, a[10], maxn;
    while(scanf("%d",&a[0])!=EOF)
    {
        maxn=a[0];
        for(i=1;i<10;i++)
        {
            scanf("%d",&a[i]);
            if(maxn<a[i])
            {
                maxn=a[i];
            }
        }
        printf("max=%d\n",maxn);
 
    }
 
    return 0;
}


题目描述:
给定一个数n,要求判断其是否为素数(0,1,负数都是非素数)。
输入:
测试数据有多组,每组输入一个数n。
输出:
对于每组输入,若是素数则输出yes,否则输入no。
样例输入:
13
样例输出:
yes

参考答案:
#include<stdio.h>
#include<math.h>
int judge(int n)
{
    int i;
    if(n<=1)
        return 0;
    else
    {
        for(i=2;i<=sqrt(n);i++)
        {
            if(n%i==0)
                return 0;
        }
        return 1;
    }
}
int main()
{
   int n;
   while(scanf("%d",&n)!=EOF)
   {
        if(judge(n))
            printf("yes\n");
        else
            printf("no\n");
   }
    return 0;
}


题目描述:
给定三角形的三条边,a,b,c。判断该三角形类型。
输入:
测试数据有多组,每组输入三角形的三条边。
输出:
对于每组输入,输出直角三角形、锐角三角形、或是钝角三角形。
样例输入:
3 4 5
样例输出:
直角三角形

参考答案:
//判断直角、锐角、钝角三角形
#include<stdio.h>
#include<math.h>
void exchange(int *a,int *b)
{
    int temp=*a;
    *a = *b;
    *b = temp;
}
int main()
{
    int a, b, c;
    int x;
    while(scanf("%d%d%d",&a,&b,&c)!=EOF)
    {
        if(a<b)
            exchange(&a,&b);
        if(a<c)
            exchange(&a,&c);
        x = a*a - b*b -c*c;

        if(x==0)
            printf("直角三角形\n");
        if(x<0)
            printf("锐角三角形\n");
        if(x>0)
            printf("钝角三角形\n");
    }
    return 0;
}


题目描述:
输入字符串s和字符c,要求去掉s中所有的c字符,并输出结果。
输入:
测试数据有多组,每组输入字符串s和字符c。
输出:
对于每组输入,输出去除c字符后的结果。
样例输入:
heallo
a
样例输出:
hello

参考答案:
#include<stdio.h>
#include<string.h>

int main()
{
    char a[100], b;
    int i, j, l;
    while(scanf("%s %c",a,&b)!=EOF)
    {
        j=0;
        l = strlen(a);
        for(i=0;i<l;i++)
        {
            if(a[i]!=b)
            {
                a[j++]=a[i];
            }
        }
        a[j]=a[l];
        printf("%s\n",a);
    }
    return 0;
}


哈工大计算机专业机试编程题(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;
}

哈尔滨工业大学复试编程试题(2011)

题目描述:
输入一个字符串,长度小于等于200,然后将数组逆置输出。
输入:
测试数据有多组,每组输入一个字符串。
输出:
对于每组输入,请输出逆置后的结果。
样例输入:
hdssg
样例输出:
Gssdh

参考答案:
#include <stdio.h>
#include <string.h>

int main()
{
    int i,j,l;
    char a[200],b[200];
    while(scanf("%s",a)!=EOF)
    {
        l = strlen(a);

        for(i=0,j=l-1;i<l;i++,j--)
        {
            b[i]=a[j];
        }
        b[i]=0;

        puts(b);

    }
    return 0;
}

题目描述:
输入两个正整数,求其最大公约数。
输入:
测试数据有多组,每组输入两个正整数。
输出:
对于每组输入,请输出其最大公约数。
样例输入:
49 14
样例输出:
7

参考答案:
#include<stdio.h>

int main()
{
    unsigned int a,b;
    while(scanf("%d%d",&a,&b)!=EOF)
    {
        while(a!=b)
        {
            if(a>b)
                a=a-b;
            else
                b=b-a;
        }
        printf("%d\n",a);
    }

    return 0;
}


题目描述:
输入20个数,每个数都在1-10之间,求1-10中的众数(众数就是出现次数最多的数,如果存在一样多次数的众数,则输出权值较小的那一个)。
输入:
测试数据有多组,每组输入20个1-10之间的数。
输出:
对于每组输入,请输出1-10中的众数。
样例输入:
5 1 5 10 3 5 3 4 8 6 8 3 6 5 10 7 10 2 6 2 
样例输出:
5

参考答案:

#include<stdio.h>

int main()
{
    int a[20],b[11];
    int i,c;

    while(scanf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5]
                ,&a[6],&a[7],&a[8],&a[9],&a[10],&a[11],&a[12],&a[13],&a[14],&a[15],&a[16],&a[17]
                ,&a[18],&a[19])!=EOF)
    {
        c=1;
        for(i=1;i<11;i++)   //数组b[i]记录i的出现次数,初始化为0,b[0]未用
            b[i]=0;

        for(i=0;i<20;i++)   //统计各个数(1~10)的个数
        {
            b[a[i]]+=1;
        }

        for(i=1;i<11;i++)   //求出现次数最多且最小的那个数
        {
            if(b[c]<b[i])
                c=i;
        }

        printf("%d\n",c);

    }

    return 0;
}


哈尔滨工业大学复试编程试题(2012)

题目描述:
一个百万富翁遇到一个陌生人,陌生人找他谈了一个换钱的计划。该计划如下:我每天给你10 万元,你第一天给我1 分钱,第二天2 分钱,
第三天4 分钱……
这样交换 30 天后,百万富翁交出了多少钱?陌生人交出了多少钱?(注意一个是万元,一个是分)
输入:
该题没有输入
输出:
输出两个整数,分别代表百万富翁交出的钱和陌生人交出的钱,富翁交出的钱以万元作单位,陌生人交出的钱以分作单位。

参考答案:
#include<stdio.h>
#include<math.h>
void main()
{
int sum_a=0, per_day_1=10;   //富人总共得到的money
long sum_b=0, per_day_2=1;
int i ;
for(i=0; i<30; i++)
{
  sum_a+=per_day_1;
  sum_b+=per_day_2;
  per_day_2 *= 2;
}
printf("%d %ld\n",sum_a,sum_b);
}

题目描述:
不用strcat 函数,自己编写一个字符串链接函数MyStrcat(char dstStr[],charsrcStr[])
输入:
两个字符串,字符串由小写字母组成。
输出:
链接后的字符串
样例输入:
hello world
good morning
样例输出:
helloworld
goodmorning

参考答案:
#include<stdio.h>
#include<string.h>


void MyStrCat(char dstStr[], char srcStr[])
{
    int i,j;
    for(i=0; dstStr[i]!=0; i++);
    for(j=0; srcStr[j]!=0; j++)
    {
        dstStr[i++] = srcStr[j];
    }
    dstStr[i] = 0;
}

int main()
{
    char a[25],b[25];

    while(scanf("%s",a)!=EOF&&scanf("%s",b)!=EOF)
    {
        MyStrCat(a,b);

        printf("%s\n",a);

    }

    return 0;
}

题目描述:
计算两个矩阵的乘积,第一个是2*3,第二个是3*2
输入:
输入为两个矩阵,其中一个为2*3的矩阵,另一个为3*2的矩阵
输出:
一个2*2的矩阵(每一个数字后都跟一个空格)
样例输入:
1 2 3
3 4 5
6 7
8 9
10 11
样例输出:
52 58
100 112

参考答案:
    #include<stdio.h>

    int main()
    {
        int a1, b1, c1;
        int d1, e1, f1;

        int a2, b2;
        int c2, d2;
        int e2, f2;

        int a, b;
        int c, d;

        while(scanf("%d%d%d%d%d%d",&a1,&b1,&c1,&d1,&e1,&f1)!=EOF&&
        scanf("%d%d%d%d%d%d",&a2,&b2,&c2,&d2,&e2,&f2)!=EOF)
        {
            a = a1*a2 + b1*c2 + c1*e2;
            b = a1*b2 + b1*d2 + c1*f2;
            c = d1*a2 + e1*c2 + f1*e2;
            d = d1*b2 + e1*d2 + f1*f2;    printf("%d %d \n%d %d \n",a ,b ,c ,d);
        }
        return 0;
    }

免责声明:本站所有的内容均来源于互联网采集或网友投稿提供,不能保证内容的真实性、完整性,仅供个人研究、交流学习使用,不涉及任何商业盈利目的。如果资料有误与官方发布不一致,请与官方最新发布为准,请联系本站管理员予以更改,如果涉及版权等问题,请联系本站管理员予以删除。
维权指引 | 权限说明 | 下载说明 | 内容投诉
考研云分享 » 17480-2009-2012年哈尔滨工业大学计算机研究生考试机试编程带答案
您需要 登录账户 后才能发表评论

发表评论

欢迎 访客 发表评论

加入会员,每天进步一点点
·会员权限 ·加网盘群 ·加微信群