一、
题目:请输出该题的输出结果
#include<stdio.h> int i; int main() { i--; if (i > sizeof(i)) { printf(">\n"); } else { printf("<\n"); } return 0; }
答案:>
解析:
刚开始定义i是全局变量,若没有定义,则默认是0.i--就是-1.
注意sizeof计算的是字节大小,返回值是无符号整型,而无符号整型和有符号数的比较是先让有符号整型转化为无符号整型!
注意有符号整型转化为无符号数整型不是将负号去掉着么简单!需要将有符号数的整型的补码就是无符号数,就像本题的-1的补码是32个1,因此这个补码就是转化后的无符号数。此时就是一个很大的数。因此答案是大于。
二、
题目:
求出0~100000之间的所有“水仙花数”并输出
“水仙花数”是一个n位数,其各位数字的n次方之和恰好等于该数的本身
本题的难点:
在于我对于这道题的代码实现存在问题,思路没问题,但是分开的算法还需要打磨
源码:
#include<math.h> int main() { int i = 0; for (i=0;i<=100000;i++) { int cnt = 0; int tmp = i; //判断位数 while (tmp) { tmp /= 10; cnt++; } //计算幂的和 int sum = 0; int ret = i; while (ret) { int x = ret % 10; ret /= 10; sum += pow(x,cnt ); } //判断是否相等 if (sum == i) { printf("%d ",i ); } } return 0; }
三、
题目:打印杨辉三角
思路:分为空格打印和数字打印
空格找规律即可,而数字打印根据杨辉三角的特殊性质(最左边和最右边都是1),其余数字为上面两行加起来的和,根据这个规律就可以打印
以前面对这道题题时,有些束手无策,不知道空格和数字怎么放在一块打印,现在代码敲多了之后,明白可以先把数字打印出来(这个效果)
接着在输出里面打印空格
源码:
int main() { int arr[10][10] = { 0 }; for (int i=0;i<10;i++) { for (int j=0;j<=i;j++) { arr[i][0] = 1; arr[i][i] = 1; if (i>1&&j>0&&j!=i) { arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j]; } } } for (int i=0;i<10;i++) { int ret = i; while (9 - ret) { printf(" "); ret++; } for (int j=0;j<=i;j++) { printf("%3d ", arr[i][j]); } printf("\n"); } return 0; }
四、猜凶手
题目:日本某地发生了一件谋杀案,警察通过排查确定杀人凶手一定为4个嫌疑犯中的一个。
以下是4个嫌疑犯的供词:
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说。
已经知道3个人说了真话吗个人说了假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手。
思路:
我是第一次见这种题目,最大难点在于如何让代码实现。
先假定谁是凶手(循环)。然后根据条件判断三个正确一个错误(if语句判断真假,最后判断结果为3)
源码:
int main() { char a = 0; for (a='A';a<='D'; a++)//for循环的另类使用 { if ((a != 'A') + (a == 'C') + (a == 'D') + (a != 'C') == 3) { printf("%c", a); } } return 0; }