C语言必会100题(17)。809*??=800*??+9*??+1/八进制转换为十进制/求0—7所能组成的奇数个数/一个偶数总能表示为两个素数之和/判断一个素数能被几个9整除

特此鸣谢:鱼C_小甲鱼(B站up主)不二如是(鱼C论坛大佬)
题目来源:https://fishc.com.cn
注:这些题在网上都可以搜到,题下面的代码大多是流传下来的答案(我重新排了一下版,增加了可读性),部分是本人经过深思熟虑后编写的。

81,809*??=800*??+9*??+1

  • 题目:809*??=800*??+9*??+1 其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。
  • 修改:这个题目看着就有问题,所以读者只需求出:8*??的结果为两位数,9*??的结果为3位数,求出??
  • 程序源代码:
  1. 第一种原题目解:
    #include <stdio.h>
    
    output(long b,long i);
    
    int main() {
        long int a,b,i;
        a=809;
        for(i=10; i<100; i++) {
            b=i*a+1;
            if(b>=1000&&b<=10000&&8*i<100&&9*i>=100)
                output(b,i);
        }
    }
    
    output(long b,long i) {
        printf("\n%ld/%ld=809*%ld+%ld",b,i,i,b%i);
    }
  2. 第二种原题目解:
    #include<stdio.h>
    int main()
    {
    	int t1,t2,x;
    	for(x=10;x<100;x++)
    	{
    		if(8*x<100 && 9*x>=100)
    		{
    			t1=809*x+1;
    			t2=800*x+9*x+1;
    			if(t1==t2)
    			{
    				printf("%d\n",x);
    			}
    		}
    	}
    	printf("%d\n",t1);
    	return 0;
    }
  3. 第三种改变题目解:
    #include <stdio.h>
    
    int main(void)
    {
        int i;
    
        while (i < 20) {
    
            if ( (8 * i >= 10 && 8 * i <= 100) && (9 *i >= 100 && 9 * i <= 1000)) {
    
                printf("%d\n", i);
                break;
            }
    
            i++;
        }
    
        printf("%d", 809 * i + 1);
    
        return 0;
    }

82,八进制转换为十进制

  • 要求:输入一个八进制数字,将其转为十进制
  • 程序源代码:
  1. 第一种解:
    #include <stdio.h>
    
    int main()
    {
        char *p, s[6];
        int n;
    
        p = s;
        gets(p);
        n = 0;
    
        while(*(p) != '\0') {
    
            n = n * 8 + *p - '0';
            p++;
        }
    
        printf("%d", n);
    
        return 0;
    }
  2. 第二种解:
    // / 除法运算符
    // % 取余运算符
    #include <stdio.h>
    
    int main(void)
    {
        int a[10];
        int num, num_1, num_2, i = 0;
        int square = 1;
    
        printf("请输入一个八进制的数字:");
        scanf("%d", &num_1);
    
        // 判断输入几位数字
        num_2 = num_1;
        while (num_1 > 0) {
    
            num_1 = num_1 / 10;
            i++;
        }
        i = 0;
    
        // 拆分数字到数组里面,a[0]为个位数。
        while (num_2) {
    
            a[i] = num_2 % 10;
            num_2 /= 10;
            i++;
        }
    
        // 转换为十进制
        for (int j = 0; j < i; j++) {
    
    
            num += a[j] * square;
            square *= 8;
        }
    
        printf("该八进制转换为十进制为:%d\n", num);
        return 0;
    }
  3. 第三种解:
    // 使用队列
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef int ElemType;
    
    typedef struct QNode
    {
        ElemType data;
        struct QNode *next;
    } QNode, *QueuePtr;
    
    typedef struct
    {
        QueuePtr front, rear;
    } LinkQueue;
    
    // 创建一个队列
    void initQueue(LinkQueue *q);
    // 队列里面插入数字
    void InsertQueue(LinkQueue *q, ElemType e);
    // 删除节点
    void DeleteQueue(LinkQueue *q, ElemType *e);
    
    int main()
    {
        ElemType e;
        LinkQueue q;
        int num = 0, square = 1;
    
        initQueue(&q);
        printf("请输入一个八进制数字:");
        scanf("%d", &e);
    
        // 数字拆分,分别输入队列
        while (e) {
    
            InsertQueue( &q, e % 10 );
            e /= 10;
        }
    
        // 出队列,进制转换
        while( q.front != q.rear )
        {
    
            DeleteQueue( &q, &e );
            num += e * square;
            square *= 8;
    
        }
    
        printf("该八进制转换为十进制为:%d\n", num);
        return 0;
    }
    
    // 创建一个队列
    void initQueue(LinkQueue *q)
    {
        // 创建一个头结点,头指针,尾指针指向头结点。头结点不存储数据
        q->front = q->rear = (QueuePtr)malloc(sizeof(QNode));
        if( !q->front )
            exit(0);
    
        q->front->next = NULL;
    }
    
    // 队列里面插入数字
    void InsertQueue(LinkQueue *q, ElemType e)
    {
        QueuePtr p;
    
        p = (QueuePtr)malloc(sizeof(QNode));
        if( !q->front )
            exit(0);
    
        p->data = e;
        p->next = NULL;
        q->rear->next = p;
        q->rear = p;
    }
    
    // 删除节点
    void DeleteQueue(LinkQueue *q, ElemType *e)
    {
        QueuePtr p;
    
        if( q->front == q->rear )
            return;
    
        p = q->front->next;
        *e = p->data;
        q->front->next = p->next;
    
        if( q->rear == p )
        {
            q->rear = q->front;
        }
    
        free(p);
    }
  4. 第四种解:
    #include <stdio.h>
    
    int main()
    {
        int a; 
    
        printf("请输入一个整数:");
        // 输入八进制数字
        scanf("%o", &a);
    
        // 将其转换为十进制
        printf("\n十进制数字为:%d\n",a );
    
        return 0;
    }

