C语言相关题目

1.计算下列代码输出结果

#include<stdio.h>
int i;//i是全局变量,没有进行初始化,默认为0
int main()
{
i--;//i = -1
if(i > sizeof (i))//int 类型的字符大小为4,所以sizeof(i) = 4
//sizeof操作符计算出结果的类型是unsigned int,有符号整型与无符号整型比较时,先将有符号整型转换为无符号整型
//-1转换为无符号整型的结果是一个非常大的数字,所以输出结果为?
{
printf(">\n");
}
else
{
printf("<\n");
}
return 0;
}

2.计算求和:求Sn=a+aa+aaa+aaaa+aaaaa的前五项之和,其中a是一个数字,如:2+22+222+2222+22222

#include<stdio.h>
int main()
{
//计算由a组成的前n项之和 - 不考虑溢出
int n = 0;
int a = 0;
scanf("%d %d",&n,&a);
int ret = 0;
int sum = 0;
int i = 0;
for(i = 0;i < n;i++)
{
ret = ret*10 + a;
sum += ret;
}
printf("sum = %d\n",sum);
retun 0;
}

3.使用指针打印数组内容:打印arr数组内容,不使用数组下标,使用指针,arr是一个整型一维数组

#include<stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int sz  = sizeof(arr)/sizeof(arr[0]);
int *p = arr;
int *pend = arr + sz - 1;//数组最后一个元素地址
while(p <= pend)
{
printf("%d ",*p);
p++;
}
return 0;
}

4.打印水仙花数:求出0~10000之间的所有“水仙花数”并输出
"水仙花数"指一个n位数,其各位数字的n次方之和恰好等于该数本身


如:153 = 1^3+5^3+3^3 

这题有点复杂,提起精神

#include<stdio.h>
int main()
{
int i = 0;
for(i = 0;i < 10000;i++)
{
//1.计算i的位数 - n
int n = 1;
int tmp = i;//防止i的值被改变(后面还需用到i原来的值)
while(tmp/10 != 0)
{
n++;
tmp = tmp/10;
}
//2.计算i的每一位的n次方之和
tmp = i;
int sum = 0;
while(tmp)
{
sum += pow(tmp % 10,n);//pow(tmp % 10, n)计算某位的n次方
tmp = tmp / 10;
}
//3.判断
if(sum == i)
{
printf("%d ",i);
}
}
return 0;
}

5.计算输出结果

#include<stdio.h>
int main()
{
unsigned long pulArray[] = {6,7,8,9,10};
unsigned long* pulPtr;
pulPtr = pulArray;//pulPtr - 数组名表示数字首元素地址,所以 pulPtr = 6
*(pulPtr + 3) += 3;//pulPtr的值没有改变,*(pulPtr + 3) = 9
printf("%d,%d\n",*pulPtr,*(pulPtr + 3));//6,12
return 0;
}

 6.计算输出结果

#include<stdio.h>

struct stu
{
int num;
char name;
int age;
};

void fun(struct stu* p)
{
printf("%s\n",(*p).name);//students + 1 - wang
return;
}

int main()
{
struct stu students[3] = { {9801,"zhang",20},
                           {9802,"wang",19},
                           {9803,"zhao",18} };
fun(students + 1);//students - 数组名表示数组首元素地址 - zhang
return 0;
}

7.写一个函数,可以逆序一个字符串的内容

#include<stdio.h>
#include<assert.h>
#include<strint.h>

