2018年吉林大学计算机学硕复试编程题

计算机:

1、用下列近似公式计算e的值,要求误差小于10的负5次方。 e=1+1/1!+1/2!+1/3!+.....+1/n!

#include
#include
//用下列近似公式计算e的值,要求误差小于10的负5次方。 e=1+1/1!+1/2!+1/3!+.....+1/n!
int main()
{
	int i=1,n=1;
	double temp=0.0;
	double e=1.0;
	for(i=1;1.0/n>=1e-5;i++)
	{
		n=n*i;
		temp=1.0/n;
		e+=temp;
	}
	printf("e=%.6lf",e);
	return 0;
}

2  写一个程序,计算输入的一个数中出现0-9各多少次,并按照0-9的次序输出出现的个数。

#include 
#include 
// 写一个程序,计算输入的一个数中出现0-9各多少次,并按照0-9的次序输出出现的个数。
void fun(int n)
{
    int i,j,m;
    int array[10];
    memset(array,0,sizeof(int)*10);
    while(n!=0)
    {
        m=n%10;
        array[m]+=1;
        n=n/10;
    }
    for(j=0;j<10;j++)
    {
        printf("%d--%d\n",j,array[j]);
    }
}
void main()
{
    int n;
    scanf("%d",&n);
    fun(n);
    return 0;
}

3、判断一个字符串是否是对称的字符串,例如abcddcba,要求返回值是布尔类型。

#include 
#include 
#define N 1024
typedef enum
{
    false,
    true
} bool;
bool fun(char* str)
{
    int i=strlen(str)-1,j=0;
    while(j<=i)
    {
        if((str[i])!=(str[j])){
            return false;
            break;
        }
        j++;i--;
    }
    return true;
}
void main()
{
    char str[N];
    gets(str);
    if(true==fun(str))
    {
        printf("YES");
    }
    else
    {
        printf("NO");
    }

    return 0;
}

4、写一个函数实现大数乘法

#include
#include
#include
#define N 1024
char a[N],a1[N];//两个大数 字符串
int b[N],b1[N];//转换成数组
int d[N*2];//积
void cheng(int max,int b[],int b1[],int d[])
{
	int i,j;
	//相×
	for(i=0;i9)
        {
            d[i]=d[i]-10;
            d[i+1]=d[i+1]+1;
        }
    }
}
int main()
{
	int max,i,j,k;
	scanf("%s",a);
	scanf("%s",a1);
	int c=strlen(a);
	int c1=strlen(a1);
	if(c>c1)//找出最长数组的长度
        max=c;
    else
        max=c1;
    memset(b,0,sizeof(b));
    memset(b1,0,sizeof(b1));
    memset(d,0,sizeof(d));//初始化 将数组中的所有数全部化为0
    //依次倒叙把字符数组存入到整形数组中
    for(i=c-1,j=0;i>=0;i--)
    {
        b[j++]=a[i]-'0';//字符型住那换成整形 借助ASCii码
    }
    for(i=c1-1,j=0;i>=0;i--)
    {
        b1[j++]=a1[i]-'0';
    }
    cheng(max,b,b1,d);//调用
    //输出
    int flag=0;
    for(i=N*2;i>=0;i--)
    {
        if(flag)
        {//借助flag标志,输出第一个不是0的位数前面所有的数
            printf("a%d",d[i]);
        }
        else if(d[i])
        {//倒叙输出 后面都是0,一直循环到第一个不是0的数
            printf("b%d",d[i]);
            flag=1;
        }
    }
    if(!flag)
    {//若俩数是0 和 0,或者一个数是0,则输出0
        printf("%c",'0');
    }
	return 0;
}

 5、写如下程序:1-20这20个数围成一圈,要求相邻的两个数和是素数(用一个数字序列模拟,第一个数为1),如果这个歌全可以围成,就输出这个圈,不能组成。(这个题我不会,emmm!球的某一大神的代码,嗯 大神们看看吧)

摘自:https://zhidao.baidu.com/question/59280067.html

#include 
#include 
#include 
int Num[20], WaitList[20];
int arrPrime[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37};
int isPrime(int n)
{
    int i;
    for (i = 0; i < 12; i++)
    {
        if (n == arrPrime[i])
        {
            return 1;
        }
    }
    return 0;
}
void Insert(int Pos)
{
    int i, j;
    for (i = Num[Pos - 1] % 2; i < 20; i += 2)
    {
        if (WaitList[i] != 0)
        {
            if (isPrime(Num[Pos - 1] + WaitList[i]))
            {
                Num[Pos] = WaitList[i];
                WaitList[i] = 0;
                if (Pos == 19)
                {
                    if (isPrime(Num[0] + Num[19]))
                    {
                        for (j = 0; j < 20; j++)
                        {
                            printf("%d ", Num[j]);
                        }
                        printf("\n");
//getch();
                    }
                }
                else
                    Insert(Pos + 1);
            }
            WaitList[i] = i + 1;
        }
    }
}
void main()
{
    int i;
    for (i = 0; i < 20; i++)
    {
        WaitList[i] = i + 1;
    }
    for (i = 0; i < 20; i++)
    {
        Num[0] = i + 1;
        WaitList[i] = 0;
        Insert(1);
        WaitList[i] = i + 1;
    }
}

 

 

你可能感兴趣的:(2018年吉林大学计算机学硕复试编程题)