题目内容:
编写程序,在主函数中输入两个正整数 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 }