题目内容:
编写程序,在主函数中输入两个正整数 a,b,调用两个函数 fun1() 和 fun2(),分别求 a 和 b 的最大公约数和最小公倍数,在主函数中输出结果。
输入格式:
两个正整数
输出格式:
最大公约数和最小公倍数
输入样例:
12,40[回车]
输出样例:
最大公约数:4[回车]
最小公倍数:120[回车]
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 int LCM(int x, int y); 5 int GCD(int x, int y); 6 int main() 7 { 8 int a,b; 9 scanf("%d,%d",&a,&b); 10 printf("最大公约数:%d\n",GCD(a,b)); 11 printf("最小公倍数:%d",LCM(a,b)); 12 return 0; 13 } 14 15 int LCM(int x, int y){ 16 return x/GCD(x,y)*y; 17 } 18 int GCD(int x, int y){ 19 return y == 0 ? x : GCD(y, x%y); 20 }
题目内容:
编写程序,在主函数中定义一个有10个元素的整型一维数组,用户输入9个数据,调用函数,对数组元素进行从小到大排序后,在函数中输入一个数,插入到数组中正确的位置,并输出。
输入格式:
9个整数和1个整数
输出格式:
10个整数
输入样例:
2,3,1,5,6,76,89,31,90[回车]
7[回车]
输出样例:
1,2,3,5,6,7,31,76,89,90[回车]
1 #include<stdio.h> 2 void sortArr(int *arr, int n, int x) 3 { 4 arr[n-1] = x; 5 //插入排序 6 int i; 7 for(i=1; i<n; ++i){ 8 int j=i-1,key=arr[i]; 9 while(j>=0 && key<arr[j]){ 10 arr[j+1]=arr[j]; 11 j--; 12 } 13 arr[j+1]=key; 14 } 15 } 16 int main() 17 { 18 int arr[10] = {0},i,x; 19 for(i=0; i<8; ++i) 20 scanf("%d,",&arr[i]); 21 scanf("%d%d",&arr[i],&x); 22 23 sortArr(arr,10,x); 24 for(i=0; i<9; ++i) 25 printf("%d,",arr[i]); 26 printf("%d\n",arr[i]); 27 return 0; 28 }
3、奇数求和
题目内容:
用递归算法实现,输入整数n(n>0), 求1+3+5+7….+(2*n-1) 的和
输入格式:
输入整数n
输出格式:
输出和
输入样例:
5[回车]
输出样例:
25[回车]
1 #include<stdio.h> 2 3 int sum(int n); 4 int main() 5 { 6 int n; 7 scanf("%d",&n); 8 printf("%d\n",sum(n)); 9 return 0; 10 } 11 12 int sum(int n) 13 { 14 if(n == 1) 15 return 1; 16 return 2*n-1 + sum(n-1); 17 }
4、巧算自然数
题目内容:
编程实现输入一个自然数,若为偶数,则把它除以2;若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。输出经过多少次可以得到自然数1和每次得到的值。
输入格式:
输入一个自然数
输出格式:
输出经过多少次可以得到自然数1和每次得到的值
输入样例:
22[回车]
输出样例:
22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1[回车]
step=16[回车]
1 #include <stdio.h> 2 int main() 3 { 4 int n, step=1; 5 scanf("%d",&n); 6 while(n!=1) 7 { 8 printf("%d,",n); 9 step++; 10 if(n%2==0) 11 n /= 2; 12 else if(n%2) 13 n = n*3+1; 14 } 15 printf("1\n"); 16 printf("step=%d\n", step); 17 return 0; 18 }
5、卖鸭子
题目内容:
编程调用递归函数。一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了7个村子后还剩2只鸭子,问他出发时共赶多少只鸭子?经过每个村子时依次卖出多少只鸭子?
输入格式:
无
输出格式:
出发时总鸭子数
每个村子卖出鸭子数
输入样例:
无
输出样例:(不是结果,仅表示格式)
sum=25[回车]
sell=8,sell=4,[回车]
1 #include <stdio.h> 2 int fun(int arr[],int n,int m) 3 { 4 if(n==0){ 5 arr[n] = m/2+1; 6 return m; 7 } 8 arr[n] = m/2+1; 9 return fun(arr, n-1,m=2*(m+1)); 10 } 11 int main() 12 { 13 int arr[7] = {0}; 14 printf("sum=%d\n", fun(arr,7,2)); 15 for(int i=0; i<7; ++i) 16 printf("sell=%d,", arr[i]); 17 return 0; 18 }
6、输出各位数字之和
题目内容:
编程调用递归函数,求输入一个数,输出这个数的各位数字之和。
输入格式:
输入一个数
输出格式:
输出这个数的各位数字之和
输入样例:
2354[回车]
输出样例:
14[回车]
1 #include <stdio.h> 2 int fun(int n) 3 { 4 if(n==0) 5 return 0; 6 return n%10 + fun(n/10); 7 } 8 int main() 9 { 10 int n; 11 scanf("%d",&n); 12 printf("%d\n", fun(n)); 13 return 0; 14 }
7、排序
题目内容:
用指针方法,将一维数组int a[10] 中元素按从小到大顺序输出。
输入格式:
10个整数,空格隔开
输出格式:
排序后的10个数,逗号隔开
输入样例:
12 34 56 43 7 89 81 11 33 90[回车]
输出样例:
7,11,12,33,34,43,56,81,89,90[回车]
1 #include <stdio.h> 2 #include <string.h> 3 #define N 1000 4 5 int main() 6 { 7 int arr[N] = {0},x; 8 for(int i=0; i<10; ++i){ 9 scanf("%d",&x); 10 arr[x]++; 11 } 12 int flag = 1; 13 for(int j=0; j<N; ++j){ 14 while(arr[j]){ 15 if(!flag) 16 printf(","); 17 printf("%d",j); 18 flag = 0; 19 arr[j]--; 20 } 21 } 22 return 0; 23 }
1 #include <stdio.h> 2 #include <string.h> 3 #define N 1000 4 5 int main() 6 { 7 int arr[N] = {0}; 8 for(int i=0; i<10; ++i) 9 scanf("%d",&arr[i]); 10 //选择(选一个最小的) 11 for(int *p = arr; p<arr+9; ++p){ 12 for(int *q = p+1; q<arr+10; ++q){ 13 if(*q<*p){ 14 int t = *q; 15 *q = *p; 16 *p = t; 17 } 18 } 19 } 20 21 int flag = 0; 22 for(int *p = arr; p<arr+10; ++p){ 23 if(flag) 24 printf(","); 25 flag = 1; 26 printf("%d",*p); 27 } 28 return 0; 29 }
1 #include <stdio.h> 2 #include <string.h> 3 #define N 1000 4 5 int main() 6 { 7 int arr[N] = {0}; 8 for(int i=0; i<10; ++i) 9 scanf("%d",&arr[i]); 10 //冒泡 11 for(int i=0; i<10; ++i){ 12 for(int j=9; j>i; --j){ 13 if(arr[j-1]>arr[j]){ 14 int t = arr[j-1]; 15 arr[j-1] = arr[j]; 16 arr[j] = t; 17 } 18 } 19 } 20 21 for(int k=0; k<10; ++k){ 22 if(k) 23 printf(","); 24 printf("%d",arr[k]); 25 } 26 return 0; 27 }
8、成绩排序
题目内容:
从键盘输入3个同学4门课的成绩,将其按平均分从高到低排序输出。
输入格式:
输入3个同学4门课的成绩
输出格式:
按平均分从高到低排序输出
输入样例:
89 78 80 76 88 78 75 90 99 92 100 89[回车]
输出样例:
99,92,100,89[回车]
88,78,75,90[回车]
89,78,80,76[回车]
1 #include <stdio.h> 2 struct student{ 3 int a,b,c,d; 4 double avg; 5 }; 6 void swap(struct student *a,struct student *b){ 7 struct student t = *a; 8 *a = *b; 9 *b = t; 10 } 11 int main() 12 { 13 struct student s[3]; 14 for(int i=0; i<3; ++i){ 15 scanf("%d%d%d%d",&s[i].a,&s[i].b,&s[i].c,&s[i].d); 16 s[i].avg = (s[i].a + s[i].b + s[i].c + s[i].d)/4.0; 17 } 18 19 if(s[0].avg<s[1].avg) 20 swap(&s[0],&s[1]); 21 if(s[0].avg<s[2].avg) 22 swap(&s[0],&s[2]); 23 if(s[1].avg<s[2].avg) 24 swap(&s[1],&s[2]); 25 26 for(int i=0; i<3;++i) 27 printf("%d,%d,%d,%d\n",s[i].a,s[i].b,s[i].c,s[i].d); 28 return 0; 29 }
9、输出指定学生成绩
题目内容:
从键盘输入3个同学4门课的成绩,输出指定同学的成绩和平均分。
输入格式:
输入3个同学4门课的成绩
输出格式:
输出指定同学的成绩和平均分
输入样例:
89 78 80 76 88 78 75 90 99 92 100 89[回车]
1[回车]
输出样例:
89 78 80 76[回车]
80.75[回车]
1 #include <stdio.h> 2 struct student{ 3 int a,b,c,d; 4 double avg; 5 }; 6 7 int main() 8 { 9 struct student s[3]; 10 for(int i=0; i<3; ++i){ 11 scanf("%d%d%d%d",&s[i].a,&s[i].b,&s[i].c,&s[i].d); 12 s[i].avg = (s[i].a + s[i].b + s[i].c + s[i].d)/4.0; 13 } 14 15 int i; 16 scanf("%d",&i); 17 printf("%d %d %d %d\n",s[i-1].a,s[i-1].b,s[i-1].c,s[i-1].d); 18 if(s[i-1].avg==(int)s[i-1].avg) 19 printf("%.f\n",s[i-1].avg); 20 else 21 printf("%.2f\n",s[i-1].avg); 22 return 0; 23 }
10、统计字符串出现次数
题目内容:
从键盘输入两个字符串,输出第二个串在第一个串中出现的次数。如果没有,输出“No”。
输入格式:
输入两个字符串
输出格式:
输出第二个串在第一个串中出现的次数。
如果没有,输出 No
输入样例1:
This is his book[回车]
is[回车]
输出样例1:
3[回车]
输入样例2:
This is my book[回车]
at[回车]
输出样例2:
No[回车]
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 int KMPStrMatching(char* S, char* P, int *N, int start) 6 { 7 int j= 0; // 模式的下标变量 8 int i = start; // 目标的下标变量 9 int pLen = strlen(P); // 模式的长度 10 int tLen = strlen(S); // 目标的长度 11 if (tLen - start < pLen) // 若目标比模式短,匹配无法成功 12 return (-1); 13 while ( j < pLen && i < tLen) 14 { // 反复比较,进行匹配 15 if ( j == -1 || S[i] == P[j]) 16 i++, j++; 17 else j = N[j]; 18 } 19 if (j >= pLen) 20 return (i-pLen); // 注意仔细算下标 21 else return (-1); 22 } 23 24 int* findNext(char* P) 25 { 26 int j, k; 27 int m = strlen(P); // m为模式P的长度 28 int *next = (int*)malloc(m*sizeof(int)); 29 next[0] = -1; 30 j = 0; k = -1; 31 while (j < m-1) 32 { 33 if(k == -1 || P[k] == P[j]){ 34 j++; k++; next[j] = k; 35 } 36 else 37 k = next[k]; //不等则采用 KMP 递归找首尾子串 38 } 39 return next; 40 } 41 42 int main() 43 { 44 int count=0; 45 char s1[256]="",s2[256]=""; 46 gets(s1); 47 gets(s2); 48 int len1 = strlen(s1); 49 int len2 = strlen(s2); 50 int ret = 0; 51 for(int i=0; i<len1; i=ret+len2) 52 { 53 ret = KMPStrMatching(s1,s2,findNext(s2),i); 54 if(ret == -1) 55 break; 56 count++; 57 } 58 if(count) 59 printf("%d\n",count); 60 else 61 printf("No\n"); 62 return 0; 63 }
11、成绩统计
题目内容: 有如下学生成绩表,第一列前4行为学生姓名,第一列最后一行为平均分,表中给定数据为学生成绩(每一列为同一门课)
编程输出:学生姓名,每个学生的平均分,及各门课程平均分
输入格式:
无
输出格式:
学生姓名,每个学生的平均分(按行输出)各门课程平均分(按列输出)(若平均分为整数,则输出整数,若平均分为小数,则保留两位)
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 static float av[4]; 6 7 struct student{ 8 char *s; 9 float score[4]; 10 }stu[4]; 11 12 void fun1(struct student *stu) 13 { 14 float sum=0; 15 for(int i=0; i<4; ++i) 16 { 17 av[i]+=stu->score[i]; 18 sum += stu->score[i]; 19 } 20 if((int)sum/4==sum/4) 21 printf("%s,%.f\n",stu->s,sum/4); 22 else 23 printf("%s,%.2f\n",stu->s,sum/4); 24 } 25 26 void fun2(float av) 27 { 28 if((int)(av/4)==av/4) 29 printf("%.f",av/4); 30 else 31 printf("%.2f",av/4); 32 } 33 34 int main() 35 { //0 36 stu[0].s = "wanglei",stu[0].score[0] = 78,stu[0].score[1] = 90,stu[0].score[2] = 87,stu[0].score[3] = 92; 37 fun1(&stu[0]); 38 //1 39 stu[1].s = "lihong",stu[1].score[0] = 88,stu[1].score[1] = 91,stu[1].score[2] = 89,stu[1].score[3] = 78; 40 fun1(&stu[1]); 41 //2 42 stu[2].s = "zhangli",stu[2].score[0] = 84,stu[2].score[1] = 76,stu[2].score[2] = 83,stu[2].score[3] = 75; 43 fun1(&stu[2]); 44 //3 45 stu[3].s = "liuming",stu[3].score[0] = 88,stu[3].score[1] = 90,stu[3].score[2] = 71,stu[3].score[3] = 83; 46 fun1(&stu[3]); 47 //4 48 printf("AVERAGE:"); 49 for(int i=0; i<4; ++i){ 50 if(i) 51 printf(","); 52 fun2(av[i]); 53 } 54 return 0; 55 }
12、输出菱形
题目内容:
输入数字和大写字母,输出由字母组成的菱形。
例如:3 B
B
C C
D D
E E
F
输入格式:
数字和大写字母
输出格式:
由字母组成的菱形
输入样例:
3[空格]B[回车]
输出样例:
[空格][空格]B[回车]
[空格]C[空格]C[回车]
D[空格][空格][空格]D[回车]
[空格]E[空格]E[回车]
[空格][空格]F[回车]
1 #include <stdio.h> 2 int main() 3 { 4 char start; 5 int high,i,j; 6 scanf("%d %c",&high,&start); 7 //上半部 8 for (i=0; i<high; i++) 9 { 10 //空格 11 for (j=1;j<high-i;j++) 12 printf (" "); 13 //字符、空格、字符 14 printf ("%c",start); 15 for (j=0;j<2*i-1;j++) 16 printf (" "); 17 if (i) 18 printf ("%c",start); 19 start++; 20 //换行 21 printf ("\n"); 22 } 23 24 //下半部 25 for (i=high-1; i>0 ;i--) 26 { 27 //空格 28 for (j=0;j<high-i;j++) 29 printf (" "); 30 //字符、空格、字符 31 printf ("%c",start); 32 for (j=0;j<2*i-3;j++) 33 printf (" "); 34 if (i-1){ 35 printf ("%c",start); 36 } 37 start++; 38 //换行 39 printf ("\n"); 40 } 41 return 0; 42 }
13、最大数
题目内容:
任意输入一个自然数,输出该自然数的各位数字组成的最大数。例如,输入 1593 ,则输出为 9531。
输入格式:
自然数 n
输出格式:
各位数字组成的最大数
输入样例:
1593[回车]
输出样例:
9531[回车]
1 #include <stdio.h> 2 int main() 3 { 4 int n; 5 scanf("%d",&n); 6 int key[10] = {0}; 7 while(n) 8 { 9 key[n%10]++; 10 n /= 10; 11 } 12 for(int i=9; i>=0; --i){ 13 while(key[i]){ 14 printf("%d",i); 15 key[i]--; 16 } 17 } 18 return 0; 19 }
14、字符串删除
题目内容:
输入一个字符串,找出其中相同的字符(不区分大小写),并删除,输出剩余的部分。
例如:输入:eye 输出:y
输入格式:
字符串
输出格式:
删除相同字符之后的字符串
输入样例:
eye[回车]
输出样例:
y[回车]
1 #include<stdio.h> 2 #define N 256 3 4 int main() 5 { 6 /* 输入一个字符串 */ 7 char s[N] = ""; 8 gets(s); 9 char *p = s; 10 /* 判断是否重复 */ 11 int key[N] = {0}; 12 while(*p) 13 { 14 key[*p++]++; 15 } 16 /* 输出不重复的字符 */ 17 for(int i=0; s[i]; ++i) 18 if(key[s[i]]==1) 19 printf("%c",s[i]); 20 return 0; 21 }
15、字母存储
题目内容:
使用单项链表存储一组字母{a, b, c, d, c, b , a},输入序号输出字母,输入字母输出最后一次出现的序号,越界则输出N。
输入格式:
序号或字母
输出格式:
字母或序号
输入样例1:
2[回车]
输出样例1:
c[回车]
输入样例2:
c[回车]
输出样例2:
4[回车]
输入样例3:
8[回车]
输出样例3:
N[回车]
1 #include <stdio.h> 2 #include <ctype.h> 3 #include <malloc.h> 4 5 typedef struct node *PNODE; 6 typedef struct node NODE; 7 struct node{ 8 char ch; 9 PNODE next; 10 }; 11 12 /* void print(PNODE head){ 13 while(head){ 14 printf("%c",head->ch); 15 head = head->next; 16 } 17 printf("\n"); 18 } */ 19 20 void print(PNODE head,int ch){ 21 if(!isalpha(ch)&&ch>'7'){ 22 printf("N\n"); 23 return; 24 } 25 int index = -1,t = -1;//元素从0开始计算 26 while(head){ 27 index++; //元素计数 28 if(head->ch==ch)//是字母 29 t = index + '0';//序号转字符 30 else if(index==ch-'0')//是数字 31 t = head->ch; //保存字母 32 head = head->next; 33 } 34 printf("%c\n",t);//打印字母(数字) 35 } 36 37 int main() 38 { 39 /* 创建头结点 */ 40 PNODE head,rear; 41 head = rear = (PNODE)malloc(sizeof(NODE)); 42 head->next = NULL; 43 /* 字符串 */ 44 char s[] = "abcdcba"; 45 char*p = s; 46 while(*p) 47 { 48 PNODE s = (PNODE)malloc(sizeof(NODE)); 49 s->ch = *p++; 50 s->next = NULL; 51 rear->next = s;//尾插法 52 rear = s; 53 } 54 /* print(head->next); */ 55 int ch; 56 ch = getchar(); 57 print(head->next,ch); 58 59 return 0; 60 }
16、链表合并
题目内容:
实现两个由单项链表存储的有序字母数据的合并,如有重复的则只保留一个。
例如:给定{a, c ,f}, { b, e, g}合并后结果为{a, b, c , e , f , g}。
输入格式:
两个有序字母数据
输出格式:
合并后的字母数据
输入样例1:
a b c[回车]
d e f[回车]
输出样例1:
a b c d e f[回车]
输入样例2:
e f g[回车]
e g m[回车]
输出样例2:
e f g m[回车]
1 #include <stdio.h> 2 #include <malloc.h> 3 typedef struct node NODE; 4 typedef struct node* Linklist; 5 struct node{ 6 char ch; 7 Linklist next; 8 }; 9 Linklist mergelist(Linklist LA,Linklist LB) 10 { 11 /* 12 LA的头指针为新链表的头、尾指针 13 LB的头结点释放 14 */ 15 Linklist head = LA,rear = LA,temp = LB; 16 LA = LA->next; 17 LB = LB->next; 18 free(temp); 19 /* 逐个结点链接到新链表 */ 20 while(LA && LB) 21 { 22 if(LA->ch == LB->ch) 23 { 24 Linklist p = LB; 25 LB = LB->next; 26 free(p); //删除重复内容的结点 27 continue; 28 } 29 else if(LB->ch<LA->ch) 30 { 31 rear->next = LB;//尾插结点 32 LB = LB->next; 33 } 34 else if(LA->ch<LB->ch) 35 { 36 rear->next = LA;//尾插结点 37 LA = LA->next; 38 } 39 rear = rear->next;//更新尾结点 40 } 41 if(LA) 42 rear->next = LA;//尾插剩余结点 43 if(LB) 44 rear->next = LB; 45 return head; 46 } 47 Linklist create(){ 48 Linklist L,p,r; 49 L = r = (Linklist)malloc(sizeof(NODE)); 50 L->next = NULL; 51 char ch; 52 while((ch=getchar())!='\n')//空格结束 53 { 54 if(ch!=' '){ //去除空格 55 p = (Linklist)malloc(sizeof(NODE)); 56 p->ch = ch; 57 p->next = NULL; 58 r->next = p; 59 r = p; 60 } 61 } 62 return L; 63 } 64 void print(Linklist L){ 65 int flag = 0; 66 while(L->next) 67 { 68 if(flag) 69 printf(" "); 70 flag = 1; 71 L = L->next; 72 printf("%c",L->ch); 73 } 74 printf("\n"); 75 } 76 int main() 77 { 78 Linklist L1 = create(); 79 Linklist L2 = create(); 80 Linklist L3 = mergelist(L1,L2); 81 print(L3); 82 return 0; 83 }
17、解析字符串
题目内容:
输入一个字符串,要求将其中的字母‘n’理解为回车符号’\n’,模拟文件缓冲区读取的数据,并按替换后的数据流解析出其中包括的字符串。(即通过'n'分割两个字符串)
输入格式:
一个字符串
输出格式:
其中包括的字符串
输入样例:
abcnde[回车]
输出样例:
abc[回车]
de[回车]
1 #include <stdio.h> 2 #define N 256 3 int main() 4 { 5 char str[N]="",*p; 6 p = str; 7 gets(str); 8 while(*p) 9 { 10 if(*p=='n'){ 11 if(*(p-1)!='n') 12 putchar('\n'); 13 } 14 else 15 putchar(*p); 16 p++; 17 } 18 return 0; 19 }
18、字符串的输入与反向显示
题目内容:
请用标准设备文件的方式完成字符串的输入与反向显示。
输入格式:
字符串
输出格式:
字符串
输入样例:
abc[回车]
输出样例:
cba[回车]
1 #include <stdio.h> 2 #include<string.h> 3 #define N 256 4 int main() 5 { 6 char str[N]="",*p = str; 7 gets(str); 8 p += strlen(str) - 1; 9 while(*p) 10 putchar(*p--); 11 return 0; 12 }
19、基本四则运算表达式
题目内容:
请结合C语言语法知识以及对编译过程的理解,完成一个仅含一个运算符的基本四则运算表达式字符串的计算。
输入格式:
基本四则运算表达式字符串
输出格式:
运算结果
输入样例:
1+2
输出样例:
3
1 #include <stdio.h> 2 int main() 3 { 4 char op; 5 int i,a,b; 6 scanf("%d%c%d",&a,&op,&b); 7 switch(op) 8 { 9 case '+':printf("%d",a+b);break; 10 case '-':printf("%d",a-b);break; 11 case '*':printf("%d",a*b);break; 12 case '/':printf("%d",a/b);break; 13 } 14 return 0; 15 }
20、递归的方法计算含多个运算符的四则运算表达式字符串的值
题目内容:
请在上一题的基础上,采用递归的方法,计算含多个运算符的四则运算表达式字符串的值(无括号,但要考虑优先级)
输入格式:
多个运算符的四则运算表达式字符串
输出格式:
运算结果
输入样例:
3*2+3
输出样例:
9
1 #include <stdio.h> 2 #include <ctype.h> 3 double expression_value();//求一个表达式的值 4 double term_value();//求一个项的值 5 double factor_value();//求一个因子的值 6 double expression_value() 7 { 8 double result=term_value(); 9 while(1) 10 { 11 char op = getc(stdin); 12 ungetc(op, stdin); 13 if(op=='+'||op=='-') 14 { 15 getchar(); 16 double value=term_value(); 17 if(op=='+') 18 result+=value; 19 else 20 result-=value; 21 } 22 else 23 break; 24 } 25 return result; 26 } 27 double term_value() 28 { 29 double result = factor_value(); 30 while(1) 31 { 32 char c= getc(stdin); 33 ungetc(c, stdin); 34 if(c=='*'||c=='/') 35 { 36 getchar(); 37 double value = factor_value(); 38 if(c=='*') 39 result*=value; 40 else 41 result/=value; 42 } 43 else 44 break; 45 } 46 return result; 47 } 48 double factor_value() 49 { 50 double result=0; 51 char c= getc(stdin); 52 ungetc(c, stdin); 53 if(c=='(') 54 { 55 getchar(); 56 result = expression_value(); 57 getchar(); 58 } 59 else//因子本身是一个数字(整个递归的出口) 60 { 61 while(isdigit(c))//处理整数部分 62 { 63 result = 10*result+c-'0'; 64 getchar(); 65 c = getc(stdin); 66 ungetc(c, stdin); 67 } 68 if(c=='.')//处理小数部分 69 { 70 getchar(); 71 c = getc(stdin); 72 ungetc(c, stdin); 73 double t=0.1; 74 while(isdigit(c)) 75 { 76 result += (c-'0')*t; 77 t*=0.1; 78 getchar(); 79 c = getc(stdin); 80 ungetc(c, stdin); 81 } 82 } 83 } 84 return result; 85 } 86 int main() 87 { 88 printf("%.f\n",expression_value()); 89 return 0; 90 }
21、从键盘输入一个字符串,该串中包含字母和数字,然后将数字排在最前面,字母 排在后面,不改变原有数字或字母间的顺序。
1 #include <stdio.h> 2 #include <string.h> 3 int main() 4 { 5 char a[256]="",b[256]=""; 6 char *p,*q,*ptr; 7 p = q = a; 8 ptr = b; 9 gets(a); 10 while(*p) 11 { 12 if(*p>='0'&&*p<='9'){ 13 *ptr++ = *p; 14 } 15 else 16 *q++ = *p; 17 p++; 18 } 19 *q = '\0'; 20 strcat(ptr,a); 21 printf("%s\n",b); 22 return 0; 23 }
22、给定一个数,进行因式分解,删除重复的因子后,剩余因子相乘后输出
1 #include <stdio.h> 2 #include <string.h> 3 int main() 4 { 5 int n,i=2,result=1,flag=1; 6 scanf("%d",&n); 7 while(i<=n) 8 { 9 if(n%i==0){ 10 n/=i; 11 if(flag) 12 result *=i; 13 flag=0; 14 } 15 else { 16 ++i; 17 flag=1; 18 } 19 } 20 printf("%d\n",result); 21 return 0; 22 }
1 #include <stdio.h> 2 #include <string.h> 3 int main() 4 { 5 int n,result=1,m=2; 6 scanf("%d",&n); 7 while(m<=n) 8 { 9 if(n%m==0){ 10 result *=m; 11 while(n%m==0) 12 n /= m; 13 } 14 m++; 15 } 16 printf("%d\n",result); 17 return 0; 18 }
23、)输入行数 n,及首个小写字母,输出三角形字母图 形,如果输出超过 z,再回到 a,依次循环下去。
1 #include <stdio.h> 2 #include <string.h> 3 int main() 4 { 5 int n,i,j,k; 6 char c; 7 scanf("%d,%c",&n,&c); 8 for(i=0; i<n-1; ++i) 9 { 10 for(j=n-i-1; j>0; --j){ 11 printf("-"); 12 } 13 if(c>'z') c = 'a'; 14 putchar(c++); 15 if(i){ 16 for(int k=(i-1)*2+1;k>0; k--) 17 printf("-"); 18 if(c>'z') c = 'a'; 19 putchar(c++); 20 } 21 printf("\n"); 22 } 23 for(int m=0; m<n+n-1;++m){ 24 if(c>'z') c = 'a'; 25 putchar(c++); 26 } 27 return 0; 28 }
24、Z型字母图形
题目内容:
输入行数n,及首个小写字母,输出Z型字母图形,如果输出超过z,再回到a,依次循环下去。
输入格式:
3,b
输出格式:
bcd
e
fgh【回车】
输入样例:
3,b
输出样例:
bcd
e
fgh
1 #include <stdio.h> 2 int main() 3 { 4 int n, i, j; 5 char c; 6 scanf("%d,%c", &n, &c); 7 for(i=0; i<n; i++) 8 { 9 for(j=0; j<n; j++) 10 { 11 if(i==0 || i==n-1) 12 printf("%c",c++); 13 else if(i+j==n-1) 14 printf("%c",c++); 15 else if(i+j<n-1) 16 printf(" "); 17 if(c>'z') c='a'; 18 } 19 printf("\n"); 20 } 21 return 0; 22 }
25、特殊数字
题目内容:
给定一个区间,输出其中前半部分数字之和等于后半部分数字之和的数,没有则输出No output。
输入格式:
120 130
输出格式:
121【回车】
输入样例:
120 130
输出样例:
121
1 #include <stdio.h> 2 3 int divide(int i,int *num) 4 { 5 int index = 0; 6 while(i) 7 { 8 num[index++] = i%10; 9 i = i/10; 10 } 11 return index; 12 } 13 14 int isEqual(int *num,int index) 15 { 16 int i,sum1,sum2; 17 sum1 = sum2 = 0; 18 for(i=0; i<index/2; i++) 19 { 20 sum1 += num[i]; 21 sum2 += num[index-i-1]; 22 } 23 return (sum1 == sum2); 24 } 25 26 int main() 27 { 28 int a=120,b=130,index,num[12],flag=0; 29 scanf("%d%d",&a,&b); 30 for(int i=a;i<=b;i++) 31 { 32 index = divide(i,num); 33 if(isEqual(num,index)) 34 { 35 flag = 1; 36 printf("%d\n",i); 37 } 38 } 39 if(!flag) 40 puts("No output"); 41 return 0; 42 }
26、连续子串
题目内容:
从键盘输入一个字符串,按从左向右顺序分解成连续字符组成的几个子串,并顺序输出这些子串
输入格式:
bxyzacdefgh345x
输出格式:
xyz
cdefgh
345【回车】
输入样例:
bxyzacdefgh345x
输出样例:
xyz
cdefgh
345
1 #include <stdio.h> 2 #include <string.h> 3 int main() 4 { 5 char s[256] = ""; 6 int count=0; 7 gets(s); 8 for( int i=0; s[i]; ++i) 9 { 10 if(s[i+1]&&s[i+1]==s[i]+1) count++; 11 else if(count>=1) 12 { 13 char t[256] = ""; 14 printf("%s\n",strncpy(t,&s[i-count],count+1)); 15 count=0; 16 } 17 } 18 return 0; 19 }
1 #include <stdio.h> 2 //#include <string.h> 3 int main() 4 { 5 char s[256] = ""; 6 char t[256] = ""; 7 int count=0; 8 gets(s); 9 for( int i=0; s[i]; ++i) 10 { 11 if(s[i+1]&&s[i+1]==s[i]+1) t[count++] = s[i]; 12 else if(count>=1) 13 { 14 t[count++] = s[i]; 15 t[count] = '\0'; 16 printf("%s\n",t); 17 count=0; 18 } 19 } 20 return 0; 21 }
27、
下面程序的功能是将字符串s的所有字符传送到字符串t中,要求每传递三个字符后再存放一个空格,例如字符串s为"abcdefg",则字符串t为"abc def g"。
1 #include <stdio.h> 2 #include <string.h> 3 int main() 4 { 5 int j, k=0; 6 char s[60], t[100], *p; 7 p=s; 8 gets(p); 9 while(*p) 10 { 11 for (j=1; j<=3 && *p; p++,k++,j++) t[k]=*p; 12 13 if (j==4) { t[k]=' '; k++;}//*p 14 15 } 16 t[k]='\0'; 17 puts(t); 18 return 0; 19 }
28、下面程序的功能是实现数组元素中值的逆转
1 #include <stdio.h> 2 #include <string.h> 3 void invert(int *s,int num) 4 { 5 int *t,k; 6 t=s+num; 7 while(s<t) 8 { 9 k=*s; 10 *s=*t; 11 *t=k; 12 s++; 13 t--; 14 } 15 } 16 int main() 17 { 18 int i,n=10,a[10]={1,2,3,4,5,6,7,8,9,10}; 19 invert(a,n-1); 20 for(i=0; i<10; i++) 21 printf("%4d",a[i]); 22 printf("\n"); 23 return 0; 24 }
29、建立一个包含30个元素的循环链表
1 #include <stdio.h> 2 #include <string.h> 3 #include <malloc.h> 4 5 struct node{ 6 int no; 7 struct node* next; 8 }; 9 10 int main() 11 { 12 int i, k; struct node *head, *p, *q; 13 head = (struct node *)malloc(sizeof(struct node)); 14 head->no = -1; 15 head->next = head; 16 for ( i=30; i>0; i-- ) /* 生成循环链表 */ 17 { 18 p = (struct node *)malloc(sizeof(struct node)); 19 p->next = head->next; p->no = i; head->next = p; 20 } 21 22 q = head->next; 23 while(q->no!=-1) 24 { 25 printf("%d ",q->no); 26 q = q->next; 27 } 28 return 0; 29 }
30、下面程序的功能是将磁盘上的一个文件复制到另一个文件中,两个文件名在命令行中给出(假定给定的文件名无误)
1 #include <stdio.h> 2 #include <stdlib.h> 3 int main(int argc,char *argv[]) 4 { 5 FILE *fin,*fout; 6 if(argc< 3 ) 7 { 8 printf("The command line error! "); 9 exit(0); 10 } 11 12 fin=fopen(argv[1], "r"); 13 14 fout=fopen(argv[2], "w"); 15 16 while(!feof(fin)) 17 fputc(fgetc(fin), fout ); 18 fclose(fin); 19 fclose(fout); 20 return 0; 21 }