0%

题目:八进制转换为十进制

例如,八进制数1507转换为十进制数的计算过程如下:‌
个位‌:7乘以8的0次方,即7 * 8^0 = 7。
十位‌:0乘以8的1次方,即0 * 8^1 = 0。
‌百位‌:5乘以8的2次方,即5 * 8^2 = 320。
‌千位‌:1乘以8的3次方,即1 * 8^3 = 512。

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
#include <stdio.h>
int Cal_Decimal(int input)
{
    int sum = 0;
    while (input!=0)
    {
        int temp = input;
        if (temp < 10)//十进制的数字除到了10以下,直接加上这个数字
        {
            sum = sum + temp;
            break;
        }
        int capacity = 0;//数字的位数
        int temp_capacity;//临时变量-数字的位数
        int a = 10;//用于计算最高位的值
        int i = 0;
        int j = 0;
        int x = 8;//从高位往低位得到各位的数字
        while (temp != 0)//先计算位数
        {
            temp = temp / 10;
            capacity++;
        }
        capacity = capacity - 1;
        temp_capacity = capacity;
        temp = input;
        while (temp_capacity != 0)//获得现在最高位的数字
        {
            temp = temp / 10;
            temp_capacity--;
        }
        j = temp;
        temp_capacity = capacity;
        while (temp_capacity > 1)//计算乘以8的次方数
        {
            x = x * 8;
            temp_capacity--;
        }
        while (capacity >1) //减去最大的一位
        {
            a = a * 10;
            capacity--;
        }
        a = a * j;
        i = x * j;
        input = input - a;
        sum = sum + i;
    }
    return sum;
}
int main() {
    int input;
    int output;
    printf("请输入一个数字:->");
    scanf("%d",&input);
    output = Cal_Decimal(input);
    printf("%d",output);
    return 0;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int main (void)
{
    char s[20] = "1507";
    int i = 0;
    int n = 0;
    while(s[i]!='\0')
    {
        n = n * 8 + s[i] - '0';
        i++;
    }
    printf("%d",n);
    return 0;
}

题目:809*?? = 800*??+9*??其中??代表的两位数,
809*??为四位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int main()
{
    int a;
    for (a=10; a<100; a++)
    {
        if (809*a >= 1000 && 809*a < 10000 && 8*a >=10 && 8*a < 100 && 9*a >= 100 && 9*a <1000) {
            printf("%d\n",a);
            printf("809*%d = %d\n",a,809*a);
        }
    }
    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
#include <stdio.h>
#include <string.h>
void Swap(char* str1,char* str2)
{
    char temp[20];
    strcpy(temp, str1);
    strcpy(str1, str2);
    strcpy(str2, temp);
}
int main()
{
    char ch1[20];
    char ch2[20];
    char ch3[20];
    printf("请输入三个字符串:->\n");
    fgets(ch1, sizeof(ch1), stdin);
    ch1[strcspn(ch1, "\n")] = '\0';
    fgets(ch2, sizeof(ch2), stdin);
    ch2[strcspn(ch2, "\n")] = '\0';
    fgets(ch3, sizeof(ch3), stdin);
    ch3[strcspn(ch3, "\n")] = '\0';
    if (strcmp(ch1, ch2)>0) {
        Swap(ch1, ch2);
    }
    if (strcmp(ch2, ch3)>0) {
        Swap(ch2, ch3);
    }
    if (strcmp(ch1, ch2)>0) {
        Swap(ch1, ch2);
    }
    printf("%s\n%s\n%s\n",ch1,ch2,ch3);
    return 0;
}

题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+…+1/n。
当输入n为奇数时,调用函数1/1+1/3+…+1/n(利用指针函数)。

指针函数:本质是一个函数,不过它的返回值是一个指针。
函数指针:本质是一个指针,该指针的地址指向了一个函数,所以它是指向函数的指针。

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
#include <stdio.h>
float Odd(int n)//求偶数的函数
{
    float i = 2;
    float sum = 0.0;
    while (i <= n)
    {
        sum = sum + 1/i;
        i = i + 2;
    }
    return sum;
}
float Even(int n)//求奇数的函数
{
    float i = 1;
    float sum = 0.0;
    while (i <= n)
    {
        sum = sum + 1/i;
        i = i + 2;
    }
    return sum;
}
int main() {
    int input = 0;
    printf("请输入一个数字:->");
    scanf("%d",&input);
    float Odd(int input);//声明这两个函数
    float Even(int input);
    float (*p)(int);
    if (input % 2 == 0)
    {
        p = Odd;
    }
    else
    {
        p = Even;
    }
    float result = p(input);
    printf("%lf",result);
    return 0;
}

题目:输入一个整数,并将其反转后输出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
int main()
{
    int input;
    int m = 0;
    int k = 0;
    scanf("%d",&input);
    while (input != 0) {
        k = input % 10;
        m = m * 10 + k;
        input = input / 10;
    }
    printf("%d",m);
    return 0;
}

题目:编写input()和output()函数输入和输出学生的数据记录。

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
#include <stdio.h>
struct Student//先定义一个学生结构体
{
    char name[20];
    int age;
    char sex[10];
    char Phone[20];
};
struct Student S[1000];//新建一个结构体数组
int count = 0;//计数
void input()
{
    struct Student S1;
    printf("输入名字:->");
    scanf("%s",S1.name);
    printf("输入年龄:->");
    scanf("%d",&S1.age);
    printf("输入性别:->");
    scanf("%s",S1.sex);
    printf("输入电话:->");
    scanf("%s",S1.Phone);
    S[count] = S1;
    count++;
}
void output()
{
    int i;
    for (i=0; i<count; i++)
    {
        printf("name:%s age:%d sex:%s phone:%s\n",S[i].name,S[i].age,S[i].sex,S[i].Phone);
    }
}
int main() {
    int i = 0;
    do {
        printf("1.输入数据 2.输出数据 0.退出:->");
        scanf("%d",&i);
        switch (i) {
            case 1:
                input();
                break;
            case 2:
                output();
            default:
                break;
        }
    } while (i);
    return 0;
}

题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
int Char_Length(char* ch)
{
    int i = 0;
    while (ch[i] != '\0')
    {
        i++;
    }
    return i;
}
int main()
{
    char ch[] = "abcdefghijklmnopqrstuvwxyz";
    int ret = Char_Length(ch);
    printf("字符串的长度是:%d",ret);
    return 0;
}

题目:有n个人围成一圈,顺序排号。
从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

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>
int Cal_Josephus(int input,int* arr)
{
    int i = 0;
    int j = 0;
    int stay = input;
    int ret = 1;
    while (stay>1)//当现在留下的人数大于1的时候,一直循环
    {
        for (i=0; i<input; i++)
        {
            if (arr[i] == 1)
            {
                j++;
            }
            if (j==3)
            {
                arr[i] = 0;
                j = 0;
                stay--;
            }
        }
    }
    i = 0;
    while (arr[i] != 1)
    {
        ret++;
        i++;
    }
    return ret;
}
int main(int argc, const char * argv[]) {
    int input;
    scanf("%d",&input);
    int arr[input];
    int x;
    for (x=0; x<input; x++)//先把整个数组都赋值1,代表现在留下
    {
        arr[x] = 1;
    }
    int ret = Cal_Josephus(input,arr);
    printf("留下的是第%d个人",ret);
    return 0;
}

字符串左旋

题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数。

思路:先把这个字符串的前半部分保存到一个新的字符串中,再把后半部分保存到另一个字符串中。最后,拼接这两个字符串。

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
#include <stdio.h>
void Get_Front(char* ch,int input,int length,char* Front)//获得前半部分
{
    int i=0;
    for (i=0; i<input; i++)
    {
        Front[i] = ch[i];
    }
}
void Get_Behind(char* ch,int input,int length,char* Behind)//获得后半部分
{
    int j = 0;
    int i=0;
    for (i=input; i<length; i++) {
        Behind[j] = ch[i];
        j++;
    }
}
void Left(char* ch,int input)
{
    int length = 0;//字符串长度
    int x = 0;
    while (ch[length] != '\0')//先看看ch里存了几个字符
    {
        length++;
    }
    char Front[100];//先定义一个字符串来存前边的字符串
    char Behind[100];//定义一个字符串存后半部分字符串
    Get_Front(ch,input,length,Front);//把前半部分存到Front里
    Get_Behind(ch,input,length,Behind);//把后半部分存到Behind里
    int i = 0;
    for (i=0; i<length-input; i++) //替换
    {
        ch[i] = Behind[i];
    }
    for (i=length-input; i<length; i++)//替换
    {
        ch[length-input+x] = Front[x];
        x++;
    }
}
int main()
{
    char ch[100] = {0};
    int input = 0;
    printf("请输入字符串:->");
    scanf("%s",ch);
    printf("请输入要左旋几个字符:->");
    scanf("%d",&input);
    Left(ch,input);
    printf("%s\n",ch);
    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
#include <stdio.h>
void Left(char* ch,int input)
{
    int i = 0;
    char temp[input];
    int length = 0;
    while (ch[length] != '\0')//看一下输入的字符串长度是多少
    {
        length++;
    }
    for (i=0; i<input; i++)//先把要后移的字符串保存到一个临时字符串中
    {
        temp[i] = ch[i];
    }
    for (i=input; i<length; i++)//把后边要前移的字符串移动一下
    {
        ch[i-input] = ch[i];
    }
    for (i=0; i<input; i++) //把之前保存的临时字符串赋值到原数组的最后
    {
        ch[length-input+i] = temp[i];
    }
}

int main()
{
    char ch[100] = {0};
    int input = 0;
    printf("请输入字符串:->");
    scanf("%s",ch);
    printf("请输入要左旋几个字符:->");
    scanf("%d",&input);
    Left(ch,input);
    printf("%s\n",ch);
    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
#include <stdio.h>
void Right(char* ch,int input)
{
    int i = 0;
    char temp[input];
    int length = 0;
    int x = 0;
    while (ch[length] != '\0')//看一下输入的字符串长度是多少
    {
        length++;
    }
    for (i=length-input; i<length; i++)//先把要前移的字符串保存到一个临时字符串中
    {
        temp[x] = ch[i];
        x++;
    }
    for (i=length-input; i>=0; i--)//把前边的字符串往后移,给临时字符串挪位置
    {
        ch[i+input-1] = ch[i-1];
    }
    for (i=0; i<input; i++)//把之前保存的临时字符串赋值到原数组的最前边
    {
        ch[i] = temp[i];
    }
}
int main()
{
    char ch[100] = {0};
    int input = 0;
    printf("请输入字符串:->");
    scanf("%s",ch);
    printf("请输入要右旋几个字符:->");
    scanf("%d",&input);
    Right(ch,input);
    printf("%s\n",ch);
    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
44
45
46
47
48
49
50
51
#include <stdio.h>
void Exchange_Biggest(int* input)
{
    int Biggest = input[0];
    int i;
    int temp;
    int record_Biggest = 0;
    for (i=0; i<10; i++)
    {
        if(input[i]>Biggest)//遍历数组,如果比记录到最大的还大,就把Biggest的值换成更大的。
        {
            Biggest = input[i];
            record_Biggest = i;
        }
    }
    temp = input[0];//把第一个值和最大的交换一下
    input[0] = input[record_Biggest];
    input[record_Biggest] = temp;
}
void Exchange_Smallest(int* input)
{
    int Smallest = input[0];
    int i;
    int temp;
    int record_Smallest = 0;
    for (i=0; i<10; i++)
    {
        if(input[i]<Smallest)
        {
            Smallest = input[i];
            record_Smallest = i;
        }
    }
    temp = input[9];
    input[9] = input[record_Smallest];
    input[record_Smallest] = temp;
}
int main() {
    int input[10];
    int i;
    for (i=0; i<10; i++)//输入数组
    {
        scanf("%d",&input[i]);
    }
    Exchange_Biggest(input);//交换最大的数
    Exchange_Smallest(input);//交换最小的数
    for (i=0; i<10; i++) {
        printf("%d ",input[i]);
    }
    return 0;
}