点击下面链接即可进行刷题学习
开始刷题
分析特殊情况:闰年的二月份比平年的的多1天。
闰年的判断:
1.能被4整除并且不能被100整除
2.能被400整除
接下来分析每个月的天数:可以发现不管是平年或者是闰年,除了二月外其他月份的天数都一样,如果把每个月的天数都放到一个数组里就可以方便不少。
代码如下 :
int main()
{
int year = 0;
int month = 0;
int days[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
while (~scanf("%d %d", &year, &month))
{
int day = days[month - 1];
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
{
if (2 == month)
{
day++;
}
}
printf("%d\n", day);
}
return 0;
}
while (~scanf(“%d %d”, &year, &month))的意思:
1️⃣~表示按位取反
2️⃣scanf的返回值是输入值的个数,如果没有输入值就返回-1,-1按位取反就为0,循环结束。
由上题可知我们可以把十个字母放到一个数组里方便我们每次判断。如果每次输入都用getchar()接收要注意残留的’\n’后面一定要处理掉。
代码如下 :
#include
int main()
{
int ch = 0;
char arr[] = "AEIOUaeiou";
int sz = sizeof(arr)/sizeof(arr[0]);
while((ch = getchar()) != EOF)
{
int i = 0;
int ret = 0;
for(i = 0; i < sz; i++)
{
if(arr[i] == ch)
{
ret = 1;
break;
}
}
if(1 == ret)
{
printf("Vowel\n");
}
else
{
printf("Consonant\n");
}
//处理'\n'
getchar();
}
return 0;
}
getchar()函数:
1️⃣从stdin流(可理解为键盘)中读取一个字符
2️⃣第一次需要自己输入,但是如果输入了多个字符(包括敲下回车后的’\n’),以后getchar()再执行就会直接从缓存区中读取
分析思路:首先要把输入的字符串放到一个数组里,数组要先创建(尽量大一些),然后遍历数组计算A和B的个数。
代码如下:
#include
int main()
{
char buf[100] = {0};
gets(buf);
int num1 = 0;
int num2 = 0;
char* p = buf;
while(*p != '0')
{
if('A' == *p)
{
num1++;
}
else
{
num2++;
}
p++;
}
if(num1 > num2)
{
printf("A");
}
else if(num1 < num2)
{
printf("B");
}
else
{
printf("E");
}
return 0;
}
gets()函数:
1️⃣可以理解为从键盘读取一行,当读取到换行符时 或 到达文件末尾时,他会停止。
2️⃣和scanf的区别:
scanf : 读到空格便停止
gets : 一直读到回车(不管中间是否有空格)
int main()
{
int n = 0;
scanf("%d", &n);
int arr[50];
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
int j = 0;
for (j = 0; j < n; j++)
{
for (i = 0; i < n - 1 - j; i++)
{
if (arr[i] < arr[i + 1])
{
int tmp = 0;
tmp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = tmp;
}
}
}
for (i = 0; i < 5; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
另外还有一种取代冒泡排序的库函数方法:
void qsort(void* base,
size_t num,
size_t width,
int(__cdecl* compare)(const void* elem1, const void* elem2));
base:目标数组
num:数组所含元素个数
width:每个元素的大小(字节)
最后是个函数指针:
具体函数时求elem1 - elem2的数值
用此函数将数组排成升序,如果要降序,只需要让elem2 - elem1。
代码如下:
#include
#include
int cmp_int(const void* e1, const void* e2)
{
return *(int*)e2 - *(int*)e1;
}
int main()
{
int n = 0;
scanf("%d", &n);
int arr[50];
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
qsort(arr, n, 4, cmp_int);
for (i = 0; i < 5; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
#include
#include
int main()
{
int a = 0;
int b = 0;
int c = 0;
scanf("%d %d %d", &a, &b, &c);
float p = (float)(a + b + c )/ 2;
float circumference = 2*p;
float area = sqrt(p*(p-a)*(p-b)*(p-c));//S=√[p(p-a)(p-b)(p-c)]
printf("circumference=%.2f area=%.2f", circumference, area);
return 0;
}
%.2f的意思是保留小数点后两位数
这里要思考的是:输入两个整数相除怎么变成浮点数?
答:只要让除号两边任一数强制转化为浮点型即可。
代码如下:
#include
int main()
{
int wight = 0;
int hight = 0;
float c = 0.0;
scanf("%d %d", &wight, &hight);
c = wight / ((double)hight * hight / 10000);
printf("%.2f", c);
}
#include
int main()
{
int n = 0;
while((scanf("%d", &n)) != EOF)
{
printf("%d\n",1<<n);
}
return 0;
}
这里要引入左右移操作符:
先说说左移操作符:
规则:无论是正整数,负整数都是左边抛弃,右边补0
以100为例:
如果是负数就有原反补, 在补码上操作
以-100为例:
右移操作符:
1️⃣逻辑位移:左边补0, 右边舍弃
2️⃣算数右移:左边用原值的符号位填充,右边抛弃
逻辑位移方法如上
主要说说算数右移:
以-100为例:
首先分析思路:
我们要打印两个字符:‘1’ 和 ’ ’
接下来就是循环思想控制格式
例如第三行:
首先要打印两个空格,再打印空格和1
通过规律发现从1往后奇数位是1 偶数位是’ '
代码如下:
#include
int main()
{
char a = 0;
scanf("%c", &a);
int i = 0;
int j = 0;
for(i = 0; i < 5; i++)
{
//第一行
//空格
for(j = 0; j < 4 - i; j++)
{
printf(" ");
}
//打印字符
for(j = 0;j < 2*i + 1; j++)
{
if((j % 2) == 0)
{
printf("%c", a);
}
else
{
printf(" ");
}
}
printf("\n");
}
return 0;
}
点击链接[一起刷题吧]