标题: 工联部第一任务
第一题;
// 工联部第一次考核第一题
/* 我是这样想的;首先定义并输入一个变量n, 因为有题目信息可知,如果这个数字是个负数的话直接就不会为回文数,所以在输入数字后直接判断是否为复数的话直接输出false并且
加上return 0; 使程序结束,如果是一个正数,定义一个变量len且对其初始化为0,输入数字后先用一个循环,计算出输入的这个数字的位数是多少,且用len代表,然后定义一个
数组,并且这个数组的长度即len,然后再通过一个for循环将这个数字的每一位数都储存在这个数组的几个元素中,定义一个变量j=0, 判断len是偶数还是奇数,如果是偶数,
用一个for循环来开始对数组的元素一次判断,看某一个元素存在几个和它相等的元素 (这个循环的次数只需要进行 len/2 次,并且是例;第一位元素和最后一位元素判断,第二位
和倒数第二位判断),假如出现了不等的情况,直接令 n++,并且在程序中给出一个判断 n 是否大于0,如果是的话直接输出false并且结束程序,奇数同偶数一样。 */
以下是代码部分
#include<stdio.h>
int main(void){
int n, n_copy;
int len = 0;
int i = 0, k = 0;
printf("请输入你想输入的数字;");
scanf("%d", &n);
if(n == 0){ //如果输入的数字是0,则直接输出true并结束
printf("true\n");
return 0;
}
else if(n < 0){ //如果输入的数字小于0,则直接输出false并结束
printf("false\n");
return 0;
}
n_copy = n; //复制变量n的值到另外一个变量中去,在接下来的程序把这个数值分解开来要用
while(n){
len++; //计算出输入的数字的位数是多少
n = n / 10;
}
if(len == 1){ //如果输入的数字的位数是 1 位,则直接输出true并且结束程序。
printf("true\n");
return 0;
}
int a[len]; //定义一个元素个数为len的数组。
for(i = 0; i < len; i++){
a[i] = n_copy % 10; //通过这个循环将输入的数值拆解并且依次存放在这个数组的元素里去。
n_copy /= 10;
}
for(i = 0;i < (len / 2); i++){ //就算是奇数的话也不用担心,因为如果是奇数的话最中间的那一位数字是不会影响这整个数字是不是回文数的。
if(a[i] != a[len - 1 - i]){ //进行判断是否存在不相等的
k++; //如果有不相等的令k++
}
if(k != 0){ //每进行一次判断是否有相等的后就会进行此判断,如果k++了,直接输出false并结束程序,不需要再继续循环判断下去了
printf("false\n");
return 0;
}
}
printf("true\n"); //如果程序进行到这一步则这个数字一定是个回文数
return 0;
}
编译运行后为:
第二题为:
//工联部考核第二题
/* 我是这样想的;首先定义一个变量n ,然后对这个变量n 进行输入,由于题目说的这个整数是有符号整数,所以要有一个限定条件,即其输入的数字的范围必须是 负二的31次方 ~ 二的31次方减一
输入后再通过一个while循环得出我们输入的这个数的位数是多少位,然后再定义一个这个位数长度的数组,然后再通过一个循环将输入的数字的每一位都保存在其中,最后再通过一个for 循环
反向输出这个数组的每个元素。 */
以下为代码部分:
#include<stdio.h>
#include<math.h>
int main(void){
int n,i;
int n_s; //如果输入的数为负数时会派上用场
int n_copy; //用来复制我们输入的数字n
int len = 0; //用来代表我们输入的数字的位数为多少。
printf("请输入你想输入的数字(这个数字必须为32位的有符号整数);");
while(1){ //设立一个死循环
scanf("%d", &n);
if(n > (pow(2, 31) - 1) || n < ( - pow(2, 31))){ //判断其输入的数字是否符合规定
printf("你输入的数字不符合规定,请重新输入;"); //不符合则给出提醒并重新输入
}
else{
break; //符合则跳出这个死循环
}
}
if(n == 0){
printf("0");
return 0; //如果输入的数为0,则直接结束程序
}
n_s = n;
if(n < 0){ //如果输入的数字小于0的话先把负号去掉
n = -n;
}
n_copy = n;
while(n > 0){
len++;
n = n / 10; //每循环一次就减少一位数字
}
int a[len];
for(i = 0; i < len; i++){ //通过这个循环来将输入的数字的每一位数字保存在数组中。
a[i] = n_copy % 10;
n_copy = n_copy / 10;
}
if(n_s < 0){ //如果输入的数字小于0,则补上一个负号
printf("-");
}
for(i = 0; i < len; i++){
printf("%d", a[i]);
}
return 0;
}
编译运行后的结果为:
第三题
// 工联部第一次考核第三题
/* 我是这样想的;首先定义并且输入一个变量n, 这个n 为希望输出的行数,然后定义一个二维数组int a[n][n+1], 在定义完这个二维数组后对其进行赋值,使他的每一个元素的值均为1
由题目给定的输出样例可知,在数输入每行的数字时要先输出空格,并且通过观察得出输出的空格数是与行数之间有一定的关联的,所以我打算通过一个for函数来进行循环输出这个空格
且由图可知除了前两行之间没有关系外,其它的行与行之间是存在联系的,所以要先给出一个判断语句规定在前两行的数字都是固定输出的,并且除了第一行外,其他每行的首尾输出的
数字都是1,所以应在这些地方加上判断语句来特定输出。 */
以下是代码部分
#include<stdio.h>
int main(void){
int n;
int i,j,k;
printf("请输入你希望最后输出杨辉三角的行数(这个数字必须要大于0);");
while(1){ //设置一个死循环
scanf("%d", &n);
if(n <= 0){ //如果输入的这个n的值不符合规定,则给出提醒并重新输入
printf("你输入的这个数字不符合规定,请重新输入;");
}
else{
break; //如果符合规定,则直接跳出这个死循环往下继续进行。
}
}
int a[n][n + 1]; //定义二维数组,因为根据观察,除了第一行和第二行外,其它行数输出的数字的个数是; 行数+1
for(i = 0; i < n; i++){
for(j = 0; j < (n + 1); j++){ //通过这个循环,使每一位元素的值均为1
a[i][j] = 1;
}
}
for(i = 0; i < n; i++){ //这个循环的次数即为最后要输出杨辉三角的行数。
for(k = 0; k < (n - 1 - i); k++){
printf(" "); //通过这个循环来输出空格。
}
printf("[");
for(j = 0; j < (i + 1); j++){ //通过分析,每行输入的数字的个数为 i+1 个。
if(i == 0 || i == 1){ //因为通过分析已知前两行是固定输出,所以在这给出一个if语句
printf("%d", a[i][j]);
if(j != i){
printf(","); //输出逗号,且通过这个判断语句,在输出了这行的最后一个数字时不会输出逗号。
}
}
else{
if(j == 0 || j == i){ //判断是否是每行的首位和最后一位要输出的数字,如果是,则直接原样输出。
printf("%d", a[i][j]);
if(j != i){
printf(","); //同样的判断,如果不是最后一个输出的数字则会跟上一个逗号
}
}
else{
printf("%d", a[i][j] = a[i - 1][j - 1] + a[i - 1][j]); //通过观察输出样例得出了行与行之间的这种数据关系,并在此完成了赋值操作,使下一行的输出的数字同样进行此操作。
if(j != i){
printf(","); //同样的判定
}
}
}
}
printf("]");
printf("\n"); //每完成了一行的输出后要进行换行操作。
}
return 0;
}
编译运行后的结果为: