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位数,求出??
- 程序源代码:
- 第一种原题目解:
#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); }
- 第二种原题目解:
#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; }
- 第三种改变题目解:
#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,八进制转换为十进制
- 要求:输入一个八进制数字,将其转为十进制
- 程序源代码:
- 第一种解:
#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; }
- 第二种解:
// / 除法运算符 // % 取余运算符 #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; }
- 第三种解:
// 使用队列 #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); }
- 第四种解:
#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,一个偶数总能表示为两个素数之和
- 题目:输入一个偶数,输出两个素数,这两个素数的和要等于这个偶数。
- 程序源代码:
- 第一种解:
#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; }
- 第二种解:
#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
- 程序源代码:
- 第一种解:
#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; }
- 第二种解:
#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; }