一、程序填空📝 --- 十进制转其他进制
难度:⭐⭐
题目📃
函数 fun 的功能是:将整数 m 转换成 n(二~十六)进制数的字符串,并通过函数值返回字符串首地址。
例:输入:125 16,则输出:7d
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
代码如下:
在1️⃣2️⃣3️⃣处填空
#include <stdio.h> #include <string.h> char c[32]; char *fun(int m, int n) { int i = 0, j = 0, a[32]; char b[16] = { '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f' }, *p; do { a[i] = m%n; /**********found**********/ m = 1️⃣; i++; /**********found**********/ } while (2️⃣); for (--i; i >= 0; --i) { n = a[i]; /**********found**********/ c[j++] = 3️⃣; } c[j] = 0; p = c; return p; } void main() { int m, n; char s[32]; scanf("%d %d", &m, &n); strcpy(s, fun(m, n)); printf("%s\n", s); }
分析🧐
这里要注意,第一个是十进制的值,第二个值是转成对应的进制
例如题中给的例子,就是让十进制125转成16进制
现在来逐个分析每一空(最后一空是难点)
- 填写:m / n
因为由十进制转任意进制的原理可知
十进制模除对应进制取余数,再反向输出即可
那么这个当前值就要更新为值
- 填写:m != 0
当值不为零时就继续取余 - 填写:b[n]
看到b数组就要想想他的作用是什么
很明显是用于将对应位数的字符取出来
解答代码如下:
#include <stdio.h> #include <string.h> char c[32]; char *fun(int m, int n) { int i = 0, j = 0, a[32]; char b[16] = { '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f' }, *p; do { a[i] = m%n; /**********found**********/ m = 1️⃣m / n; i++; /**********found**********/ } while (2️⃣m != 0); for (--i; i >= 0; --i) { n = a[i]; /**********found**********/ c[j++] = 3️⃣b[n]; } c[j] = 0; p = c; return p; } void main() { int m, n; char s[32]; scanf("%d %d", &m, &n); strcpy(s, fun(m, n)); printf("%s\n", s); }
二、程序修改🛠️ --- 非素数求和
难度:⭐
题目📃
函数 fun 的功能是:求一维数组 a 中非素数之和 sum,其结果 sum 通过函数返回。
例:22,3,65,37,18,19,10,11,12,23,15,17,则输出结果:sum=142
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构!
代码如下:
在代码中找出3个错误并修改
#include <stdio.h> int fun(int a[], int n) { int i, j, k, sum; sum = 0; for (i = 0; i < n; i++) { k = a[i] / 2; /**********found**********/ for (j = 2; j < k; j++) { if (a[i] % j == 0) /**********found**********/ continue; } /**********found**********/ if (j >= k) sum += a[i]; } return sum; } int main() { int a[12] = { 22,3,65,37,18,19,10,11,12,23,15,17 }; printf("sum=%d\n", fun(a, 12)); return 0; }
分析🧐
本题还是很容易理解的,要掌握素数
素数:只能被1或怎么整数的数字,例如:11
- 第11行的j < k改成 j <= k
如果这里的k是要是a[i]的原值的话就不能有等于
因为如果是等于的话就是和自己整除
那么这里是将要测试的数字除2了,那么就要等于 - 第15行的continue;改成break;
因为如果能被除了1和自己以外的数整除就说明不是素数
所以就要打断 - 第18行的if (j >= k)改成 if(j <=k)
因为根据题意,这里是计算非素数的和
也就是通过break打断的,不是正常结束的
所以条件就和11行判断循环的条件一样就可以了
解答代码如下:
#include <stdio.h> int fun(int a[], int n) { int i, j, k, sum; sum = 0; for (i = 0; i < n; i++) { k = a[i] / 2; /**********found**********/ for (j = 2; 1️⃣j <= k; j++) { if (a[i] % j == 0) /**********found**********/ 2️⃣break; } /**********found**********/ 3️⃣if (j <= k) sum += a[i]; } return sum; } int main() { int a[12] = { 22,3,65,37,18,19,10,11,12,23,15,17 }; printf("sum=%d\n", fun(a, 12)); return 0; }
三、程序设计💻 --- 重复数统计
难度:⭐⭐⭐
题目📃
请编写函数 fun,其功能是:从一个整数数组中,统计出有重复数字数的个数存于 m 中,m 值由函数值返回。
例如:2430, 3001, 1798, 199, 498, 277, 229, 851, 369, 1146
其中如:3001 中有重复的数字 0
输出:Total Num=5
注意:部分源程序在文件 PROG1.C 中。
请勿改动主函数 main 和其它函数中的任何内容,仅在函数 fun 的花括号中填入你编写的若干语句。
代码如下:
在fun函数中编写
#include <stdio.h> #include <string.h> int fun(int a[], int n) { } void main() { int a[10]={2430,3001,1798,199,498,277,229,851,369,1146}; int m; m = fun(a, 10); printf("符合条件的数共有:%d\n",m); getchar(); }
分析🧐
由题意可知,这里要统计一个数组中的一个整数里有重复数字的个数
可以这样:
- 先在数组中取出一个数
- 对这个数进行拆解,放到新的数组b中
- 再对这个这个b数组进行遍历,看是否有相等的数字
- 有的话就将其加1
解答代码如下:
#include <stdio.h> #include <string.h> int fun(int a[], int n) { int i, j, k, flag, value = 0, save = 0; int b[10] = {0}; //一个循环取一个数 for(i = 0; i < n; i++) { j = 0; //将这个数中的每个数字 //保存到数组b中 while(a[i] != 0) { b[j++] = a[i] % 10; a[i] = a[i] /10; } //判断这个数是否有重复的数 for(k = 0; k < j; k++) { for(flag = k+1; flag < j; flag++) { //如果有相等的数,就给save赋1 if(b[k] == b[flag]) { save = 1; break; } } } //如果save为1,则表示有重复的数,就将其加一 if(save == 1) { value++; save = 0; } } return value; } void main() { int a[10]={2430,3001,1798,199,498,277,229,851,369,1146}; int m; m = fun(a, 10); printf("符合条件的数共有:%d\n",m); getchar(); }
如果本文对您有帮助,还希望点点关注呢,这将是我不断前进的动力😊