C 2013笔试题

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

方法一:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main()
{
    int n, i=2;
    printf("\nInput:");
    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;
}

方法二:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#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("\nPlease input a integar:");
    scanf("%d",&x);
    printf("%d=",x);
    prime_submultiple(x);
}

方法三:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#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("\n");
}

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

方法一:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#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\n",i,total);
        }
        else if(1 == i)
        {
            total = total-x;
            printf("%d : total=%d\n",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\n",itemp_a,itemp_b);
                }
                printf("%d : total=%d\n",i,total);
                total +=(itemp_a/itemp_b);
                printf("%d,total:%d\n",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\n",itemp_a,itemp_b);
                }
                printf("%d : total=%d\n",i,total);
                total = total-(itemp_a/itemp_b);
                printf("%d,total:%d\n",i,total);
            }
        }
    }
    printf("%d,total:%d\n",i,total);
    return total;
}
void main()
{
    int x;
    int n;
    int total;
    printf("please input the data of x,n!\n");
    scanf("%d %d",&x,&n);
    total = Calculate(x,n);
    printf("OK,the result is: %d\n",total);
}

方法二:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <stdlib.h>
 
void main()
{
    int n, x, j, i = 1;
    float sum = 1, k = 1;
    printf("Input n and x:\n");
    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\n", sum);
}

方法三:动态规划

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <stdlib.h>
 
void main()
{
    int n,x,i=1;
    float sum = 1,k = 1;
    printf("Input n and x:\n");
    scanf("%d %d", &n, &x);
    while (i <= n)
    {
        k = -1 * k*x / i;
        sum += k;
        i++;
    }
    printf("%f", sum);
}

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

 


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

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#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("请输入元素:\n");
    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\t",p ->data);
        p = p->next;
    }
    return 0;
}

5、单链表逆序 【见2017.24】#

方法一:头插法

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#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\t",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("\n逆序后:\n");
    reverseslist1();
    inputslist();
}

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

 

 代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#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\t",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("\n逆序后:\n");
    reverseslist2();
    inputslist();
}

作者:Hang Shao

出处:https://www.cnblogs.com/pam-sh/p/12587689.html

版权:本作品采用「知识共享」许可协议进行许可。

声明:欢迎交流! 原文链接 ,如有问题,可邮件(mir_soh@163.com)咨询.

posted @   PamShao  阅读(321)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu