C 2013笔试题

1、把整数分解成素数 90=2*3*3*5 【见2015年】

方法一:

int main()
{
    int n, i=2;
    printf("
Input:");
    scanf("%d", &n);
    printf("=");
    i = 2;
    while (n > 1)
    {
        if (n%i == 0)
        {
            printf("%d", i);
            n = n / i;
            if (n > 1) printf("*");
        }
        else i++;  // 如果不能整除时,说明不是其素数
    }
    return 0;
}

方法二:

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>

//判读是否为质数,并带回它的最小因数(除1之外)。
int isprime(int value, int *submultiple)
{
    int i;
    for (i=2; i<(int)sqrt(value)+1; i++)
    {
        if ((value%i)==0)
        {
            *submultiple=i;
            return 0;
        }
    }
    return 1;
}
//递归调用,如果为质数则打印出来,否则将该数除以它的最小因数(除1之外)后递归调用
void prime_submultiple(int value)
{
    int submultiple;
    if (isprime(value,&submultiple))
    {
        printf("%d",value);
        return;
    }
    else
    {
        printf("%d*",submultiple);
        prime_submultiple(value/submultiple);
        return;
    }
 }
int main()
{
    int x;
    printf("
Please input a integar:");
    scanf("%d",&x);
    printf("%d=",x);
    prime_submultiple(x);
}

方法三:

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
//判断是否为质数,并带回他的最小因数(1除外),这个最小因数为素数
int IfPrime(int value,int *submultiple)
{
    int i;
    for(i=2; i <sqrt(value); i++)
    {
        if(0 == value%i)
        {
            *submultiple =i;
            return 0;
        }
    }
    return 1;
}
//递归调用,如果为质数则直接打印出来,否则为合数,将该合数除以它的最小因数(1除外)后递归调用
void primre_submultiple(int value)
{
    int submultiple;
//value为质数(素数)
    if(IfPrime(value,&submultiple))
    {
        printf("%d",value);
        return;
    }
    else
    {
        printf("%d*",submultiple);
        primre_submultiple(value/submultiple);
        return;
    }
}
void main()
{
    int idata;
    printf("please input a integar:");
    scanf("%d",&idata);
    printf("%d = ",idata);
    primre_submultiple(idata);
    printf("
");
}

2、计算1-x+x^2/2!-x^3/3!+.....+x^n/n! 见【2015相似】

方法一:

#include<stdio.h>

int Calculate(int x,int n)
{
    int total=0;
    int itemp_a=x,itemp_b=1;
    int i,j;
    for(i=0; i <= n; i++)
    {
        if(0 == i)
        {
            total +=1;
            printf("%d : total=%d
",i,total);
        }
        else if(1 == i)
        {
            total = total-x;
            printf("%d : total=%d
",i,total);
        }
        else
//===oushu
        {
            if((0 == i%2))
            {
                itemp_a =1;
                itemp_b =1;
                for(j=i; j>= 1; j--)
                {
                    itemp_a *=x;
                    itemp_b *=j;
                    printf("itemp_a=%d, itemp_b=%d
",itemp_a,itemp_b);
                }
                printf("%d : total=%d
",i,total);
                total +=(itemp_a/itemp_b);
                printf("%d,total:%d
",i,total);
            }
            else
            {
                itemp_a =1;
                itemp_b =1;
                for(j=i; j>= 1; j--)
                {
                    itemp_a *=x;
                    itemp_b *=j;
                    printf("itemp_a=%d, itemp_b=%d
",itemp_a,itemp_b);
                }
                printf("%d : total=%d
",i,total);
                total = total-(itemp_a/itemp_b);
                printf("%d,total:%d
",i,total);
            }
        }
    }
    printf("%d,total:%d
",i,total);
    return total;
}
void main()
{
    int x;
    int n;
    int total;
    printf("please input the data of x,n!
");
    scanf("%d %d",&x,&n);
    total = Calculate(x,n);
    printf("OK,the result is: %d
",total);
}

方法二:

#include <stdio.h>
#include <stdlib.h>

void main()
{
    int n, x, j, i = 1;
    float sum = 1, k = 1;
    printf("Input n and x:
");
    scanf("%d %d", &n, &x);
    while (i <= n)
    {
        k = 1;
        for (j = 1; j <= i; j++)
        {
            k = -1*k*x;
        }
        for (j = 1; j <= i; j++)
        {
            k =  k/ j;
        }
        sum += k;
        i++;
    }
    printf("%f
", sum);
}

方法三:动态规划

#include <stdio.h>
#include <stdlib.h>

void main()
{
    int n,x,i=1;
    float sum = 1,k = 1;
    printf("Input n and x:
");
    scanf("%d %d", &n, &x);
    while (i <= n)
    {
        k = -1 * k*x / i;
        sum += k;
        i++;
    }
    printf("%f", sum);
}

3、删除输入的字符串中的大小写字母和数字 并统计有重复的字符及其重复次数

 


4、输入整形数据,按输入的逆序建立单链表 【见2016年19题】

代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct slist{
    int data;
    struct slist *next;
};

int main()
{
    //逆序建立单链表,头插法
    int x;
    struct slist *p,*head = (struct slist *)malloc(sizeof(struct slist));
    head ->next = NULL;
    printf("请输入元素:
");
    scanf("%d",&x);
    while(x != 9999)
    {
        struct slist *node = (struct slist *)malloc(sizeof(struct slist));
        node ->data = x;
        node ->next = head ->next;
        head ->next = node;
        scanf("%d",&x);
    }
    //输出
    printf("单链表为:");
    p = head ->next;
    while(p != NULL)
    {
        printf("%d	",p ->data);
        p = p->next;
    }
    return 0;
}

5、单链表逆序 【见2017.24】

方法一:头插法

代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct slist
{
    int data;
    struct slist *next;
};
struct slist *head;

// 尾插法建立链表
void creatslist()
{
    int x;
    head = (struct slist *)malloc(sizeof(struct slist));  //头结点
    struct slist *p,*node; // q为尾指针
    p = head;

    printf("请输入元素:");
    scanf("%d",&x);
    while(x != 9999)
    {
        node = (struct slist *)malloc(sizeof(struct slist));
        node ->data = x;
        p ->next = node;
        p = node;
        printf("请输入元素:");
        scanf("%d",&x);
    }
    p ->next = NULL;
}
//链表输出打印
void inputslist()
{
    struct slist *q;//q是工作指针
    q = head ->next; //头结点无元素
    while(q != NULL)
    {
        printf("%d	",q ->data);
        q = q ->next;
    }
}
// 方法一:头插法 逆序链表
void reverseslist1()
{
    struct slist *p,*r; // p是工作指针,r是p的后继,以防断链
    p = head ->next;  //从第一个元素开始
    head ->next = NULL;  //将头节点后置null,断开
    while(p != NULL)
    {
        r = p ->next; // r暂存s后继
        p ->next = head ->next; // 依次将元素结点摘下
        head ->next = p;
        p = r;
    }
}
void main()
{
    creatslist();
    inputslist();
    printf("
逆序后:
");
    reverseslist1();
    inputslist();
}

方法二: 后继指针指向前驱结点

 

 代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct slist
{
    int data;
    struct slist *next;
};
struct slist *head;

// 尾插法建立链表
void creatslist()
{
    int x;
    head = (struct slist *)malloc(sizeof(struct slist));  //头结点
    struct slist *p,*node; // q为尾指针
    p = head;

    printf("请输入元素:");
    scanf("%d",&x);
    while(x != 9999)
    {
        node = (struct slist *)malloc(sizeof(struct slist));
        node ->data = x;
        p ->next = node;
        p = node;
        printf("请输入元素:");
        scanf("%d",&x);
    }
    p ->next = NULL;
}
//链表输出打印
void inputslist()
{
    struct slist *q;//q是工作指针
    q = head ->next; //头结点无元素
    while(q != NULL)
    {
        printf("%d	",q ->data);
        q = q ->next;
    }
}
// 方法二:后继指针指向前驱结点
void reverseslist2()
{
    struct slist *pre,*p = head ->next,*r =p ->next;
    p ->next = NULL;  //处理第一个结点
    while(r != NULL) // r若为空,则p为最后一个节点
    {
        pre = p;
        p = r;
        r = r ->next;
        p ->next = pre;
    }
    head ->next = p;  //处理最后一个结点
}

void main()
{
    creatslist();
    inputslist();
    printf("
逆序后:
");
    reverseslist2();
    inputslist();
}
原文地址:https://www.cnblogs.com/pam-sh/p/12587689.html