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元可以喝多少瓶汽水
瓶数 | 空瓶数 |
买20 | 20 |
换10 | 10 |
换5 | 5 |
换2 | 3 |
换1 | 2 |
换1 | 1 |
共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;
}