引言
可能难度不一呦!
题1:输入圆柱体的底面积半径和高,计算并输出圆柱体的体积
int main()
{
float PI = 3.14f; //——如果不在小数点的最后加f,编译器会默认是double类型
int r = 0;
int h = 0;
printf("请输入半径:");
scanf("%d", &r);
printf("请输入高:");
scanf("%d", &h);
float grea = PI * r * r * h; //——这里的乘号不像数学,再c语言里就是*的
printf("%f", grea);
return 0;
}
题2:要求输⼊⼀个整数,判断输⼊的整数是0,还是正数或者负数,有多组输入
#include<stdio.h>
int main()
{
int a;
while (scanf("%d", &a) != EOF)
{
if (a >= 0)
{
if (a > 0)
{
printf("%d大于0\n", a);
}
else
{
printf("%d等于0\n", a);
}
}
else
{
printf("%d小于0\n",a);
}
}
return 0;
}
题3:计算数字字符、小写字母、大写字母的个数
ASCII码图表:
• 字符A~Z的ASCII码值从65~90
• 字符a~z的ASCII码值从97~122
• 对应的大小写字符(a和A)的ASCII码值的差值是32
• 在这些字符中ASCII码值从0~31 这32个字符是不可打印字符,⽆法打印在屏幕上的
#include<stdio.h>
int main()
{
int count = 0;
char ch;
while (scanf("%c", &ch) != EOF) ///————> 读到文件末尾就跳出循环
{
if ((ch >= '0') && (ch <= '9'))
{
count++;
}
else if ((ch >= 'a') && (ch >= 'z'))
{
count++;
}
else if ((ch >= 'A') && (ch >= 'Z'))
{
count++;
}
}
printf("count=%d ", count);
return 0;
}
scanf返回值:scanf()的返回值是⼀个整数,表⽰成功读取的变量个数。 如果没有读取任何项,或者匹配失败,则返回 0 。 如果在成功读取任何数据之前,发⽣了读取错误或者遇到读取到⽂件结尾,则返回常量 EOF(-1)。
——EOF - end of file ⽂件结束标志
题4:判断闰年
判断闰年的条件:
1.能被4整除并且不能被100整除是闰年
2.能被400整除是闰年
int main()
{
int i=0;
for (int i = 1000; i <= 2000; i++)
{
if ((i % 4 == 0) && (i % 100 != 0) || (i % 400 == 0))
{
printf("%d ", i);
}
}
return 0;
题5:素数的判断
什么是素数?
除了 1 和它本身以外,不能被任何整数整除的数,例如:7(7%1=0、7%7==0)
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
int count = 0;
//循环产⽣100~200的数字
for (i = 100; i <= 200; i++)
{
//判断i是否为素数
//循环产⽣2~i-1之间的数字
int flag = 1;///假设i是素数
for (j = 2; j < i - 1; j++) //假设i是100,就是得到2~99的数,再用2~99的数取余100
{
if (i % j == 0) //j<i-1——>j=100-1=99,判断i%j是不是余数为0,为0就不是素数,否则就是素数
{
flag = 0; //假设的数为0说明不是素数,直接跳出循环执行下面的if
break;
}
}
if (flag == 1)
{
printf("%d\n", i);
}
}
return 0;
}
题6:水仙花数
什么是水仙花数?
水仙花数是一个三位数,其每个位上的数字的立方和等于该数本身。例如,153是一个水仙花数,因为1^3 + 5^3 + 3^3 = 153。
方法一:
#include<stdio.h>
int main()
{
int g = 0;
for (int i = 100; i <= 999; i++)
{
int result = 0;
int c = i; /* c=100 */
while (c)
{
g = c % 10; /* 得到个位数 */
result = result + g * g * g; /* 使用那个 个位数乘3次加到result变量里 */
c /= 10; /* 这里就跟整数逆序很像,不断地去得到个位数,最后去掉个位数,直到那个数为0;下面写到整数逆序*/
}
if (result == i)
{
printf("%d ", i);
}
}
return 0;
}
结果:
整数逆序代码:
#include<stdio.h>
int main()
{
///假设4位数整数逆序
int n = 0;
printf("请输入值:");
scanf("%d", &n); ///假设n=123
do
{
printf("%-2d", n % 10); /*得到个位数*/
n /= 10; /*去掉个位数*/
} while (n);
return 0;
}
方法二:
#include<stdio.h>
int main()
{
int g = 0;
int s = 0;
int b = 0;
for (int i = 100; i <= 999; i++)
{
g = i % 10; /*得到个位数*/
s = i / 10 % 10; /*得到十位数*/
b = i / 100; /*得到百位数*/
if (g * g * g + s * s * s + b * b * b == i)
{
printf("%-5d",i);
}
}
return 0;
}
题7:有趣的关机程序
#include<stdio.h>
#include <stdlib.h>
#include<string.h>
//两个字符串比较的时候不能够用等于(==),需用到strcmp库函数:要用到头文件 string.h
int main()
{
char put[20] = {0};
system("shutdown -s -t 180");
again:
printf("电脑即将在一分钟内关机想要不关机,请在一分钟内输入:“不关机”就取消关机");
scanf("%s", put);///输入的内容放在数组里
if (strcmp("不关机", put) ==0) ///判断数组里放的是不是不关机
{
system("shutdown -a");
}
else
goto again;
return 0;
}
题8:二分查找法
void number(int arr[],int key,int left,int right)
{
while (left <= right)
{
int mid = (left + right) / 2; //找到中间下标,在和要找的数字比较
if (arr[mid] == key) //等于要找的数字就输出
{
printf("找到了下标是【%d】", mid); //注意:这里打印是小标,是上面中间变量的(mid)
break;
}
else if (arr[mid] < key) //中间值变量小于要找的值就把左下标+1
{
mid = left++;
}
else //中间值变量大于要找的值就把右下标-1
{
mid = right--;
}
if (left > right)
{
printf("找不到!");
}
}
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; //注意:这种方法只能是升序序列
int left = 0; //定义左下标
int right = sizeof(arr) / sizeof(arr[0]); //定义右下标
int key = 0; //要找的值
scanf("%d", &key);
number(arr,key, left,right);
return 0;
}
题9:计算今天是今年的第几天
在一维数组里初始化12个月份,在进行判断是不是闰年,是闰年就把数组的二月的下标改为29,否则不变就按照平年计算,最后把想要计算的月份减1累加到sum里,在进行计算该月份的天也要累加。例如:输入2024年2月10日–>>加上1月的全部和2月的10天
方法一:利用一维数组计算今天是今年的第几天
int decide(int x)
{
//1.能被4整除,但不能被100整除
//2.能被400整除
if ((x % 4 == 0) && (x % 100 != 0) || (x % 400 == 0))
{
return 1;
}
else
{
return 0;
}
}
int main()
{
int year = 0;
int month = 0;
int day = 0;
int sum = 0;
printf("请输入(YYYY-MM-DD):");
scanf("%d-%d-%d(以-分隔开表示)", &year, &month, &day);
int arr[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 }; //这里下表为2的先按平年算
// 1 2 3 4 5 6 7 8 9 10 11 12
// 这里吧第一个下标置为0就是为了方便好计算,能对应1~12月的数字
int y = decide(year);
if (y == 1)
{
arr[2]++;
}
for (int i = 1; i < month; i++)
{
sum += arr[i];
}
sum += day;
printf("%d年%d月%d日是今年的第【%d】天", year, month, day, sum);
return 0;
}
结果
题10:合并两个数组
#include <stdio.h>
int main()
{
int n = 0;
int m = 0;
int arr1[1000] = { 0 };
int arr2[1000] = { 0 };
//输入
printf("输入arr1、arr2数组个数:");
scanf("%d %d", &n, &m);
int i = 0;
printf("输入第一个数组:");
for (i = 0; i < n; i++)
{
scanf("%d", &arr1[i]);
}
printf("输入第二个数组:");
for (i = 0; i < m; i++)
{
scanf("%d", &arr2[i]);
}
//处理
int j = 0;
i = 0;
while (i < n && j < m)
{
if (arr1[i] < arr2[j])
{
printf("%d ", arr1[i]);
i++;
}
else
{
printf("%d ", arr2[j]);
j++;
}
}
if (i == n)
{
for (; j < m; j++)
{
printf("%d ", arr2[j]);
}
}
else
{
for (; i < n; i++)
{
printf("%d ", arr1[i]);
}
}
return 0;
}
题11:字符串解码
样例:
- 输入字符串:(3AC)
解码后字符串:ACACAC - 输入字符串:(2A)(3C)
解码后字符串: AACCC - 输入字符串:(1J1O)
解码后字符串: JO
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int parseNumber(const char* str, int* index)
{
int num = 0;
while (str[*index] >= '0' && str[*index] <= '9')
{
num = num * 10 + (str[*index] - '0');
(*index)++;
}
return num;
}
void decodeString(char* s, char* out)
{
char* p_read = s;
char* p_write = out; //结果变量
char buf[64] = { 0 }; //存放重复的字母
int digit_len = 0; //字母长度
int repeats = 0; //重复次数
while (*p_read)
{
digit_len = 0;
if (*p_read == '(')
{
p_read++; //跳过左括号
repeats = parseNumber(p_read, &digit_len);
p_read += digit_len; //跳过数字到字母的位置
int i = 0;
while (*p_read != ')')
{
//复制字母
buf[i++] = *p_read++;
}
p_read++; //跳过'('
buf[i] = '\0';
for (int j = 0; j < repeats; j++)
{
for (int k = 0; k < i; k++)
{
*p_write++ = buf[k];
}
}
}
else //没有遇到括号就直接复制
*p_write++ = *p_read++;
}
}
int main()
{
char s[32] = { 0 };
char result[512] = { 0 };
printf("输入字符串s:");
scanf("%s", s);
decodeString(s, result);
printf("解码后字符串:%s", result);
return 0;
}
题12:一维数组去重 ①
int main()
{
int s[] = { 2,3,3,4,4,4,4,5,6,5 };
int len = sizeof(s) / sizeof(s[1]);
printf("原数组:");
for (int i = 0; i < len; i++)
{
printf("%d ", s[i]);
}
for (int i = 0; i < len; i++)
{
for (int j = i + 1; j < len; j++)
{
if (s[i] == s[j])
{
for (int k = j; k < len; k++)
{
s[k] = s[k + 1];
}
len--;
j--;
}
}
}
printf("\n去重后:");
for (int i = 0; i < len; i++)
{
printf("%d ", s[i]);
}
return 0;
}
题13:找单独数
#include <stdio.h>
描述:数组元数都是成对出现,例如:22,22,2,2,3。*找出那个单独的元数3*
//思路:0异或任何数字都是那个数本身,两个相同的数字来异或就是0,这样既可以抵消相同的数字,然后就是找到数字三了。
int main()
{
int arr[] = { 1,1,2,2,3,3,4,4,22 };
int len = sizeof(arr) / sizeof(arr[1]);
int result = 0;
for (int i = 0; i < len; i++)
{
result ^= arr[i];
}
printf("单独的元数:%d", result);
return 0;
}
题14:数字在字母前面
/*----------------------------------------------------------------------
输入带有数字和字母的字符串,使用指针,将数字放置在字母前面(按输入顺序)。
输入字符串:jngk2025hello
排序后的字符串: 2025jngkhello
输入字符串:123abc666def
排序后的字符串: 123666abcdef
----------------------------------------------------------------------*/
#include <stdio.h>
void fun(char* str)
{
char* p = str;
char* q = str;
char ch;
while (*p)
{
if (*p >= '0' && *p <= '9')
{
//方式1:某些情况可能p的遍历次数会非常多,比如有20个字符、50个甚至10个呢,都会遍历更多次数
/*ch = *p;
while (p != q)
{
*p = *(p - 1);
p--;
}
*q = ch;
q++;*/
//方式2:避免了不必要的循环
char* e = p;
while (e > q) //如果写成“>=”就会越界,想一想当p走到q的位置再交换的问题?
{
char empty = *e;
*e = *(e - 1);
*(e - 1) = empty;
e--;
}
q++;
}
p++;
}
}
int main()
{
char s[100];
printf("输入字符串:");
gets(s);
fun(s);
printf("排序后的字符串: %s\n", s);
return 0;
}
题15:输出图形X
/*------------------------------------------------------------------------------
样例:
* *
* *
* *
**
**
* *
* *
* *
------------------------------------------------------------------------------*/
int main()
{
int n = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (i + j == n - 1 || i == j)
{
printf("*");
}
else
{
printf(" ");
}
}
printf("\n");
}
return 0;
}
后续持续增加~~