83,求0—7所能组成的奇数个数

  • 题目:求0—7所能组成的奇数个数
  • 程序源代码:
    #include <stdio.h>
    
    int main()
    {
        long sum = 4, s = 4;//sum的初始值为4表示,只有一位数字组成的奇数个数为4个
        int j;
    
        for (j = 2; j <= 8; j++) {
    
            printf("%d位数为奇数的个数%ld\n", j-1, s);
            if (j <= 2) {
    
                s *= 7;
            } else {
    
                s *= 8;
            }
            sum += s;
        }
    
        printf("%d位数为奇数的个数%ld\n", j-1, s);
        printf("奇数的总个数为:%ld\n", sum);
        return 0;
    }

84,一个偶数总能表示为两个素数之和

  • 题目:输入一个偶数,输出两个素数,这两个素数的和要等于这个偶数。
  • 程序源代码:
  1. 第一种解:
    #include <stdio.h>
    #include <math.h>
    
    int main() {
    
        int a, b, c, d;
        scanf("%d", &a);
    
        for (b = 3; b <= a / 2; b += 2) {
    
            for (c = 2; c <= sqrt(b); c++) {
    
                if (b % c == 0)
                    break;
            }
    
            if (c > sqrt(b)) {
    
                d = a - b;
            } else {
    
                break;
            }
    
            for (c = 2; c <= sqrt(d); c++) {
    
                if (d % c == 0)
                    break;
            }
    
            if(c > sqrt(d)) {
    
                printf("%d = %d + %d\n", a, b, d);
            }
        }
    
        return 0;
    }
  2. 第二种解:
    #include <stdio.h>
    #include <math.h>
    
    int main(void)
    {
        int num;
    
        printf("请输入一个偶数");
        scanf("%d", &num);
    
        if (num % 2 != 0) {
    
            printf("输入错误");
            return 0;
        }
    
        for (int i = 1; i < sqrt(num); i += 2) {
    
            for (int j = 1; j < num; j += 2) {
    
                if (i + j == num) {
    
                    printf("%d = %d + %d\n", num, i, j);
                    break;
                }
            }
        }
    
        return 0;
    }

85,判断一个素数能被几个9整除

  • 题目:判断一个素数能被几个9整除。例:3能被1个9整除。7能被6个9整除,也就是999999整除。
  • 提示: 素数一般指质数。质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。例:2, 3, 5, 7, 11, 13, 17, 19
  • 程序源代码:
  1. 第一种解:
    #include <stdio.h>
    
    int main()
    {
        long int m9 = 9,sum = 9;
        int zi, n1 = 1, c9 = 1;
        
        scanf("%d", &zi);
        while(n1 != 0) {
            if(!(sum % zi))
                n1 = 0;
            else {
                m9 = m9 * 10;
                sum = sum + m9;
                c9++;
            }
        }
        
        printf("%ld,can be divided by %d \"9\"",sum,c9);
    
        return 0;
    } 
  2. 第二种解:
    #include <stdio.h>
    
    int main(void)
    {
        // 定义质数
        int num_prime;
        int sum = 9, i = 10, count = 1;
    
        printf("请输入一个质数:\n");
        scanf("%d", &num_prime);
    
        if (num_prime == 2) {
    
            printf("抱歉,这个无解!");
        } else {
    
            while (sum % num_prime != 0) {
    
                sum += 9*i;
                i *= 10;
                count++;
            }
    
            printf("值解为:%d\n", sum);
            printf("数解为:%d\n", count);
        }
        return 0;
    
    }
posted @ 2022-03-20 21:59  炸天帮帮主  阅读(107)  评论(0编辑  收藏  举报