39.输入一个十进制数,输出相应的八进制数和十六进制数。例如:输入31,输出37和1F。
/*进制转换*/
#include<stdio.h>
#include <stdio.h>
int main(void) {
int decimalNum;
printf("请输入一个十进制数: ");
scanf("%d", &decimalNum);
int octalNum = 0;
int hexNum = 0;
int base = 1;
int tempDecimalNum = decimalNum;
while (tempDecimalNum > 0) {
int remainder = tempDecimalNum % 8;
octalNum = octalNum + remainder * base;
tempDecimalNum = tempDecimalNum / 8;
base = base * 10;
}
base = 1;
tempDecimalNum = decimalNum;
while (tempDecimalNum > 0) {
int remainder = tempDecimalNum % 16;
hexNum = hexNum + remainder * base;
tempDecimalNum = tempDecimalNum / 16;
base = base * 10;
}
printf("八进制数: %d\n", octalNum);
printf("十六进制数: %X\n", hexNum);
return 0;
}
快捷版本:
/*进制转换简洁版*/
#include <stdio.h>
int main() {
int decimalNum;
printf("请输入一个十进制数: ");
scanf("%d", &decimalNum);
printf("八进制数: %o\n", decimalNum);
printf("十六进制数: %X\n", decimalNum);
return 0;
}
40.英文字母转换。输入一行字符,将其中的英文字母转换后输出,其他字符按原样输出。其中英文字母(a~z或A~Z)的转换规则是:将当前字母替换为字母表中的后一个字母,同时将小写字母转换为大写,大写字母转换为小写,如:'a'->'B'、'C'->'d'、'Z'->'a'、'z'->'A'。
使用函数输入版:
/*英文字母转换*/
#include <stdio.h>
int main() {
char inputString[100];
printf("请输入一行字符: ");
fgets(inputString, sizeof(inputString), stdin);
for (int i = 0; inputString[i] != '\0'; i++) {
char currentChar = inputString[i];
if ((currentChar >= 'a' && currentChar <= 'z') || (currentChar >= 'A' && currentChar <= 'Z')) {
// Check if it's a lowercase letter
if (currentChar >= 'a' && currentChar <= 'z') {
// Convert lowercase to uppercase
currentChar = currentChar - 'a' + 'A';
} else {
// Convert uppercase to lowercase
currentChar = currentChar - 'A' + 'a';
}
// Apply the letter shift
if (currentChar == 'z') {
currentChar = 'A';
} else if (currentChar == 'Z') {
currentChar = 'a';
} else {
currentChar++;
}
}
printf("%c", currentChar);
}
return 0;
}
使用循环输入版:
/*英文字母转换*/
#include <stdio.h>
int main() {
printf("请输入一行字符: ");
int currentChar;
while ((currentChar = getchar()) != '\n' && currentChar != EOF) {
if ((currentChar >= 'a' && currentChar <= 'z') || (currentChar >= 'A' && currentChar <= 'Z')) {
if (currentChar >= 'a' && currentChar <= 'z') {
currentChar = currentChar - 'a' + 'A';
} else {
currentChar = currentChar - 'A' + 'a';
}
if (currentChar == 'z') {
currentChar = 'A';
} else if (currentChar == 'Z') {
currentChar = 'a';
} else {
currentChar++;
}
}
putchar(currentChar);
}
return 0;
}
41.求最大公约数。输入两个整数m和n,计算m和n的最大公约数
函数版:
/*求最大公约数*/
#include<stdio.h>
int gcd(int a,int b);
int main(void){
int m,n,result;
printf("请输入两个整数(用空格隔开):");
scanf("%d %d",&m,&n);
result=gcd(m,n);
printf("%d和%d的最大公约数是%d",m,n,result);
return 0;
}
int gcd(int a,int b){
int r,temp;
if(a<b){
temp=a;
a=b;
b=temp;
}
r=a%b;
while(r!=0){
a=b;
b=r;
r=a%b;
}
return b;
}
直接版:
/*求最大公约数*/
#include<stdio.h>
int main(void){
int m,n,i;
printf("请输入两个整数(用空格隔开):");
scanf("%d %d",&m,&n);
for(i=m<n?m:n;i>=1;i--){
if(m%i==0&&n%i==0){
break;
}
}
printf("%d和%d的最大公约数是%d",m,n,i);
return 0;
}
42.输入一行字符,统计其中单词的个数。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。
/*统计单词个数*/
#include<stdio.h>
int main(void){
char ch;
int cnt,word;//cnt记录单词的个数,word是新单词标识
word=cnt=0;//置word的初值为0,表示还没有遇到新单词
printf("请输入一串字符:");
while((ch=getchar())!='\n'){
if(ch==' '){//读入空格,表示不是单词
word=0;//word赋0,表示不是单词
}
else if(word==0){//读入非空格且word为0,此为单词首字符
word=1;//word赋1,表示遇到新单词
cnt++;//累加单词计数器cnt
}
}
printf("%d\n",cnt);
return 0;
}
43.输出所有大于平均值的数。输入n个整数(1≤n≤10),计算这些数的平均值,再输出所有大于平均数的数。
/*输出所有大于平均值的数*/
#include<stdio.h>
int main(void){
int n,sum=0;
double average;
printf("请输入数字个数:");
scanf("%d",&n);
int numbers[n];
printf("请输入%d个数,并用空格隔开:\n",n);
for(int i=0;i<n;i++){
scanf("%d",&numbers[i]);
sum+=numbers[i];
}
average=sum/n;
for(int i=0;i<n;i++){
if(numbers[i]>average){
printf("%d ",numbers[i]);
}
}
return 0;
}
44.利用数组计算斐波那契数列。利用数组计算斐波那契数列的前n个数(1≤n≤46),即:1,1,2,3,5,8,...,并按每行打印5个数的格式输出,如果最后一行的输出少于5个数,也需要换行。
用数组计算并存放斐波那契数列的前n个数,有下列关系式成立:
f[0]=f[1]=1
f[n]=f[n-1]+f[n-2],2≤n≤45
/*利用数组计算斐波那契数列*/
#include<stdio.h>
int main(void){
int n,fib[46];
printf("请输入需要计算计算的斐波那契数列项数n:(1≤n≤46)");
scanf("%d",&n);
if(1<=n&&n<=46){
fib[0]=fib[1]=1;
for(int i=2;i<n;i++){
fib[i]=fib[i-1]+fib[i-2];
}
for(int i=0;i<n;i++){
printf("%6d",fib[i]);
if((i+1)%5==0){
printf("\n");
}
}
if(n%5!=0){
printf("\n");
}
}else
printf("输入的n不合法!");
return 0;
}
45.查找满足条件的所有整数——顺序查找法。输入正整数n(1≤n≤10)和整数x,再输入n个整数并存入数组a中,然后在数组a中查找给定的x。如果数组a中的元素与x的值相同,输出所有满足条件的元素的下标(下标从0开始);如果没有找到,输出“Not found"。
/*顺序查找法*/
#include<stdio.h>
int main(void){
int n,x,flag;
int a[10];
printf("请输入数的个数n和给定的数x:");
scanf("%d%d",&n,&x);
printf("请输入%d个数",n);
for(int i =0;i<n;i++){
scanf("%d",&a[i]);
}
//查找
flag=0;//flag标志x是否找到,先假设x不在数组中,置初值为0
for(int i=0;i<n;i++){
if(a[i]==x){
printf("下标为:%d",i);
flag=1;
}
}
if(flag==0){
printf("Not found\n");
}
return 0;
}
46.输入一个正整数n(1≤n≤10),再输入n个整数,将它们存入数组a中。求最小值及其下标。输出最小值和它所对应的最小下标。交换最小值。将最小值与第一个数交换,输出交换后的n个数。
/*查找最小值下标并与第一个数交换*/
#include<stdio.h>
int main(void){
int n,index;
int a[10];
printf("请输入数字个数n:");
scanf("%d",&n);
printf("请输入%d个数:",n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
//找最小值a[index]
index=0;
for(int i=1;i<n;i++){
if(a[index]>a[i]){
index=i;
}
}
printf("最小值为%d,下标为%d\n",a[index],index);
//交换
int temp=a[0];
a[0]=a[index];
a[index]=temp;
printf("交换第一个数与最小值后的数字为:");
for(int i=0;i<n;i++){
printf("%d ",a[i]);
}
return 0;
}
47.选择法排序。输入一个正整数n(1≤n≤10),再输入n个整数 ,用选择法将它们从小到大排序后输出。
/*选择法排序*/
#include<stdio.h>
int main(void){
int index,n,temp;
int a[10];
printf("请输入一个正整数n:");
scanf("%d",&n);
printf("请输入%d个整数:",n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
//排序
for(int k=0;k<n-1;k++){
index=k;
for(int i=k+1;i<n;i++){
if(a[i]<a[index]){
index=i;
}
}
temp=a[index];
a[index]=a[k];
a[k]=temp;
}
//输出
printf("排序后:");
for(int i=0;i<n;i++){
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
48.二分查找法。输入一个整数n,再输入n个整数,判断其是否按从小到大的顺序排列,如果是按照升序排列的,则使用二分法查找;否则先对数据进行排序再使用二分法查找。
/*二分查找法*/
#include <stdio.h>
#include <stdlib.h>
// 比较函数用于排序
int compare(const void *a, const void *b) {
return (*(int *)a - *(int *)b);
}
// 二分查找函数
int binarySearch(int arr[], int size, int target) {
int left = 0;
int right = size - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == target) {
return mid; // 找到了目标值
}
if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1; // 目标值不存在
}
int main() {
int n;
printf("请输入整数n: ");
scanf("%d", &n);
int *arr = (int *)malloc(n * sizeof(int));
if (arr == NULL) {
printf("内存分配失败\n");
return 1;
}
printf("请输入%d个整数: ", n);
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
// 判断是否按升序排列
int isSorted = 1;
for (int i = 1; i < n; i++) {
if (arr[i] < arr[i - 1]) {
isSorted = 0;
break;
}
}
if (isSorted) {
// 使用二分法查找
int target;
printf("请输入要查找的整数: ");
scanf("%d", &target);
int index = binarySearch(arr, n, target);
if (index != -1) {
printf("%d 在位置 %d 中找到。\n", target, index);
} else {
printf("%d 未找到。\n", target);
}
} else {
// 对数据排序
qsort(arr, n, sizeof(int), compare);
printf("数据已排序,排序后的数据为:\n");
for(int i=0;i<n;i++){
printf("%d ",arr[i]);
}
printf("\n");
// 使用二分法查找
int target;
printf("请输入要查找的整数: ");
scanf("%d", &target);
int index = binarySearch(arr, n, target);
if (index != -1) {
printf("%d 在位置 %d 中找到。\n", target, index);
} else {
printf("%d 未找到。\n", target);
}
}
free(arr);
return 0;
}
49.求矩阵的最大值。输入两个正整数m和n(1≤m,n≤6),再输入1个m×n的矩阵,找出最大值以及它的行下标和列下标。假设最大值唯一。
/*找出矩阵中最大值及其行、列下标*/
#include<stdio.h>
int main(void){
int m,n,col,row;
int a[6][6];
printf("请输入两个正整数m和n:");
scanf("%d%d",&m,&n);
printf("请输入%d个数:",m*n);
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
}
row=col=0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(a[i][j]>a[row][col]){
row=i;
col=j;
}
}
}
printf("最大值为a[%d][%d]=%d\n",row,col,a[row][col]);
return 0;
}
50.方阵转置。输入0一个正整数n(1<n≤6),根据下式生成一个n×n的方阵,将该方阵转置(行列互换)后输出。
a[i][j]=i*n+j+1(0≤i≤n-1,0≤j≤n-1)
/*方阵转置*/
#include<stdio.h>
int main(void){
int n,temp,i,j;
int a[6][6];
printf("请输入一个正整数n:");
scanf("%d",&n);
for(i=0;i<n;i++){
for(j=0;j<n;j++){
a[i][j]=i*n+j+1;
}
}
//转置
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(i<=j){
temp=a[i][j];
a[i][j]=a[j][i];
a[j][i]=temp;
}
}
}
//输出
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%4d",a[i][j]);
}
printf("\n");
}
return 0;
}
51.计算天数。定义函数day_of_year(year,month,day),计算并返回年year、月month和日day对应的是该年的第几天。
///*计算某个日期对应该年的第几天*/
#include <stdio.h>
int day_of_year(int year, int month, int day) {
int leap;
int tab[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
// 判断闰年,当year是闰年时,leap=1,当year是非闰年时,leap=0;
leap = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
// 边界检查
if (month < 1 || month > 12 || day < 1 || day > tab[leap][month]) {
return -1; // 表示日期无效
}
int dayOfYear = day;
// 计算天数
for (int i = 0; i < month; i++) {
dayOfYear += tab[leap][i];
}
return dayOfYear;
}
int main(void) {
int year, month, day;
int dayOfYear;
printf("请输入年、月、日(例:2001.1.1)\n");
scanf("%d.%d.%d", &year, &month, &day);
dayOfYear = day_of_year(year, month, day);
if (dayOfYear == -1) {
printf("输入日期无效\n");
} else {
printf("%d.%d.%d是%d年的第%d天\n", year, month, day, year, dayOfYear);
}
return 0;
}
52.判断回文字符串。输入一个以回车符为标志的字符串(少于80个字符),判断该字符串是否为回文。(回文就是以字符串中心对称,如:“noon”,“radar”是回文,“reader”不是回文。
/*判断字符串是否为回文*/
#include<stdio.h>
int main(void){
char line[80];
int k=0;
printf("请输入一段字符串:");
while((line[k]=getchar())!='\n'){
k++;
}
line[k]='\0';//字符串结束符
//判断line是否是回文
int i=0;
k=k-1;
while(i<k){//同时从字符串两端向中间靠拢并对比对应字符是否相等
if(line[i]!=line[k]){
break;
}
i++;
k--;
}
if(i>=k){//循环正常结束,字符串是回文
printf("输入的字符串是回文!");
}else{//while循环非正常结束,对应字符不相等
printf("输入的字符串不是回文!");
}
return 0;
}
53.凯撒密码。输入一个以回车符为结束标志的字符串(少于80个字符),再输入一个正整数offset,用凯撒密码(将明文中的所有字母都在字母表上向后偏移offset位后替换成密文)加密输出。
/*凯撒密码加密*/
#include<stdio.h>
#define M 26 //定义符号常量M,表示字母表中大写或小写字母的数量26
int main(void){
int offset;
char str[80];
printf("请输入一个字符串:");
int i=0;
while((str[i]=getchar())!='\n'){
i++;
}
str[i]='\0';
printf("请输入偏移量:");
scanf("%d0",&offset);
if(offset>=M){
offset=offset%M;
}
//加密
for(i=0;str[i]!='\0';i++){
if(str[i]>='A'&&str[i]<='Z'){
if((str[i]-'A'+offset)<M){
str[i]=str[i]+offset;
}else{
str[i]=str[i]-(M-offset);
}
}else if(str[i]>='a'&&str[i]<='z'){
if((str[i]-'a'+offset)<M){
str[i]=str[i]+offset;
}else{
str[i]=str[i]-(M-offset);
}
}
}
printf("加密后字符串为:");
for(i=0;str[i]!='\0';i++){
putchar(str[i]);
}
printf("\n");
return 0;
}
注:凯撒密码解密:
#include <stdio.h>
#define M 26
int main(void) {
int offset;
char str[80];
printf("请输入一个字符串:");
int i = 0;
while ((str[i] = getchar()) != '\n') {
i++;
}
str[i] = '\0';
printf("请输入偏移量:");
scanf("%d", &offset);
if (offset >= M) {
offset = offset % M;
}
// 解密
for (i = 0; str[i] != '\0'; i++) {
if (str[i] >= 'A' && str[i] <= 'Z') {
if ((str[i] - 'A' - offset) >= 0) {
str[i] = str[i] - offset;
} else {
str[i] = str[i] + (M - offset);
}
} else if (str[i] >= 'a' && str[i] <= 'z') {
if ((str[i] - 'a' - offset) >= 0) {
str[i] = str[i] - offset;
} else {
str[i] = str[i] + (M - offset);
}
}
}
printf("解密后字符串为:");
for (i = 0; str[i] != '\0'; i++) {
putchar(str[i]);
}
printf("\n");
return 0;
}
54.字符转换,输入一个以回车符为结束标志的字符串(少于10个字符),提取其中的所有数字字符(‘0’,‘...’,‘9’),将其转换为一个十进制整数输出。
注:由于字符串少于10个字符,数字长度就取其上限10,以回车符‘\n’作为输入结束符。
/*字符转换*/
#include<stdio.h>
int main(void){
int number;
char str[10];
printf("请输入一个字符串:");
int i=0;
while((str[i]=getchar())!='\n'){
i++;
}
str[i]='\0';
number=0;
for(i=0;str[i]!='\0';i++){
if(str[i]>='0'&&str[i]<='9'){
number=number*10+str[i]-'0';
}
}
printf("十进制整数为:%d\n",number);
return 0;
}