题目内容:一个数组A中存有N>0个整数,将每个整数循环向右移M≥0个位置,即将A中的数据由(A0A1⋯AN−1)变换为(AN−M⋯AN−1A0A1⋯AN−M−1)(最后M个数循环移至最前面的M个位置)。
输入格式:第1行输入N(1≤N≤100)和M(≥0)中间用英文逗号,分隔第2行输入N个整数,中间用英文 逗号,分隔。
输出格式:在一行中输出循环右移M位以后的整数序列,中间用英文逗号,分隔,序列结尾不能有多余空格。
输入样例:7,3
1,2,3,4,5,6,7
输出样例:5,6,7,1,2,3,4
输入样例:7,0
1,2,3,4,5,6,7
输出样例:1,2,3,4,5,6,7
1 #include
2 #define N 100
3
4 /*头插入*/
5 void InsertHead(int *arr, int index, intkey)6 {7 for(int j=index-1; j>=0; j--){8 arr[j+1]=arr[j];/*移动*/
9 }10 arr[0]=key;11 }12 intmain()13 {14 int n, m, arr[N] = {0};15 scanf("%d,%d",&n,&m);16
17 for(int i=0; i
22 while(m--)23 InsertHead(arr,n-1,arr[n-1]);24
25 for(int i=0; i
1 /*算法2 整体右移动m位, 右m位全部移动到数组左边*/
2 #include
3 #define N 100
4
5 intmain()6 {7 int n, m, arr[N] = {0};8 scanf("%d,%d",&n,&m);9
10 for(int i=0; i
15 for(int i=n-1; i>=0; --i)16 arr[i+m] =arr[i];17 /*2.右m位全部移动到数组左边*/
18 for(int i=0; i
21 for(int i=0; i
1 /*算法3 置换圈*/
2 #include
3 #define N 100
4 int gcd(int n, int m)//最大公约数
5 {6 while(n)7 {8 int r = m%n;9 m =n;10 n =r;11 }12 returnm;13 }14 intmain()15 {16 int n, m, arr[N] = {0};17 scanf("%d,%d",&n,&m);18
19 for(int i=0; i
24 int count = gcd(n,m);//圈数(最大公约数)
25 int length = n / count; //圈长度
26 for(int i=0; i
27 {28 int t = arr[i]; //圈头元素
29 int start = i; //圈头下标
30 int end = (start-m+n)%n;//圈尾下标
31 for(int j=1; j
32 {33 arr[start] =arr[end];34 start =end;35 end = (end-m+n)%n;36 }37 arr[start] = t;//圈头元素就位
38 }39
40 for(int i=0; i
1 /*算法4 逆序*/
2 #include
3 #define N 100
4 /*逆序*/
5 void reverse(int* arr, int left, intright)6 {7 while(left
20 for(int i=0; i
26 reverse(arr,0,n-k-1);27 reverse(arr,n-k,n-1);28 /*2.再数组元素整体逆转*/
29 reverse(arr,0,n-1);30 /*打印*/
31 for(int i=0; i
1 /*算法5.辅助数组*/
2 #include
3 #define N 100
4 intmain()5 {6 int n, k, arr1[N] = {0},arr2[N] = {0};7 scanf("%d,%d",&n,&k);8 /*输入数组*/
9 for(int i=0; i
14 for(int i=0; i
16 }17 /*打印*/
18 for(int i=0; i
1 /*算法6.循环队列理论,直接输出*/
2 #include
3 #define N 100
4 intmain()5 {6 int i, n, k, arr[N] = {0};7 scanf("%d,%d",&n,&k);8 /*输入数组*/
9 for(int i=0; i
14 /*打印*/
15 for(i=0; i
4、爬楼梯
题目内容:可爱的小明特别喜欢爬楼梯,他有的时候一次爬一个台阶,有的时候一次爬两个台阶,有的时候一次爬三个台阶。如果这个楼梯有n个台阶,小明一共有多少种爬法呢?n值从键盘输入。
输入格式:输入一个整数n,(1<=n<46)。
输出格式:输出当楼梯阶数是n时的上楼方式总数。
输入样例:1
输出样例:1
输入样例:4
输出样例:7
输入样例:24
输出样例:1389537
1 #include
2
3 double fun(intn){4 if(n==1)5 return 1;6 else if(n==2)7 return 2;8 else if(n==3)9 return 4;10 return fun(n-1) + fun(n-2)+ fun(n-3);11 }12
13 intmain()14 {15 intn;16 scanf("%d",&n);17 printf("%.f",fun(n));18 return 0;19 }
5、三天打鱼两天晒网
题目内容:中国有句俗语:“三天打鱼两天晒网”,某人从1990年1月1日起开始“三天打鱼两天晒网”。问这个人在以后的某一天是在“打鱼”还是在“晒网”?
输入样例:1990-1-3
输出样例:他在打鱼
输入样例:2018-11-13
输出样例:他在晒网
1 #include
2 intinputdate();3 intmain()4 {5 int n =inputdate();6 /*if(-1==n){7 printf("Invalid input");8 }9 else*/
10 if(n%5==0||n%5==4){11 printf("他在晒网");12 }13 else{14 printf("他在打鱼");15 }16
17 return 0;18 }19 intinputdate()20 {21 intyear,month,day;22 int n = scanf("%4d-%2d-%2d",&year,&month,&day);23 /*if(3 != n||year<1990||month>12||month<=0||day>31||day<=0){24 return -1;25 }*/
26
27 int date[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},28 {31,29,31,30,31,30,31,31,30,31,30,31}};29
30 int sum = 0, flag =(year%4==0&&year%100!=0)||(year%400==0);31 for(int i=0;i
35 return sum+day;36 }
6、时间换算
题目内容:编写程序,实现输入的时间,屏幕显示一秒后的时间。显示格式为HH:MM:SS。
程序需要处理以下三种特殊情况:
(1)若秒数加1后为60,则秒数恢复到0,分钟数增加1;
(2)若分钟数加1后为60,则分钟数恢复到0,小时数增加1;
(3)若小时数加1后为24,则小时数恢复到0。
输入样例:18:1:2
输出样例:18:01:03
输入样例:20:12:59
输出样例:20:13:00
输入样例:23:59:59
输出样例:00:00:00
1 #include
2 voidrun();3 intmain()4 {5 run();6
7 return 0;8 }9 voidrun()10 {11 inth,m,s;12 scanf("%d:%d:%d",&h,&m,&s);13
14 s++;15 if(s==60){16 s=0;17 m++;18 }19 if(m==60){20 m=0;21 h++;22 }23 if(h==24){24 h=0;25 }26 printf("%02d:%02d:%02d",h,m,s);27 }
7、正向建立单链表
题目内容:输入若干个正整数(输入-1为结束标志),要求按输入数据的逆序建立单链表并输出。
输入格式:一行内输入若干个正整数,之间用空格隔开,并以-1结束。
输出格式:一行内输出建立的单链表数据结果,之间用两个分隔符 -- 隔开,结束标志-1不输出。
输入样例:2 4 6 8 10 -1
输出样例:--2--4--6--8--10
1 #include
2 #include
3 typedef structnode NODE;4 typedef struct node*Linklist;5 structnode{6 intdata;7 Linklist next;8 };9 /*
10 //头插法(输入与输出是逆序)11 Linklist create(){12 Linklist L,p;13 L = p = (Linklist)malloc(sizeof(NODE));14 L->next = NULL;15 int x;16 scanf("%d",&x);17 while(x!=-1)18 {19 p = (Linklist)malloc(sizeof(NODE));20 p->data = x;21 p->next = L->next;22 L->next = p;23 scanf("%d",&x);24 }25 return L;26 }*/
27 //尾插法(输入与输出正序)
28 Linklist create(){29 Linklist L,p,r;30 L = r = (Linklist)malloc(sizeof(NODE));31 L->next =NULL;32 intx;33 scanf("%d",&x);34 while(x!=-1)35 {36 p = (Linklist)malloc(sizeof(NODE));37 p->data =x;38 p->next =NULL;39 r->next =p;40 r =p;41 scanf("%d",&x);42 }43 returnL;44 }45 voidprint(Linklist L){46 while(L->next)47 {48 L = L->next;49 printf("--%d",L->data);50 }51 }52 intmain()53 {54 Linklist L =create();55 print(L);56 return 0;57 }
8、逆置单链表
题目内容:一个单链表L=(a1 , a2 , … , an-1 , an),其逆单链表定义为L’=( an , an-1 , … , a2 , a1),编写算法将单链表L逆置,要求逆单链表仍占用原单链表的空间。
输入格式:一行内输入原单链表中的数据(若干个正整数,之间用空格隔开,并以-1结束)
输出格式:一行内输出建立的原单链表数据结果,之间用两个分隔符 -- 隔开,结束标志-1不输出。
下一行内输出逆置后的单链表数据结果,之间用两个分隔符 -- 隔开。
输入样例:2 4 6 8 10 -1
输出样例:--2--4--6--8--10
--10--8--6--4--2
1 #include
2 #include
3 typedef structnode NODE;4 typedef struct node*Linklist;5 structnode{6 intdata;7 Linklist next;8 };9 voidreverse(Linklist L)10 {11 Linklist NEW = NULL, CUR = L->next, TEMP;12 while(CUR)//是否空
13 {14 TEMP = CUR->next;//保存新表的当前指针的前驱指针(无前驱为NULL)
15 CUR->next = NEW;//逆序(NEW为新表当前CUR的后继指针)
16 NEW = CUR;//更新新表后继指针
17 CUR = TEMP;//更新新表当前指针
18 }19 L->next = NEW;//逆序的头指针插入头结点
20 }21 Linklist create()22 {23 Linklist L,p,r;24 L = r = (Linklist)malloc(sizeof(NODE));25 L->next =NULL;26 intx;27 scanf("%d",&x);28 while(x!=-1)29 {30 p = (Linklist)malloc(sizeof(NODE));31 p->data =x;32 p->next =NULL;33 /*----------*/
34 r->next = p;//尾插
35 r = p; //更新尾指针
36 scanf("%d",&x);37 }38 returnL;39 }40 voidprint(Linklist L)41 {42 while(L->next)43 {44 L = L->next;45 printf("--%d",L->data);46 }47 printf("");48 }49 intmain()50 {51 Linklist L =create();52 print(L);53 reverse(L);//逆序
54 print(L);55 return 0;56 }
9、链表合并
题目内容:已知单链表LA=(a1,a2,…,am)和LB=(b1,b2,…,bn),编写程序按以下规则将它们合并成一个单链表LC,要求新表 LC利用原表的存储空间。
LC=(a1,b1,…,am,bm,bm+1,…,bn),m<=n
或者
LC=(a1,b1,…,an,bn,an+1,…,am),m>n
输入格式:一行内输入单链表LA中的数据(若干个正整数,之间用空格隔开,并以-1结束)
一行内输入单链表LB的数据(若干个正整数,之间用空格隔开,并以-1结束)
输出格式:一行内输出合并后单链表LC的数据结果,之间用两个分隔符 -- 隔开,结束标志-1不输出。
输入样例:1 3 5 7 -1
2 4 6 -1
输出样例:--1--2--3--4--5--6--7
1 #include
2 #include
3 typedef structnode NODE;4 typedef struct node*Linklist;5 structnode{6 intdata;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 /*先插LA再插LB*/
23 if(LA)24 {25 rear->next = LA;//尾插结点
26 rear = rear->next;//更新尾结点
27 LA = LA->next;28 }29 if(LB)30 {31 rear->next = LB;//尾插结点
32 rear = rear->next;//更新尾结点
33 LB = LB->next;34 }35 }36 if(LA)37 rear->next = LA;//尾插剩余结点
38 if(LB)39 rear->next =LB;40 returnhead;41 }42 Linklist create(){43 Linklist L,p,r;44 L = r = (Linklist)malloc(sizeof(NODE));45 L->next =NULL;46 intx;47 scanf("%d",&x);48 while(x!=-1)49 {50 p = (Linklist)malloc(sizeof(NODE));51 p->data =x;52 p->next =NULL;53 r->next =p;54 r =p;55 scanf("%d",&x);56 }57 returnL;58 }59 voidprint(Linklist L){60 while(L->next)61 {62 L = L->next;63 printf("--%d",L->data);64 }65 printf("");66 }67 intmain()68 {69 Linklist L1 =create();70 Linklist L2 =create();71 Linklist L3 =mergelist(L1,L2);72 print(L3);73 return 0;74 }
10、求2~2000的所有素数.有足够的内存,要求尽量快
1 #include
2 #include
3 /*素数集合*/
4 int findvalue[2000];5 static int find;/*素数集合下标从0开始*/
6 bool adjust(intvalue)7 {8 assert(value>=2);/*value>=2*/
9 if(value==2) return true;10 /*被素数整除的不是素数*/
11 for(int i=0;i<=find;i++)12 {13 if(value%findvalue[i]==0)14 return false;15 }16 findvalue[find++];17 return true;18 }19 intmain()20 {21 /*测试, 2~100中的素数集合*/
22 for(int i=2; i<100; ++i)23 if(adjust(i))24 findvalue[find] =i;25 /*打印素数集合*/
26 for(int j=0;findvalue[j]; ++j)27 printf("%d",findvalue[j]);28 return 0;29 }
11、计算器
输入一个四则运算算式,运算符为+、-、*、/,操作数为实型数据,对于除法算式,除数不为0,输出算式中的操作数要求保留小数点后两位。
[测试输入1]1.2+3.4
[测试输出1]1.20+3.40=4.60
[测试输入2]2.5*2
[测试输出2]2.50*2.00=5.00
1 #include
2 #define N 100
3 intmain()4 {5 doublea,b;6 charop;7 scanf("%lf %c%lf",&a,&op,&b);8 double result=0;9 switch(op){10 case '+':result = a+b;break;11 case '-':result = a-b;break;12 case '*':result = a*b;break;13 case '/':result = a/b;break;14 }15 printf("%.2f%c%.2f=%.2f",a,op,b,result);16 return 0;17 }
12、日期合法性判定
从键盘输入一个8位整数表示的日期(即yyyymmdd,表示yyyy年mm月dd日),判断该日期是否为合法日期。
[输入样例] 19990101
[输出样例] 1999年1月1日是合法日期
[输入样例] 19361321
[输出样例] 1936年13月21日是非法日期
[输入样例] 19780431
[输出样例] 1978年4月31日是非法日期
[输入样例] 20000229
[输出样例] 2000年2月29日是合法日期
[输入样例] 21000229
[输出样例] 2100年2月29日是非法日期
[输入样例] 19980229
[输出样例] 1998年2月29日是非法日期
1 #include
2 #define N 100
3 intmain()4 {5 int arr[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};6 int y,m,d,flag =0;7 scanf("%4d%2d%2d",&y,&m,&d);8 int leapyear = y%4==0&&y%100!=0||y%400==0;9 if(leapyear) arr[2]++;10 if(m<=12&&m>=1&&d<=arr[m]&&d>=1)11 flag = 1;12 printf("%d年%d月%d日",y,m,d);13 if(flag)14 printf("是合法日期");15 else
16 printf("是非法日期");17 return 0;18 }
13、求完数
一个正整数如果恰好等于它的因子之和,这个数就称为“完数”,编程找出X之内(包含X)的所有完数并从小到大依次输出各个完数,以空格间隔。例如:6=1+2+3,所以6就是完数。
[样例输入] 100
[样例输出] 6 28
[样例输入] 1000
[样例输出] 6 28 496
1 #include
2 int fun(inti)3 {4 int sum=0,t = i-1;5 while(t)6 {7 if(i%t==0)8 sum +=t;9 t--;10 }11 if(sum==i) return 1;12 return 0;13 }14
15 intmain()16 {17 int n,flag=0;18 scanf("%d",&n);19
20 for(int i=6;i<=n;++i)21 {22 if(fun(i)){23 if(flag) printf(" ");24 printf("%d",i);25 flag = 1;26 }27 }28 return 0;29 }
14、生日蜡烛
[题目描述] 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。现在算起来,他一共吹熄了N根蜡烛。
请问,他从多少岁开始办生日party的,现在他多少岁?
例如:若N=236,因为236=26+27+28+29+30+31+32+33,所以,他从26岁开始办生日party,他现在33岁。
[输入说明] 输入一共吹熄的蜡烛数N。
[输出说明] 输出他办生日party的起止年龄数,以空格隔开;若有多种情况,输出起始年龄最小的一种情况。
[样例输入] 236
[样例输出] 26 33
[样例输入] 186
[样例输出] 10 21
1 #include
2 void fun(int n, int *s,int *e){3 for(int i=1;i<=100;++i)4 {5 int sum=0;6 for(int j=i; j<=100; ++j){7 sum +=j;8 if(sum==n){9 *s=i;10 *e=j;11 return;12 }13 }14 }15 }16 intmain()17 {18 intn,s,e;19 scanf("%d",&n);20 fun(n,&s,&e);21 printf("%d %d",s,e);22 return 0;23 }
15、整数排序
[题目描述] 从键盘输入n个整数,将其从小到大进行排序,并将排序后的结果输出。特别说明:待排序的整数的个数不超过20个。
[输入说明] 第一行为n值,第二行输入n个整数,以空格间隔。
[输出说明] 输出的数据用空格隔开。
[样例输入]
5
5 6 1 2 3
[样例输出]
1 2 3 5 6
1 /*快速排序*/
2 #include
3 void QuickSort(int *a,int n, int left, intright)4 {5 inti,j,t;6 /*左指针left指向数组头 右指针right指向数组尾*/
7 if(left
9 while(i
11 while(j-1>-1 && a[--j]>a[left]);/*右指针左移 指向小于基数的数据停止*/
12 if(i
13 t=a[i],a[i]=a[j],a[j]=t;14 }15 t=a[left],a[left]=a[j],a[j]=t;/*右指针指向数据与基数交换*/
16 QuickSort(a,n,left,j-1);/*左边数据递归*/
17 QuickSort(a,n,j+1,right);/*右边数据递归*/
18 }19 }20
21 intmain()22 {23 int i,n, arr[20]={0};24 scanf("%d",&n);25 for(i=0; i