赞
踩
只要你愿意 开始总比放弃好。 Roman.
愿我们都有自己的目标并正在为其不懈努力。
-----------------------------------------------------------------------
不使用累计乘法的基础上,通过移位运算(<<)实现2的n次方的计算。
数据范围:0≤n≤31
*代码:
- #include<stdio.h>
- int main()
- {
- //每一次将1左移都相当于乘以2
- int n = 0;
- scanf("%d",&n);
- printf("%d\n",(1<<n));
- return 0;
- }
2. 公务员面试【公务员面试】
描述
公务员面试现场打分。有7位考官,从键盘输入若干组成绩,每组7个分数(百分制),去掉一个最高分和一个最低分,输出每组的平均成绩。
(注:本题有多组输入)
输入描述:
每一行,输入7个整数(0~100),代表7个成绩,用空格分隔。
输出描述:
每一行,输出去掉最高分和最低分的平均成绩,小数点后保留2位,每行输出后换行。
*代码:
- #include<stdio.h>
- int main()
- {
- //七个一组
- int score = 0;
- int count = 0;
- int max = 0;
- int min = 100;
- int sum = 0;
- while ((scanf("%d", &score)) != EOF)
- {
- count++;
- if (max < score)
- {
- max = score;
- }
- if (min > score)
- {
- min = score;
- }
- sum += score;
- if (7 == count)
- {
- sum -= (min + max);
- printf("%.2f\n", sum / 5.0);
- count = 0;
- min = 100;
- max = 0;
- sum = 0;
- }
- }
- return 0;
- }

