C语言算术转换例题

这里写目录标题

感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接
🐒🐒🐒 个人主页
🥸🥸🥸 C语言
🐿️🐿️🐿️ C语言例题
🐣🐓🏀 python

例题一

下面代码的结果是

c 复制代码
#include <stdio.h>
int i;
int main()
{
    i--;
    if (i > sizeof(i))
    {
        printf(">\n");
    }
    else
    {
        printf("<\n");
    }
    return 0; 
}

A.> B.< C.不输出 D.程序有问题

题目解析

之前我认为i是没有初始化的,所以程序有问题

但是后面看了答案发现全局变量,没有给初始值时,编译其会默认将其初始化为0,所以i=0

既然i=0的话那i--就应该是-1才对,sizeof(i)的话就应该是求的int类型的大小,sizeof(i)=4,那-1<4理论上是输出<才对,可是答案却是>

这里我们就可以联想到无符号整形,也就是-1最后换算成无符号整形的时候是一个很大的数

事实上也确实是如此,sizeof的返回值类型实际为无符号整形,因此编译器会自动将左侧i自动转换为无符号整形的数据,-1对应的无符号整形是一个非常大的数字,超过4或者8,故实际应该选择A

答案

答案:D

例题二

关于表达式求值说法不正确的是:( )

A.表达式求值先看是否存在整形提升或算术转换,再进行计算

B.表达式真正计算的时候先看相邻操作符的优先级再决定先算谁

C.相邻操作符的优先级相同的情况下,看操作符的结合性决定计算顺序

D.只要有了优先级和结合性,表达式就能求出唯一值

题目解析

具体可以看我之前写的一篇文章操作符详解下(非常详细)

ABC都是对的,对于D我们来看一个例子

c 复制代码
#include <stdio.h>
int main()
{
    int i = 1;
    int ret = (++i)+(++i)+(++i);
    printf("ret = %d\n", ret);
	return 0;
}

这里的结果是不确定的,可以尝试在不同的编译器上打印结果

答案

答案:D

例题三

有序序列合并

题目解析

这道题需要将两个数组都合并起来,因此数组的空间要足够大,否则就会出现数组越界

第一步就需要确定两个数组的有效元素个数,也就是m和n,然后再向数组输入数据,

第二步就需要将两个数组合并,由于两个数组的有效元素个数都是确定的,因此我们只需要用一个循环就可以解决

第三步就是重新排列,我们需要用两个循环,因为第二个循环是为了将一个会较大的数往后排,但是前面仍然可能存在一些数比后面的数大,所以第一个for循环是为了检查前面是否有一些数比后面的数大

答案

这是我之前写的代码

c 复制代码
int main() {

	int n,m,temp,a1[1000],a2[10000];

	scanf("%d %d",&n,&m);

	for(int i=0; i<n; i++) {
		scanf("%d",&a1[i]);
	}
	for(int i=0; i<m; i++) {
		scanf("%d",&a2[i]);
	}
	for(int i=0; i<m; i++) {
		a1[n+i]=a2[i];
	}

	for(int i=0; i<m+n-1; i++) {
		for(int j=0; j<m+n-1; j++) {
			if(a1[j]>a1[j+1]) {
				temp=a1[j];
				a1[j]=a1[j+1];
				a1[j+1]=temp;
			}
		}
	}

	for(int i=0; i<m+n; i++) 
    {
		printf("%d ",a1[i]);
	}

	return 0;
}

例题四

获得月份天数

方法一

c 复制代码
#include<stdio.h>
int main()
{
	int run[12] = { 31,29,31,30,31,30,31,31,30,31,30,31 };
	int notrun[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
	int year, month;

	while(scanf("%d %d", &year, &month)!=EOF)
	{if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
	{
		printf("%d\n", run[month - 1]);
	}
	else
	{
		printf("%d\n", notrun[month - 1]);
	}
    }
	return 0;
}

解析

这种解法是将创建两个数组,一个数组是闰年,另一个数组就不是闰年,将每个月份的总天数输入进数组

然后判断是否为闰年,由于数组的下标是0开始,所以最后打印的时候需要mouth-1

方法二

c 复制代码
#include<stdio.h>
int main() {
    int year, month, day;
    while (scanf("%d %d", &year, &month) != EOF) {
        switch (month) {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                printf("31\n");
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                printf("30\n");
                break;
            case 2: {   //2月平年28天,闰年29天
                    if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
                        printf("29\n");
                    else
                        printf("28\n");
                }
        }
    }
    return 0;
}

解析

这个方法用switch语句,如果switch语句不是很懂可以参考我之前写的一篇文章switch语句和while循环

因为有一些月份的天数是相同的比如1 3 5 7 8 1012,因此把那些天数都放在一块

因为在中间是没break的,所以当我们在case12后只需要将天数打印出来就可以了

对于4,6,9,11也是一样的,而2月只需要一个简单的判断也可以解决

例题五

变种水仙花

答案

方法一

c 复制代码
#include <stdio.h>
int main()
{
	for (int i = 10000; i <= 99999; i++)
	{
		int a = (i % 10) * (i / 10), b = (i % 100) * (i / 100), c = (i % 1000) * (i / 1000), d = (i % 10000) *( i / 10000);
		if (i == a + b + c + d)
		{
			printf("%d ", i);
		}
	}
	return 0;

方法二

这个方法二非常妙

c 复制代码
#include <stdio.h>
int main()
{
    int i = 0;
    for(i=10000; i<=99999; i++)
    {
        //判断i是否为lily number
        int j = 10;
        int sum = 0;
        int tmp = i;
        for(j=10; j<=10000; j*=10)
        {
            sum += (tmp%j)*(tmp/j);
        }
        if(sum == i)
            printf("%d ", i);
    }
    return 0;
}

解析

由于题目要求输出五位数的所有 Lily Number,所以需要一个i的for循环,
对于j=10是为了后面的求余和除法,sum就是为了把求余和除法的结果全加起来,而tmp是为了接收循环中i的值

对于内部的j循环可能比较难看懂

我们来画一个图就知道了

注意for循环是先用j=10,经过第一次循环后j=j*10=100,也就是第二次循环的j

相关推荐
数据小爬虫@3 分钟前
Java爬虫实战:深度解析Lazada商品详情
java·开发语言
songroom6 分钟前
Rust: offset祼指针操作
开发语言·算法·rust
code04号9 分钟前
C++练习:图论的两种遍历方式
开发语言·c++·图论
煤泥做不到的!2 小时前
挑战一个月基本掌握C++(第十一天)进阶文件,异常处理,动态内存
开发语言·c++
F-2H2 小时前
C语言:指针4(常量指针和指针常量及动态内存分配)
java·linux·c语言·开发语言·前端·c++
苹果酱05672 小时前
「Mysql优化大师一」mysql服务性能剖析工具
java·vue.js·spring boot·mysql·课程设计
武昌库里写JAVA2 小时前
【MySQL】7.0 入门学习(七)——MySQL基本指令:帮助、清除输入、查询等
spring boot·spring·毕业设计·layui·课程设计
axxy20002 小时前
leetcode之hot100---24两两交换链表中的节点(C++)
c++·leetcode·链表
bryant_meng3 小时前
【python】OpenCV—Image Moments
开发语言·python·opencv·moments·图片矩
若亦_Royi3 小时前
C++ 的大括号的用法合集
开发语言·c++