目錄
一、程序填空📝 --- 十進制轉其他進制
題目📃
分析🧐
二、程序修改🛠? ---?非素數求和
題目📃
分析🧐
三、程序設計💻 ---?重復數統計
題目📃
分析🧐
前言
本文講解:十進制轉其他進制、非素數求和、重復數統計
🏠我的主頁:我的主頁
📚系列專欄:系列專欄
一、程序填空📝 --- 十進制轉其他進制
難度:??
題目📃
函數 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賦1if(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();
}
如果本文對您有幫助,還希望點點關注呢,這將是我不斷前進的動力😊