C 2013笔试题
Pam_sh 人气:01、把整数分解成素数 如90=2*3*3*5 【见2015年】
方法一:
int main() { int n, i=2; printf("\nInput:"); scanf("%d", &n); printf("="); i = 2; while (n > 1) { if (n%i == 0) { printf("%d", i); n = n / i; if (n > 1) printf("*"); } else i++; // 如果不能整除时,说明不是其素数 } return 0; }方法二:
#include<stdio.h> #include<math.h> #include<stdlib.h> #include<string.h> //判读是否为质数,并带回它的最小因数(除1之外)。 int isprime(int value, int *submultiple) { int i; for (i=2; i<(int)sqrt(value)+1; i++) { if ((value%i)==0) { *submultiple=i; return 0; } } return 1; } //递归调用,如果为质数则打印出来,否则将该数除以它的最小因数(除1之外)后递归调用 void prime_submultiple(int value) { int submultiple; if (isprime(value,&submultiple)) { printf("%d",value); return; } else { printf("%d*",submultiple); prime_submultiple(value/submultiple); return; } } int main() { int x; printf("\nPlease input a integar:"); scanf("%d",&x); printf("%d=",x); prime_submultiple(x); }方法三:
#include<stdio.h> #include<math.h> #include<stdlib.h> #include<string.h> //判断是否为质数,并带回他的最小因数(1除外),这个最小因数为素数 int IfPrime(int value,int *submultiple) { int i; for(i=2; i <sqrt(value); i++) { if(0 == value%i) { *submultiple =i; return 0; } } return 1; } //递归调用,如果为质数则直接打印出来,否则为合数,将该合数除以它的最小因数(1除外)后递归调用 void primre_submultiple(int value) { int submultiple; //value为质数(素数) if(IfPrime(value,&submultiple)) { printf("%d",value); return; } else { printf("%d*",submultiple); primre_submultiple(value/submultiple); return; } } void main() { int idata; printf("please input a integar:"); scanf("%d",&idata); printf("%d = ",idata); primre_submultiple(idata); printf("\n"); }
2、计算1-x+x^2/2!-x^3/3!+.....+x^n/n! 见【2015相似】
方法一:
#include<stdio.h> int Calculate(int x,int n) { int total=0; int itemp_a=x,itemp_b=1; int i,j; for(i=0; i <= n; i++) { if(0 == i) { total +=1; printf("%d : total=%d\n",i,total); } else if(1 == i) { total = total-x; printf("%d : total=%d\n",i,total); } else //===oushu { if((0 == i%2)) { itemp_a =1; itemp_b =1; for(j=i; j>= 1; j--) { itemp_a *=x; itemp_b *=j; printf("itemp_a=%d, itemp_b=%d\n",itemp_a,itemp_b); } printf("%d : total=%d\n",i,total); total +=(itemp_a/itemp_b); printf("%d,total:%d\n",i,total); } else { itemp_a =1; itemp_b =1; for(j=i; j>= 1; j--) { itemp_a *=x; itemp_b *=j; printf("itemp_a=%d, itemp_b=%d\n",itemp_a,itemp_b); } printf("%d : total=%d\n",i,total); total = total-(itemp_a/itemp_b); printf("%d,total:%d\n",i,total); } } } printf("%d,total:%d\n",i,total); return total; } void main() { int x; int n; int total; printf("please input the data of x,n!\n"); scanf("%d %d",&x,&n); total = Calculate(x,n); printf("OK,the result is: %d\n",total); }方法二:
#include <stdio.h> #include <stdlib.h> void main() { int n, x, j, i = 1; float sum = 1, k = 1; printf("Input n and x:\n"); scanf("%d %d", &n, &x); while (i <= n) { k = 1; for (j = 1; j <= i; j++) { k = -1*k*x; } for (j = 1; j <= i; j++) { k = k/ j; } sum += k; i++; } printf("%f\n", sum); }方法三:动态规划
#include <stdio.h> #include <stdlib.h> void main() { int n,x,i=1; float sum = 1,k = 1; printf("Input n and x:\n"); scanf("%d %d", &n, &x); while (i <= n) { k = -1 * k*x / i; sum += k; i++; } printf("%f", sum); }
3、删除输入的字符串中的大小写字母和数字 并统计有重复的字符及其重复次数
4、输入整形数据,按输入的逆序建立单链表 【见2016年19题】
代码:
#include <stdio.h> #include <stdlib.h> typedef struct slist{ int data; struct slist *next; }; int main() { //逆序建立单链表,头插法 int x; struct slist *p,*head = (struct slist *)malloc(sizeof(struct slist)); head ->next = NULL; printf("请输入元素:\n"); scanf("%d",&x); while(x != 9999) { struct slist *node = (struct slist *)malloc(sizeof(struct slist)); node ->data = x; node ->next = head ->next; head ->next = node; scanf("%d",&x); } //输出 printf("单链表为:"); p = head ->next; while(p != NULL) { printf("%d\t",p ->data); p = p->next; } return 0; }
5、单链表逆序 【见2017.24】
方法一:头插法
代码:
#include <stdio.h> #include <stdlib.h> typedef struct slist { int data; struct slist *next; }; struct slist *head; // 尾插法建立链表 void creatslist() { int x; head = (struct slist *)malloc(sizeof(struct slist)); //头结点 struct slist *p,*node; // q为尾指针 p = head; printf("请输入元素:"); scanf("%d",&x); while(x != 9999) { node = (struct slist *)malloc(sizeof(struct slist)); node ->data = x; p ->next = node; p = node; printf("请输入元素:"); scanf("%d",&x); } p ->next = NULL; } //链表输出打印 void inputslist() { struct slist *q;//q是工作指针 q = head ->next; //头结点无元素 while(q != NULL) { printf("%d\t",q ->data); q = q ->next; } } // 方法一:头插法 逆序链表 void reverseslist1() { struct slist *p,*r; // p是工作指针,r是p的后继,以防断链 p = head ->next; //从第一个元素开始 head ->next = NULL; //将头节点后置null,断开 while(p != NULL) { r = p ->next; // r暂存s后继 p ->next = head ->next; // 依次将元素结点摘下 head ->next = p; p = r; } } void main() { creatslist(); inputslist(); printf("\n逆序后:\n"); reverseslist1(); inputslist(); }方法二: 后继指针指向前驱结点
代码:
#include <stdio.h> #include <stdlib.h> typedef struct slist { int data; struct slist *next; }; struct slist *head; // 尾插法建立链表 void creatslist() { int x; head = (struct slist *)malloc(sizeof(struct slist)); //头结点 struct slist *p,*node; // q为尾指针 p = head; printf("请输入元素:"); scanf("%d",&x); while(x != 9999) { node = (struct slist *)malloc(sizeof(struct slist)); node ->data = x; p ->next = node; p = node; printf("请输入元素:"); scanf("%d",&x); } p ->next = NULL; } //链表输出打印 void inputslist() { struct slist *q;//q是工作指针 q = head ->next; //头结点无元素 while(q != NULL) { printf("%d\t",q ->data); q = q ->next; } } // 方法二:后继指针指向前驱结点 void reverseslist2() { struct slist *pre,*p = head ->next,*r =p ->next; p ->next = NULL; //处理第一个结点 while(r != NULL) // r若为空,则p为最后一个节点 { pre = p; p = r; r = r ->next; p ->next = pre; } head ->next = p; //处理最后一个结点 } void main() { creatslist(); inputslist(); printf("\n逆序后:\n"); reverseslist2(); inputslist(); }
加载全部内容