void reverse(char* str)
{
assert(str);//断言
int len = strlen(str);
char* left = str;
char* right = str + len - 1;
while(left <= right)
{
int tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}

int main()
{
char arr[] = "abcdef";
reverse(arr);
printf("%s\n",arr);
return 0;
}

8.打印菱形

#include<stdio.h>
int main()
{
int line = 0;
scanf("%d",&line);
//上半个
int i = 0;
for(i = 0;i < line;i++)
{
//打印一行
//空格
int j = 0;
for(j = 0;j < line - 1 - i;j++)
{
printf(" ");
}
//*
for(j = 0;j < 2*i = 1;j++)
{
printf("*");
}
printf("\n");
//下半个
for(i = 0;i < line - 1;i++)
{
int j = 0;
//空格
for(j = 0;j <= i;j++)
{
printf(" ");
}
for(j = 0;j <2*(line -1 - i) - 1;j++)
{
printf("*");
}
}
printf("\n");
}

return 0;
}

 9.喝汽水,一瓶汽水1元,2个空瓶换一瓶汽水,给20元可以喝多少瓶汽水

瓶数空瓶数
买2020
换1010
换55
换23
换12
换11
共39
#include<stdio.h>
int main()
{
int money = 0;
scanf("%d",&money);
int totle = money;
int empty = totle;
while(empty >= 2)
{
totle += empty/2;
empty = empty/2 + empty%2;
}
printf("%d\n",totle);
return 0;
}

10.调整奇偶数顺序:调整数组中奇偶数顺序,使所有奇数位于前半部,偶数位于后半部

#include<stdio.h>

void move(int arr[],int sz)
{
int left = 0;
int right = sz - 1;
while(left < right)
{
//从前往后找一个偶数
while(left < right && arr[i] % 2 == 1)//left < right - 防止越界,arr[i] % 2 == 1 - 说明该数为奇数
{
left++;
}
//从后往前找一个奇数
while(left < right && arr[i] % 2 == 0)
{
right--;
}
//奇偶数交换
if(left < right)
{
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
}
}
}

void printf(int arr[],int sz)
{
int i = 0;
for(i = 0;i < sz;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}

int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int sz = sizeof(arr)/sizeof(arr[0]);
move(arr,sz);
print(arr,sz);
return 0;
}

 11.计算输出结果

#include<stdio.h>
int main()
{
unsigned char a = 200;
//1100 1000
unsigned char b = 100;
//0110 0100
//a,b为无符号字符,整型提升,高位补0
unsigned char c = 0;
//00000000000000000000000100101100 - a+b - 300
c = a + b;
//00101100 - c
//00000000 00000000 00000000 00101100 - c整型提升,高位补0 - 44
printf("%d %d",a + b,c);//a + b = 300;c = 44
return 0;
}

12.打印杨辉三角

 由图可知:①第一列值为1

                   ②行数=列数时,值为1

                   ③行数大于等于2,列数大于等于1时,值为(行数-1,列数)+(行数-1,列数-1)

#include<stdio.h>
int main()
{
	int arr[10][10] = { 0 };
	int i = 0;//行
	int j = 0;//列
	for (i = 0; i < 10; i++)
	{
		for (j = 0; j <= i; j++)
		{
			if (j == 0)
			{
				arr[i][j] = 1;
			}
			if (i == j)
			{
				arr[i][j] = 1;
			}
			if (i >= 2 && j >= 1)
			{
				arr[i][j] = arr[i - 1][j] + arr[i-1][j - 1];
			}
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}

	return 0;
}

 13.猜凶手:A:不是我;B:是C;C:是D;D:C在胡说。四人中只有一人说了假话,确定谁是凶手

只有一人说假话——A + B + C + D == 3

#include<stdio.h>
int main()
{
	char killer = 0;
	for (killer = 'A'; killer <= 'D'; killer++)
	{
		if ((killer != 'A') + (killer == 'C') + (killer == 'D') + (killer != 'D') == 3)
		{
			printf("%c\n", killer);
		}
	}
	return 0;
}

14.5位运动员参加跳水比赛,有人让他们预测比赛结果:
A:B第二,我第三;
B:我第二,E第四;
C:我第一,D第二;
D:C最后,我第三
E:我第四,A第一。每位选手猜对了一半,请确定比赛名次

每位选手猜对了一半——(B = 2)+(A = 3)=1,(B = 2)+(E=4)=1,(C=1)+(D=2)=1,(C=5)+(D=3)=1,(E=4)+(A=1)=1同时成立,并且他们五位之中一定有且只有1,2,3,4,5名,所以A*B*C*D*E=120

#include<stdio.h>
int main()
{
int a = 0,b = 0,c = 0,d = 0,e = 0;
for(a = 1;a <= 5;a++)
{
for(b = 1;b <= 5;b++)
{
for(c = 1;c <= 5;c++)
{
for(d = 1;d <= 5;d++)
{
for(e = 1;e <= 5;e++)
{
if((b == 2)+(a == 3)==1 && (b == 2)+(e == 4)==1 && (c == 1)+(d == 2)==1 && (c == 5)+(d == 3)==1 && (e == 4)+(a == 1)==1)
{
if(a*b*c*d*e==120)
{
printf("a=%d b=%d c=%d d=%d e=%d",a,b,c,d,e);
}
}
}
}
}
}
}
return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值