55.十六进制字符串转换成十进制非负整数。输入一个以‘#’为结束标志的字符串(少于10个字符),滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,输出该字符串并将其转换为十进制后输出。
/*进制转换*/
#include<stdio.h>
int main(void){
int i,k,number;
char hexad[80],str[80];
printf("请输入一个字符串:");
i=0;
while((str[i]=getchar())!='#'){
i++;
}
str[i]='\0';
//滤去非十六进制字符后生成的新字符串hexad
i=0;k=0;
while(str[i]!='\0'){
if((str[i]>='0'&&str[i]<='9')||
(str[i]>='a'&&str[i]<='f')||
(str[i]>='A'&&str[i]<='F')){
hexad[k]=str[i];
k++;
}
i++;
}
hexad[k]='\0';
//输出十六进制新字符串
printf("新字符串:");
for(i=0;hexad[i]!='\0';i++){
putchar(hexad[i]);
}
printf("\n");
//转换为十进制整数
number=0;
for(i=0;hexad[i]!='\0';i++){
if(hexad[i]>='0'&&hexad[i]<='9'){
number=number*16+hexad[i]-'0';
}
else if(hexad[i]>='A'&&hexad[i]<='F'){
number=number*16+hexad[i]-'A'+10;
}
else if(hexad[i]>='a'&&hexad[i]<='f'){
number=number*16+hexad[i]-'a'+10;
}
}
printf("对应的十进制为:%d",number);
return 0;
}
56.查找指定字符。输入一个字符,再输入一个以回车符结束的字符串(少于80个字符),在字符串中查找该字符。如果找到,则输出该字符在字符串中所对应的最大下标,下标从0开始;否则输出“Not found”。
/*查找指定字符*/
#include <stdio.h>
int main() {
char target;
char str[80];
int index = -1;
int i = 0;
printf("请输入一个字符:");
scanf("%c", &target);
getchar(); // 消耗回车符
printf("请输入一个字符串(少于80个字符):");
while((str[i]=getchar())!='\n'){
i++;
}
str[i]='\0';
// 在字符串中查找目标字符
i=0;
while (str[i] != '\0') {
if (str[i] == target) {
index = i;
}
i++;
}
if (index != -1) {
printf("目标字符在字符串中的最大下标为:%d\n", index);
} else {
printf("Not found\n");
}
return 0;
}
57.字符串逆序。输入一个以回车符结束的字符串(少于80个字符),将该字符串逆序存放,输出逆序后的字符串。
/*字符串逆序*/
#include <stdio.h>
#include <string.h>
void reverseString(char* str) {
int len = strlen(str);
int i, j;
char temp;
for (i = 0, j = len - 1; i < j; i++, j--) {
temp = str[i];
str[i] = str[j];
str[j] = temp;
}
}
int main() {
int i=0;
char str[80];
printf("请输入一个字符串:\n");
while((str[i]=getchar())!='\n'){
i++;
}
str[i]='\0';
reverseString(str);
printf("逆序后的字符串为:%s\n", str);
return 0;
}
58.求一批整数中出现最多的数字。输入一个正整数n(1<n≤1000),再输入n个整数,分析每个整数的每一位数字,求出现次数最多的数字。例如输入3个整数1234、2345、3456,其中出现次数最多的数字是3和4,均出现了3次。
/*求一批整数中出现最多的数字*/
#include <stdio.h>
int main() {
int n;
printf("请输入一个正整数n:");
scanf("%d", &n);
int numbers[n];
printf("请输入%d个整数:\n", n);
for (int i = 0; i < n; i++) {
scanf("%d", &numbers[i]);
}
int digitCount[10] = {0}; // 用于统计0-9每个数字的出现次数
for (int i = 0; i < n; i++) {
int num = numbers[i];
while (num > 0) {
int digit = num % 10;
digitCount[digit]++;
num /= 10;
}
}
int maxCount = 0;
for (int i = 0; i < 10; i++) {
if (digitCount[i] > maxCount) {
maxCount = digitCount[i];
}
}
printf("出现次数最多的数字是:");
for (int i = 0; i < 10; i++) {
if (digitCount[i] == maxCount) {
printf("%d ", i);
}
}
printf(",出现了%d次。\n", maxCount);
return 0;
}
59.判断上三角矩阵。输入一个正整数n(1≤n≤6)和n阶方阵a中的元素,如果a是上三角矩阵,输出“YES”,否则,输出“NO”。上三角矩阵指主对角线以下的元素都为0的矩阵,主对角线为从矩阵左上角至右下角的连线。
//判断上三角矩阵
#include <stdio.h>
#include <stdbool.h>
bool isUpperTriangularMatrix(int n, int matrix[][6]) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < i; j++) {
if (matrix[i][j] != 0) {
return false;
}
}
}
return true;
}
int main() {
int n;
printf("请输入正整数n(1≤n≤6):\n");
scanf("%d", &n);
if (n < 1 || n > 6) {
printf("输入的n不符合要求!\n");
return 0;
}
int matrix[6][6];
printf("请输入%d阶方阵的元素:\n", n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &matrix[i][j]);
}
}
if (isUpperTriangularMatrix(n, matrix)) {
printf("YES\n");}
else {
printf("NO\n");}
return 0;
}
60.求矩阵各行元素之和。输入2个正整数m和n(1≤m≤6,1≤n≤6),然后输入矩阵a(m行n列)中的元素,分别求出各行元素之和,并输出。
//求矩阵各行元素之和
#include <stdio.h>
int main() {
int m, n;
printf("请输入两个正整数m和n(1≤m≤6,1≤n≤6):\n");
scanf("%d %d", &m, &n);
if (m < 1 || m > 6 || n < 1 || n > 6) {
printf("输入的m和n不符合要求!\n");
return 0;
}
int matrix[6][6];
printf("请输入矩阵a的元素(%d行%d列):\n", m, n);
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &matrix[i][j]);
}
}
printf("各行元素之和为:\n");
for (int i = 0; i < m; i++) {
int sum = 0;
for (int j = 0; j < n; j++) {
sum += matrix[i][j];
}
printf("第%d行:%d\n", i + 1, sum);
}
return 0;
}
61.找鞍点。输入1个正整数n(1≤n≤6)和n阶方阵a中的元素,假设方阵a最多有1个鞍点,如果找到a的鞍点,就输出其下标,否则,输出“NO”。鞍点的元素值在该行上最大,在该列上最小。
/*找鞍点*/
#include <stdio.h>
#include <stdbool.h>
int main() {
int n;
printf("请输入正整数n(1≤n≤6):\n");
scanf("%d", &n);
if (n < 1 || n > 6) {
printf("输入的n不符合要求!\n");
return 0;
}
int matrix[6][6];
printf("请输入%d阶方阵的元素:\n", n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &matrix[i][j]);
}
}
int saddlePointRow = -1;
int saddlePointCol = -1;
for (int i = 0; i < n; i++) {
int maxInRow = matrix[i][0];
int maxColIndex = 0;
// 在当前行找到最大值及其列索引
for (int j = 1; j < n; j++) {
if (matrix[i][j] > maxInRow) {
maxInRow = matrix[i][j];
maxColIndex = j;
}
}
// 判断最大值是否是该列上的最小值
bool isSaddlePoint = true;
for (int k = 0; k < n; k++) {
if (matrix[k][maxColIndex] < maxInRow) {
isSaddlePoint = false;
break;
}
}
if (isSaddlePoint) {
saddlePointRow = i;
saddlePointCol = maxColIndex;
break;
}
}
if (saddlePointRow == -1 && saddlePointCol == -1) {
printf("NO\n");
} else {
printf("鞍点的下标是:%d行%d列\n", saddlePointRow + 1, saddlePointCol + 1);
}
return 0;
}
62.统计大写辅音字母。输入一个以回车结束的字符串(少于80个字符),统计并输出其中大写辅音字母的个数。大写辅音字母是指除‘A','E','I','O','U'以外的大写字母。
/*统计大写辅音字母*/
#include <stdio.h>
int isUpperCaseConsonant(char c) {
// 检查字符是否为大写辅音字母
return (c >= 'A' && c <= 'Z' && c != 'A' && c != 'E' && c != 'I' && c != 'O' && c != 'U');
}
int main() {
char input[80];
int count = 0;
printf("请输入一个字符串(少于80个字符): ");
fgets(input, sizeof(input), stdin);
for (int i = 0; input[i] != '\0'; i++) {
if (isUpperCaseConsonant(input[i])) {
count++;
}
}
printf("大写辅音字母的个数是: %d\n", count);
return 0;
}
63.冒泡排序。输入n(n≤10)个正整数,将它们从小到大排序后输出,要求使用冒泡排序算法。
/*冒泡排序*/
#include<stdio.h>
void swap(int *px,int *py);
void bubble(int a[],int n);
int main(void){
int n,a[10];
printf("请输入一个正整数n(n≤10):");
scanf("%d",&n);
printf("请输入%d个数:",n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
bubble(a,n);
printf("排序后:");
for(int i=0;i<n;i++){
printf("%3d",a[i]);
}
return 0;
}
void bubble(int a[],int n){
for(int i=1;i<n;i++){
for(int j=0;j<n-i;j++){
if(a[j]>a[j+1]){
swap(&a[j],&a[j+1]);
}
}
}
}
void swap(int *px,int *py){
int t;
t=*px;
*px=*py;
*py=t;
}
64.压缩字符串。输入一个长度小于80的字符串,按规则对字符串进行压缩,输出压缩后的字符串。压缩规则是:如果某个字符x连续出现n(n>1)个,则将这n个字符替换为“nx”的形式,否则保持不变。
/*字符串压缩*/
#include<stdio.h>
void zip(char *p);
int main(void){
char line[80];
printf("请输入一个字符串:");
gets(line);
zip(line);
puts(line);
return 0;
}
void zip(char *p){
char *q=p;
int n;
while(*p!='\0'){
n=1;
while(*p==*(p+n)){
n++;
}
if(n>=10){
*q++=(n/10)+'0';
*q++=(n%10)+'0';
}else if(n>=2){
*q++=n+'0';
}
*q++=*(p+n-1);
p=p+n;
}
*q='\0';
}
65.任意个整数求和。先输入一个正整数n,再输入任意n个整数,计算并输出这n个整数的和。要求使用动态内存分配方法为这n个整数分配空间。
/*求任意个整数和*/
#include<stdio.h>
#include<stdlib.h>
int main(void){
int n,sum,i,*p;
printf("请输入一个正整数n:");
scanf("%d",&n);
//为数组p动态分配n个整数类型大小的空间
if((p=(int *)calloc(n,sizeof(int)))==NULL){
printf("Not able to allocate memory.\n");
exit(1);
}
printf("请输入%d个整数:",n);
for(i=0;i<n;i++){
scanf("%d",p+i);
}
sum=0;
for(i=0;i<n;i++){
sum=sum+*(p+i);
}
printf("和为%d\n",sum);
free(p);
return 0;
}
66.在数组中查找指定元素:输入一个正整数n(1<n≤10),然后输入n个整数存入数组a中,再输入一个整数x,在数组a中查找x,若找到则输出相应的下标,否则显示Not found。要求定义和调用函数search(int list[ ],int n,int x),在数组list中查找元素x,若找到则返回相应下标(从0开始),否则返回-1,参数n代表数组list中元素的数量。
/*查找元素方法一*/
#include<stdio.h>
int search(int a[],int n,int x);
int main(void){
int n,x,index;
printf("请输入一个正整数n(1<n≤10):");
scanf("%d",&n);
printf("请输入%d个整数:",n);
int a[n];
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
printf("请输入一个整数x:");
scanf("%d",&x);
index=search(a,n,x);
if(index==-1){
printf("Not found");
}
else{
printf("%d",index);
}
return 0;
}
int search(int a[],int n,int x){
int i;
for(i=0;i<n;i++){
if(a[i]==x)
return i;
}
return -1;
}
改进版:二分查找法:
/*查找元素方法二*/
#include<stdio.h>
int search(int a[],int n,int x);
int main(void){
int n,x,index;
printf("请输入一个正整数n(1<n≤10):");
scanf("%d",&n);
printf("请输入%d个整数:",n);
int a[n];
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
printf("请输入一个整数x:");
scanf("%d",&x);
index=search(a,n,x);
if(index==-1){
printf("Not found");
}
else{
printf("%d",index);
}
return 0;
}
int search(int a[],int n,int x){
int low=0,high=n-1,mid;
while(low<=high){
mid=(low+high)/2;
if(x==a[mid]){
return mid;
}
else if(x<a[mid]){
high=mid-1;
}
else{
low=mid+1;
}
}
return -1;
}
67.循环后移。有n个整数,使前面各数顺序向后移m个位置,移出的数再从开头移入。编写一个函数实现以上功能,在主函数中输入n个整数并输出调整后的n个数。
/*循环后移*/
#include <stdio.h>
void cyclicShift(int arr[], int n, int m) {
m = m % n; // 确保 m 在 0 到 n-1 之间
int temp[n];
for (int i = 0; i < n; i++) {
int newPos = (i + m) % n;
temp[newPos] = arr[i];
}
for (int i = 0; i < n; i++) {
arr[i] = temp[i];
}
}
int main() {
int n, m;
printf("请输入整数个数 n: ");
scanf("%d", &n);
int arr[n];
printf("请输入%d个整数:\n", n);
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
printf("请输入向后移动的位置数m: ");
scanf("%d", &m);
cyclicShift(arr, n, m);
printf("调整后的整数序列为: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
68.报数。有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到m(m<n)的人退出圈子,从下一个人从1开始报数,报到m的人退出圈子。如此下去,直到留下最后一个人。输入整数n和m,并按退出顺序输出退出圈子的人的编号。
/*报数*/
#include <stdio.h>
#include <stdbool.h>
void josephus(int n, int m) {
bool eliminated[n];
for (int i = 0; i < n; i++) {
eliminated[i] = false;
}
int remaining = n; // 剩余的人数
int position = 0; // 当前位置
printf("退出顺序的人的编号: ");
while (remaining > 0) {
int count = 0;
while (count < m) {
if (!eliminated[position]) {
count++;
}
if (count < m) {
position = (position + 1) % n;
}
}
eliminated[position] = true;
remaining--;
printf("%d", position + 1); // 输出人的编号(从1开始)
if (remaining > 0) {
printf(", ");
}
position = (position + 1) % n;
}
printf("\n");
}
int main() {
int n, m;
printf("请输入总人数 n: ");
scanf("%d", &n);
printf("请输入报数的值 m: ");
scanf("%d", &m);
josephus(n, m);
return 0;
}
69.使用函数实现字符串复制:输入一个字符串t和一个正整数m,将字符串t中从第m个字符开始的全部字符复制到字符串s中,再输出字符串s。要求自定义并调用函数void strmcpy(char *s,char *t,int m)。
/*使用函数实现字符串复制*/
#include<stdio.h>
#include<string.h>
void strmcpy(char *s,char *t,int m){
int i,j;
for(i=m-1,j=0;i<strlen(t);i++){
s[j]=t[i];
j++;
}
printf("字符串t从%d开始复制的字符串s为:%s",m,s);
}
int main(void){
char t[100],s[100];
int m;
printf("请输入一个字符串t:");
scanf("%s",t);
printf("请输入一个正整数m:");
scanf("%d",&m);
strmcpy(s,t,m);
return 0;
}
70.删除字符。输入一个字符串,在输入一个字符ch,将字符串中所有的ch字符删除后输出该字符串。要求定义和调用函数delchar(s,c),该函数将字符串s中出现的所有c字符删除。
/*删除字符*/
#include<stdio.h>
#include<string.h>
void delchar(char *s,char c){
int i,j;
int len=strlen(s);
for(i=0,j=0;i<len;i++){
if(s[i]!=c){
s[j]=s[i];
j++;
}
}
s[j]='\0';
printf("删除%c后的字符串为%s",c,s);
}
int main(void){
char str[100];
char ch;
printf("请输入一个字符串:");
scanf("%s",str);
printf("请输入要删除的字符:");
scanf(" %c",&ch);//注意空格,消耗一个换行符
delchar(str,ch);
return 0;
}
71.分类统计字符个数。输入一行文字,统计其中的大写字母、小写字母、空格、数字以及其他字符各有多少。
/*分类统计字符个数*/
#include <stdio.h>
#include <ctype.h>
int main() {
char text[1000];
int uppercase = 0, lowercase = 0, spaces = 0, digits = 0, other = 0;
printf("请输入一行文字: ");
gets(text); // 注意:不推荐在实际应用中使用gets函数,但在此示例中用于简单输入。
for (int i = 0; text[i] != '\0'; i++) {
if (isupper(text[i])) {
uppercase++;
} else if (islower(text[i])) {
lowercase++;
} else if (isspace(text[i])) {
spaces++;
} else if (isdigit(text[i])) {
digits++;
} else {
other++;
}
}
printf("大写字母: %d\n", uppercase);
printf("小写字母: %d\n", lowercase);
printf("空格: %d\n", spaces);
printf("数字: %d\n", digits);
printf("其他字符: %d\n", other);
return 0;
}
72.输出学生成绩(动态分配):输入学生人数后输入每个学生的成绩,最后输出学生的平均成绩、最高成绩和最低成绩。要求使用动态内存分配来实现。
/*输出学生成绩(动态分配)*/
#include <stdio.h>
#include <stdlib.h>
int main() {
int num_students;
printf("请输入学生人数: ");
scanf("%d", &num_students);
if (num_students <= 0) {
printf("无效的人数输入\n");
return 1;
}
// 使用动态内存分配来存储学生成绩
int *grades = (int *)malloc(num_students * sizeof(int));
if (grades == NULL) {
printf("内存分配失败\n");
return 1;
}
// 输入每个学生的成绩
for (int i = 0; i < num_students; i++) {
printf("请输入第 %d 位学生的成绩: ", i + 1);
scanf("%d", &grades[i]);
}
// 计算平均成绩、最高成绩和最低成绩
int sum = 0;
int max_grade = grades[0];
int min_grade = grades[0];
for (int i = 0; i < num_students; i++) {
sum += grades[i];
if (grades[i] > max_grade) {
max_grade = grades[i];
}
if (grades[i] < min_grade) {
min_grade = grades[i];
}
}
// 输出结果
printf("平均成绩: %.2f\n", (float)sum / num_students);
printf("最高成绩: %d\n", max_grade);
printf("最低成绩: %d\n", min_grade);
// 释放动态分配的内存
free(grades);
return 0;
}