C语言题目
题目描述
计算字符串最后一个单词的长度,单词以空格隔开。
输入描述:
一行字符串,非空,长度小于5000。
输出描述:
整数N,最后一个单词的长度
#include <stdio.h> int main(int argc, char const *argv[]) { char a[5000]; gets(a); //如果用scanf,会在空格处停止录入 //printf("%s", a); int m = 0; for (int i = 4999; i >= 0; --i) { if ((a[i] > 64 && a[i] < 91) || (a[i] > 96 && a[i] < 123)) //判断ascii码,当它满足为字母时,计数 { m++; } if (a[i] == ' ') //一直计数,计到空格位置,并输出此时的计数值 { printf("%d\n", m); return 0; } if (i == 0) //如果走到了数组头部,还没有空格,说明只有一个单词,那么也输出计数值 { printf("%d\n", m); } } return 0; }
本题注意: 1、scanf()遇到空格便停止接受了,而gets()函数直到收到换行符\n才会停止,所以这里用gets()
2、因为不确定一定有空格,所以还要考虑到输入的字符串只是一个单词的情况,当遍历过整个数组都没有找到空格时,那么认为只有一个单词
题目描述
输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数。
输入描述:
输入一个整数(int类型)
输出描述:
这个数转换成2进制后,输出1的个数
#include <stdio.h> #include <string.h> int main(int argc, char const *argv[]) { int s = 0; scanf("%d",&s); int abc[32] = { 0 }; //注意数组初始化 int tmp = 0; int i = 0; while (s > 0) //短除法法转成二进制 { abc[i] = s % 2; i++; s = s / 2; } for (int j = 0; j < 32; j++) { if (abc[j] == 1) { tmp++; } } printf("%d", tmp); return 0; }
本题注意:1、数组一定要初始化,否则会自动填入奇怪的值,
2、转换二进制的方法
题目描述
写出一个程序,接受一个由字母和数字组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。
输入描述:
第一行输入一个有字母和数字以及空格组成的字符串,第二行输入一个字符。
输出描述:
输出输入字符串中含有该字符的个数。
#include <stdio.h> #include <string.h> int main(int argc, char const *argv[]) { char a[1000] = {0} ; char b ; gets(a); b = getchar(); int m = 0; int len = strlen(a); for (int i = 0; i < len; i++) { if (b == a[i] || b == (a[i]-32) || a[i] == (b -32)) { m++; } } printf("%d\n", m); return 0; }
本题注意:1、数组要初始化
2、gets() 和 getchar() 的使用
3、注意题目要求,不区分大小写,所以判断时要加入大小写的情况,大写字母ASCII码比小写字母多32
题目描述
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作(同一个测试用例里可能会有多组数据,希望大家能正确处理)。
Input Param
n 输入随机数的个数
inputArray n个随机整数组成的数组
Return Value
OutputArray 输出处理后的随机整数
注:测试用例保证输入参数的正确性,答题者无需验证。测试用例不止一组。
输入描述:
输入多行,先输入随机整数的个数,再输入相应个数的整数
输出描述:
返回多行,处理后的结果
#include<stdio.h> int main() {//给定范围去重 int N, i, n;//N为数组长度 while (scanf("%d", &N) != EOF) { int array[1001] = { 0 }; for (i = 0; i<N; i++) { scanf("%d", &n); array[n] = 1; } for (i = 0; i<1001; i++) { if (array[i] == 1) printf("%d\n", i); } } return 0; }
题目描述
输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。
输入描述:
输入一个int型整数
输出描述:
按照从右向左的阅读顺序,返回一个不含重复数字的新的整数
#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { //输入一个整数a int a; scanf("%d", &a); //把a转成字符串 char str[100] = { 0 }; itoa(a,str,10); puts(str); //看看字符串有多长 int len = strlen(str); printf("%d\n", len); //首尾互相调换顺序 int tmp = len -1; for (int i = 0; i < len;i++) { if (i < tmp) { change(&str[i], &str[tmp]); tmp--; } } puts(str); //去除重复值 len = strlen(str); char new_str[100] = {0}; new_str[0] = str[0]; for (int i = 1, j = 1; i < len; i++) { if (strchr(new_str,str[i]) == 0) { new_str[j] = str[i]; j++; } } puts(new_str); } int change(char *a, char *b) { char tmp = *a; *a = *b; *b = tmp; }
本题注意:1、去除重复部分实现,我用了一个新数组承接无重复的部分,并且在每次复制元素到新数组时都用strchr()看一下是否有重复
2、首尾调换顺序注意判断条件
题目描述
写出一个程序,接受一个正浮点数值,输出该数值的近似整数值。如果小数点后数值大于等于5,向上取整;小于5,则向下取整。
输入描述:
输入一个正浮点数值
输出描述:
输出该数值的近似整数值
#include <stdio.h> #include <string.h> int main() { float a ; scanf("%f", &a); //printf("%f\n", a); int b = a; float tmp = a - b; if (tmp>=0.5) { b++; } printf("%d\n", b); }
本题注意:1、用int型去承接浮点数时,会自动去掉所有的小数位,保留到个位。
题目描述
功能:输入一个正整数,按照从小到大的顺序输出它的所有质数的因子(如180的质数因子为2 2 3 3 5 )
详细描述:
函数接口说明:
public String getResult(long ulDataInput)
输入参数:
long ulDataInput:输入的正整数
返回值:
String
输入描述:
输入一个long型整数
输出描述:
按照从小到大的顺序输出它的所有质数的因子,以空格隔开。最后一个数后面也要有空格。
#include <stdio.h> #include <string.h> int main() { int a = 0; scanf("%d", &a); int j; for (j = 2;j < a+1 ; j++) { if ((a % j) == 0) { printf("%d ", j); a = a / j; j = 1; } } }
本题注意:1、变量j的取值范围,j < a+1 因为包包含等于a的情况,一旦输入的值是一个质数,需要能输出该值
2、注意/ %的运用
题目描述
写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。(多组同时输入 )
输入描述:
输入一个十六进制的数值字符串。
输出描述:
输出该数值的十进制字符串。
#include <stdio.h> #include <string.h> int main() { /*输入十六进制数*/ char val_16[100] = { 0 }; /*保存十进制的数*/ int val_10 = 0; while (scanf("%s", val_16) != EOF) { int val_16_len = strlen(val_16); val_10 = 0; int i = val_16_len - 1; int j = 1; while (i > 1) { int tmp = 0; int tmp_16 = val_16[i]; if (tmp_16 >= 48 && tmp_16 <= 57) { tmp = tmp_16 - 48; val_10 = val_10 + tmp * j; } else if (val_16[i] == 'A') { val_10 = val_10 + 10 * j; } else if (val_16[i] == 'B') { val_10 = val_10 + 11 * j; } else if (val_16[i] == 'C') { val_10 = val_10 + 12 * j; } else if (val_16[i] == 'D') { val_10 = val_10 + 13 * j; } else if (val_16[i] == 'E') { val_10 = val_10 + 14 * j; } else if (val_16[i] == 'F') { val_10 = val_10 + 15 * j; } i--; j = j * 16; } printf("%d\n", val_10); } }
本题我才用了判断ascii码的方式去判断某一位是否小于10,如果小于10则转换成相对应的数字,如果是字母,另外转换成数字
每向前走一位,就是多了16的几次方
题目描述
•连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组;
•长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
输入描述:
连续输入字符串(输入2次,每个字符串长度小于100)
输出描述:
输出到长度为8的新字符串数组
#include <stdio.h> #include <string.h> int main() { char a[100] = {0}; char b[100] = {0}; gets(a); gets(b); int len_a = strlen(a); int len_b = strlen(b); char A[][8] = { 0 }; char B[][8] = { 0 }; for (int i = 0; i < 10; i++){ if (((len_a ) % 8 )!= 0) { a[len_a] = '0'; len_a++; } } for (int i = 0; i < 10; i++){ if (((len_b ) % 8 )!= 0) { b[len_b] = '0'; len_b++; } } int count_a = len_a / 8; int count_b = len_b / 8; for (int i = 0; i < count_a;i++) { for (int j = 0; j < 8;j++) { A[i][j] = a[j + i * 8]; } for (int k = 0; k < 8;k++) { printf("%c", A[i][k]); } printf("\n"); } for (int i = 0; i < count_b; i++) { for (int j = 0; j < 8; j++) { B[i][j] = b[j + i * 8]; } for (int k = 0; k < 8; k++) { printf("%c", B[i][k]); } printf("\n"); } return 0; }
使用二维数组去拆分字符串,在拆分之前, 先计算是否8的整数倍,否则补0