*注意:读取一组数据:通过计数以及置零等手段进行实现(详见代码)
3. 获得月份天数【获得月份天数】
KiKi想获得某年某月有多少天,请帮他编程实现。输入年份和月份,计算这一年这个月有多少天。
输入描述:
多组输入,一行有两个整数,分别表示年份和月份,用空格分隔。
输出描述:
针对每组输入,输出为一行,一个整数,表示这一年这个月有多少天。
*代码:
- #include<stdio.h>
- int main()
- {
- int year = 0;
- int month = 0;
- int days[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
- while (scanf("%d %d", &year, &month) == 2)
- {
- //要让二月份在每一次输入时均初始化为28
- days[1] = 28;
- //判断闰年
- if (((0 == year % 4) && (year % 100 != 0)) || (0 == year % 400))
- {
- days[1] = 29;
- }
- printf("%d\n", days[month - 1]);
- }
- return 0;
- }

*分析:
- 多组输入: !=EOF or == n(个数) ~
- 判断是否为闰年
- 创建一个数组:存有每个月天数(闰年和非闰年二月份会进行单独处理)
4. 判断字母【判断字母】
从键盘任意输入一个字符,编程判断是否是字母(包括大小写)。
输入描述:
输入包括一个字符。
输出描述:
输出该字符是字母(YES)或不是(NO)。
*代码:
- #include<stdio.h>
- int main()
- {
- int ch = 0;
- ch = getchar();
- //判断
- if (((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')))
- {
- printf("YES\n");
- }
- else
- {
- printf("NO\n");
- }
- return 0;
- }

*分析:
*补充:(多组输入--注意getchar()使用)
- #include<stdio.h>
- int main()
- {
- int ch = 0;
- while ( (ch = getchar()) != EOF)
- {
- //判断
- if (((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')))
- {
- printf("YES\n");
- }
- else
- {
- printf("NO\n");
- }
- getchar(); //去掉缓存区中的换行键
- }
- return 0;
- }

5. 变种水仙花
变种水仙花数 - Lily Number:把任意的数字,从中间拆分成两个数字,比如1461 可以拆分成(1和461),(14和61),(146和1),如果所有拆分后的乘积之和等于自身,则是一个Lily Number。
例如:
655 = 6 * 55 + 65 * 5
1461 = 1*461 + 14*61 + 146*1
求出 5位数中的所有 Lily Number,每两个数间用空格隔开。
*代码:
- #include <stdio.h>
- #include <math.h>
-
- int main()
- {
- int i = 0;
- for (i = 10000; i <= 99999; i++)
- {
- //判断i是否为lily number
- //每一次循环都要重新归零
- int sum = 0;
- int j = 0;
- //12345
- for (j = 1; j <= 4; j++)
- {
- int m = i % (int)pow(10, j);
- int n = i / (int)pow(10, j);
- sum += m * n;
- }
- 或者用常规方法:
- //for (int j = 10000; j >= 10; j /= 10)
- //{
- // int n1 = i / j;
- // int n2 = i % j;
- // sum += (n1 * n2);
- //}
- if (sum == i)
- {
- printf("%d ", i);
- }
- }
- return 0;
- }

1. 下面关于"指针"的描述不正确的是:( )
A.当使用free释放掉一个指针内容后,指针变量的值被置为NULL
B.32位系统下任何类型指针的长度都是4个字节
C.指针的数据类型声明的是指针实际指向内容的数据类型
D.野指针是指向未分配或者已经释放的内存地址
*结果:A
*分析:
- free --释放指针内容,free不会更改指针的指向;指针变为野指针
- 补充:动态内存管理(malloc申请空间 free释放/回收空间 calloc realloc)
2. 下面代码的执行结果是( )
- #include <stdio.h>
- int main()
- {
- char str1[] = "hello bit.";
- char str2[] = "hello bit.";
- char *str3 = "hello bit.";
- char *str4 = "hello bit.";
- if(str1 == str2)
- printf("str1 and str2 are same\n");
- else
- printf("str1 and str2 are not same\n");
-
- if(str3 == str4)
- printf("str3 and str4 are same\n");
- else
- printf("str3 and str4 are not same\n");
-
- return 0;
- }

*答案:
str1 and str2 are not samestr3 and str4 are same
*分析:
- 相同字符串:若以数组创建则不同地址,若以常量字符串初始化则相同地址。
- == 比较的是字符串的地址
- str1和str2是两个数组,数组的操作方式是将右边常量字符串的内容拷贝进来,所以他们是两个空间,只是内容相同,所以str1 != str2。而str3和str4是两个指针,编译器在处理的时候,会将相同的常量字符串做成同一个地址,所以,str3和str4指向的是同一个常量字符串,所以str3 == str4
3. 字符串左旋
实现一个函数,可以左旋字符串中的k个字符。
例如:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
*分析:
方法一:循环k次 + 完全左移 (循环k次进行优化, k%len次)
注:strlen()可以在传参函数里求字符串长度
sizeof()不可以在传参函数里求大小
方法二:两部分分别逆序 再进行整体逆序 (逆序函数:while循环)
*代码:
- #include<stdio.h>
-
- // 方法一:循环k次+完全左旋(放到最后)
- char* Span1(char* p, int k)
- {
- int i = 0;
- int len = strlen(p);
- for (i = 0; i < k % len; i++)
- {
- char tmp = *p;
- //每次旋转都要进行整个数组内容的位置变换
- int j = 0;
- for (j = 0; j < (len - 1); j++)
- {
- /*char ret = *(p + j);
- *(p + j) = *(p + j + 1);
- *(p + j + 1) = ret;*/
-
- *(p + j) = *(p + j + 1);
- }
- *(p + len - 1) = tmp;
- }
- return p;
- }
-
- //逆序字符串
- void Move(char* pp, int start, int end)
- {
- while (start < end)
- {
- char* tmp = *(pp + start);
- *(pp + start) = *(pp + end-1);
- *(pp + end-1) = tmp;
- start++;
- end--;
- }
- return pp;
- }
-
- // 左逆分别 + 整体
- char* Span2(char* p, int k)
- {
- //函数内调用strlen求字符串长度
- int len = strlen(p);
- Move(p, 0, k % len);
- Move(p, k % len, len);
- Move(p, 0, len);
- return p;
- }
-
- int main()
- {
- int k = 0;
- char ch1[] = "ABCDEFG";
- printf("请输入循环次数k:");
- scanf("%d", &k);
- //方法一:
- char* tmp1 = Span1(ch1, k);
- printf("方法一:循环%d次+完全左旋:\n",k);
- printf("%s\n", tmp1);
- //方法二:
- char ch2[] = "ABCDEFG";
- char* tmp2 = Span2(ch2, k);
- printf("方法二:利用逆序字符串:\n");
- printf("%s\n", tmp2);
- return 0;
- }

*结果:
4. 杨氏矩阵
有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。
要求:时间复杂度小于O(N);
*代码:
- #include<stdio.h>
-
- void FindNum(int (*p)[5], int n, int* row, int* col)
- {
- int x = 0;
- int y = *col - 1;
- //找到一行中最大且一列中最小 or 一行中最小且一列中最大
- int flag = 0;
- //注意循环条件
- while (x < *row && y >= 0)
- {
- if (*(*(p + x) + y) < n)
- {
- x++;
- }
- else if (*(*(p + x) + y) > n)
- {
- y--;
- }
- else
- {
- *row = x;
- *col = y;
- return;
- }
- }
- //找不到
- *row = -1;
- *col = -1;
- }
-
- int main()
- {
- int Tran[3][5] = { 1,3,5,7,9,2,4,6,8,10,3,6,9,12,15 };
- int n = 0;
- int row = 3;
- int col = 5;
- printf("请输入您想查找的数n:");
- scanf("%d", &n);
- //注意:因为要修改保存row与col,所以传入地址
- FindNum(Tran, n, &row, &col);
- if ((-1 == row) && (-1 == col))
- {
- printf("找不到%d\n", n);
- }
- else
- {
- printf("找到了 下标为:x=%d y=%d\n", row, col);
- }
- return 0;
- }

*结果:
------------------------一个人所有的愤怒都来源于对自己无能的痛苦。------------------------
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。