目录
常见编程题各解法
0 交换值
| |
| void swap(int *a,int *b){ |
| int temp = *a; |
| *a = *b; |
| *b = temp; |
| } |
| |
| void swap(int *a,int *b){ |
| *a += *b; |
| *b = *a - *b; |
| *a -= *b; |
| } |
1 累计和
| |
| #include <stdio.h> |
| int main(){ |
| int i,sum = 0; |
| for(i = 0; i <= 100; i++) |
| sum+=i; |
| printf("%d",sum); |
| return 0; |
| } |
| |
| #include <stdio.h> |
| |
| |
| |
| |
| int Recursion(int n){ |
| if(n==1) return 1; |
| return Recursion(n-1)+n; |
| } |
| int main(){ |
| printf("%d",Recursion(100)); |
| return 0; |
| } |
2 Fibonacci 数列
- 注意前几项是
0 1 1 2 ...
还是 1 1 2 3 ...
- 以下按照第二种, 貌似考得更多
① 第N项 / 前N项
| |
| |
| |
| |
| #include <stdio.h> |
| int main(){ |
| |
| int m, m1=1, m2=1; |
| int i, n=10; |
| for(i = 2; i<n; i++){ |
| m = m1 + m2; |
| m2 = m1; |
| m1 = m; |
| } |
| printf("%d",m); |
| return 0; |
| } |
| |
| #include <stdio.h> |
| #define N 10 |
| int main(){ |
| int i,fibonacci[N] = {1,1}; |
| for(i=2; i<N; i++) |
| fibonacci[i] = fibonacci[i-1] + fibonacci[i-2]; |
| printf("第N项为:%d\n",fibonacci[N-1]); |
| i = 0; |
| while(i<N) |
| printf("%d ",fibonacci[i++]); |
| return 0; |
| } |
第N项为:55
1 1 2 3 5 8 13 21 34 55
| |
| #include <stdio.h> |
| |
| int fb(int n){ |
| if(n==1 || n==2) return 1; |
| return fb(n-1)+fb(n-2); |
| } |
| |
| int main(){ |
| for(int i=1;i<=10;i++){ |
| printf("%d ",fb(i)); |
| } |
| printf("\n第10项为:%d",fb(10)); |
| return 0; |
| } |
1 1 2 3 5 8 13 21 34 55
第10项为:55
② 前N项和
| |
| #include <stdio.h> |
| #define N 10 |
| int main(){ |
| int a[N] = {1,1},sum=2; |
| for(i=2; i<N; i++) { |
| a[i] = a[i-1] + a[i-2]; |
| sum+=a[i]; |
| } |
| printf("%d",sum); |
| return 0; |
| } |
143
| |
| #include <stdio.h> |
| int Recursion(int n){ |
| if(n==1 || n==2) return 1; |
| return Recursion(n-1)+Recursion(n-2); |
| } |
| int sum(int n){ |
| if(n==1) return 1; |
| return sum(n-1)+Recursion(n); |
| } |
| int main(){ |
| printf("%d",sum(10)); |
| return 0; |
| } |
143
3 水仙花数
“水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身。例如:1^3 + 5^3+ 3^3 = 153。"
| |
| #include <stdio.h> |
| int main(){ |
| int g,s,b; |
| for(int i =100; i<1000; i++){ |
| g = i%10; |
| s = i/10%10; |
| b = i/100%10; |
| if(g*g*g+s*s*s+b*b*b==i) printf("%d ",i); |
| } |
| return 0; |
| } |
153 370 371 407
4 最大公约数与最小公倍数
| |
| #include <stdio.h> |
| |
| int comdiv(int m,int n){ |
| if(m%n) |
| return comdiv(n,m%n); |
| return n; |
| } |
| |
| int commul(int m,int n){ |
| return m*n/comdiv(m,n); |
| } |
| int main(){ |
| printf("最大公约数: %d\n",comdiv(12,8)); |
| printf("最小公倍数: %d\n",commul(12,8)); |
| return 0; |
| } |
| |
| #include <stdio.h> |
| int main(){ |
| int m,n; |
| scanf("%d%d",&m,&n); |
| int i = m < n ? m:n; |
| for(;i>1;i--) |
| if(m%i==0&&n%i==0) break; |
| printf("最大公约数为:%d\n",i); |
| i = m > n ? m:n; |
| for(;i<m*n;i++) |
| if(i%m==0&&i%n==0) break; |
| printf("最大公倍数为:%d",i); |
| return 0; |
| } |
5 完数
完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。
如果一个数恰好等于它的真因子之和,则称该数为“完全数”。第一个完全数是6,第二个完全数是28,第三个完全数是496,后面的完全数还有8128、33550336等等。
| |
| |
| #include <stdio.h> |
| int main(){ |
| int i,j,sum=0; |
| for(i = 0; i < 10000; i++){ |
| for(j = 1; j < i; j++) |
| if(i%j==0) sum+=j; |
| if(sum==i) printf("%d ",i); |
| } |
| return 0; |
| } |
| |
| #include <stdio.h> |
| int main(){ |
| int i,j,sum; |
| for(i = 1; i < 10000; i++){ |
| sum = 0; |
| for(j = 1; j < i; j++) |
| if(i%j==0) sum+=j; |
| if(sum==i) printf("%d ",i); |
| } |
| return 0; |
| } |
6 28 496 8128
| |
| #include <stdio.h> |
| |
| int factsum(int n){ |
| int sum = 0; |
| for(int j = 1; j < n; j++) |
| if(n%j==0) sum+=j; |
| return sum; |
| } |
| |
| int main(){ |
| int i,j,sum; |
| for(i = 1; i < 10000; i++) |
| if(factsum(i)==i) printf("%d ",i); |
| return 0; |
| } |
6 N的阶乘
① 第N项
| |
| #include <stdio.h> |
| #define N 10 |
| int main(){ |
| int res=1,i; |
| for(i=1;i<=N;i++) |
| res*=i; |
| printf("%d",res); |
| return 0; |
| } |
| |
| #include <stdio.h> |
| int Recursion(int n){ |
| if(n==1) return 1; |
| return Recursion(n-1)*n; |
| } |
| int main(){ |
| printf("%d",Recursion(10)); |
| return 0; |
| } |
3628800
② 前N项
| |
| #include <stdio.h> |
| int Recursion(int n){ |
| if(n==1) return 1; |
| return Recursion(n-1)*n; |
| } |
| void print(int n){ |
| if(n) { |
| print(n-1); |
| printf("%d ",Recursion(n)); |
| } |
| } |
| int main(){ |
| print(10); |
| return 0; |
| } |
1 2 6 24 120 720 5040 40320 362880 3628800
③ 前N项和
| |
| #include <stdio.h> |
| int Recursion(int n){ |
| if(n==1) return 1; |
| return Recursion(n-1)*n; |
| } |
| int sum(int n){ |
| if(n==1) return 1; |
| return sum(n-1) + Recursion(n); |
| } |
| int main(){ |
| printf("%d",sum(10)); |
| return 0; |
| } |
4037913
7 各位值
| |
| void print(int n){ |
| if(n){ |
| print(n-1); |
| printf("%d ",n); |
| } |
| } |
1 2 3 4 5 6 7 8 9 10
| |
| #include <stdio.h> |
| |
| void interval_print(int n){ |
| if (n){ |
| interval_print(n / 10); |
| printf("%d ", n % 10); |
| } |
| } |
| int main(){ |
| interval_print(12345); |
| return 0; |
| } |
1 2 3 4 5
| |
| #include <stdio.h> |
| int number(int m,int n){ |
| if(n==1) return m%10; |
| return number(m/10,n-1); |
| } |
| int main(){ |
| printf("%d",number(54321,4)); |
| return 0; |
| } |
测试数据1: 54321,4
4
测试数据2: 347651,6
3
8 素数 / 质数
质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
| #include <stdio.h> |
| |
| int isPrime(int n){ |
| for(int i = 2; i < n; i++) |
| if(n%i==0) return 0; |
| return 1; |
| } |
| |
| int main(){ |
| for(int i = 2; i<100; i++) |
| if(isPrime(i)) printf("%d ",i); |
| return 0; |
| } |
| #include <stdio.h> |
| |
| int isPrime(int n){ |
| for(int i = 2; i < n; i++) |
| if(n%i==0) return 0; |
| return 1; |
| } |
| |
| void print(int n){ |
| if(n!=1) { |
| print(n-1); |
| if(isPrime(n)) printf("%d ",n); |
| } |
| } |
| int main(){ |
| print(100); |
| return 0; |
| } |
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
9 杨辉三角
| |
| #include <stdio.h> |
| |
| int fun(int i,int j){ |
| if(j==1||i==j) return 1; |
| return fun(i-1,j)+fun(i-1,j-1); |
| } |
| |
| void Triangle(int n){ |
| if(n) { |
| Triangle(n-1); |
| for(int i=1;i<=n;i++) |
| printf("%-5d",fun(n,i)); |
| putchar(10); |
| } |
| } |
| int main(){ |
| Triangle(10); |
| return 0; |
| } |
| |
| #include <stdio.h> |
| #define M 10 |
| int main(){ |
| int a[M]={1},b[M],i,j; |
| printf("%-5d\n",a[0]); |
| for(i = 2;i<=M;i++){ |
| if(i%2) |
| for(j = 0; j<i;j++) |
| printf("%-5d\t",j==0?(a[j]=1):(a[j]=b[j]+b[j-1])); |
| else |
| for(j = 0; j<i;j++) |
| printf("%-5d\t",j==0?(b[j]=1):(b[j]=a[j]+a[j-1])); |
| a[j] = 0; b[j] = 0; |
| putchar('\n'); |
| } |
| return 0; |
| } |
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
10 回文数
| |
| #include <stdio.h> |
| |
| int isPalindromes(int n){ |
| |
| int m = 0, nn = n, div = 1; |
| while (n / div) div *= 10; |
| do |
| { |
| div /= 10; |
| m += nn % 10 * div; |
| } while (nn /= 10); |
| printf("%d----倒置后:%d\n",n,m); |
| if (m == n) return 1; |
| else return 0; |
| } |
| int main(){ |
| printf("%d", isPalindromes(1234321)); |
| return 0; |
| } |
测试数据1: 1234321
1234321----倒置后:1234321
1
测试数据1: 12345
12345----倒置后:54321
0
| |
| #include <stdio.h> |
| |
| int isPalindromes(int n){ |
| int div1 = 1,div2 = 1; |
| int m1,m2; |
| while(n/div1/10) div1 *= 10;; |
| while(div1 > div2){ |
| m1 = n/div1%10; |
| m2 = n/div2%10; |
| printf("%d----%d\n",m1,m2); |
| if(m1!=m2) return 0; |
| div2*=10; |
| div1/=10; |
| } |
| return 1; |
| } |
| int main(){ |
| printf("%d", isPalindromes(1234321)); |
| return 0; |
| } |
测试数据1: 1234321
1----1
2----2
3----3
1
测试数据2: 12354321
1----1
2----2
3----3
5----4
0
测试数据3: 1234
1----4
0
11 进制转换
① N进制转10进制
- 由于16进制包括有abc等字符, 需使用字符串形式输入
- 原理:权值相加 , 比如8进制转10进制,如下

| |
| #include <stdio.h> |
| |
| int charToint(char c){ |
| if(c>='a') return c-87; |
| else if(c>='A') return c-55; |
| else return c-'0'; |
| } |
| |
| int numTodec(char *num, int n){ |
| int i,dec=0,k=1; |
| for(i=0; num[i+1];i++); |
| for(;i>=0;i--,k*=n) |
| dec+= k*charToint(num[i]); |
| return dec; |
| } |
| int main(){ |
| char num[20]; |
| gets(num); |
| printf("%d",numTodec(num,8)); |
| return 0; |
| } |
| |
| |
| |
| #include <stdio.h> |
| |
| int numTodec(int num, int n){ |
| int dec=0,k=1; |
| for(;num;k*=n,num/=10) dec+=num%10*k; |
| return dec; |
| } |
| int main(){ |
| int num; |
| scanf("%d",&num); |
| printf("%d",numTodec( num , 8 )); |
| return 0; |
| } |
② 10进制转N进制

| |
| #include <stdio.h> |
| |
| void decToany(int num,int n){ |
| if(num){ |
| decToany(num/n,n); |
| printf("%c", num%n + (num%n>9?55:'0') ); |
| } |
| } |
| |
| int main(){ |
| decToany(89,2); |
| return 0; |
| } |
12 数组排序
通用函数 – 交换:
| |
| void swap(int a,int b,int p[]){ |
| int temp = p[a]; |
| p[a] = p[b]; |
| p[b] = temp; |
| } |
① 冒泡排序
| #include<stdio.h> |
| int main(){ |
| int a[10]={3,2,5,8,1,9,7,4,0,6}; |
| |
| for (int i = 0; i < 10-1; i++){ |
| |
| for (int j = i+1; j <= 10; j++){ |
| if(a[i]>a[j]){ |
| int t=a[i]; |
| a[i]=a[j]; |
| a[j]=t; |
| } |
| } |
| } |
| |
| for (int i = 0; i <= 9; i++) printf("%d",a[i]); |
| return 0; |
| } |
| |
| |
| |
| |
| |
| void bubbling(int *arr,int len){ |
| |
| for(int i=0;i<len-1;i++){ |
| int var = 1; |
| |
| for(int j = 0; j< len - i - 1; j++) |
| if(arr[j]>arr[j+1]) { |
| swap(j,j+1,arr); |
| var = 0; |
| } |
| |
| if(var) break; |
| } |
| } |
② 选择排序
| #include<stdio.h> |
| int main(){ |
| int a[10]={3,2,5,8,1,9,7,4,0,6}; |
| |
| for (int i = 0; i < 10-1; i++){ |
| |
| for (int j = i+1; j <= 10; j++){ |
| if(a[i]>a[j]){ |
| int t=a[i]; |
| a[i]=a[j]; |
| a[j]=t; |
| } |
| } |
| } |
| |
| for (int i = 0; i <= 9; i++) printf("%d",a[i]); |
| return 0; |
| } |
| |
| |
| |
| |
| |
| void elect_sort(int *arr,int len){ |
| int i,j,k; |
| for(i=0;i<len;i++){ |
| k=i; |
| for(j = i + 1; j < len; j++) |
| if(arr[j]<arr[k]) k = j; |
| if(k!=i) swap(i,k,arr); |
| } |
| } |
| |
| void elect_sort_1(int *arr,int len){ |
| for(int i = 0; i < len; i++) |
| for(int j = i + 1; j < len; j++) |
| if(arr[i]>arr[j]) swap(i,j,arr); |
| } |
③ 插入排序
| |
| #include<stdio.h> |
| int main(){ |
| int a[10]={3,2,5,8,1,9,7,4,0,6}; |
| |
| for (int i = 0; i < 10; i++){ |
| |
| for (int j = i; j > 0; j--){ |
| if (a[j] < a[j - 1]) |
| { |
| int t = a[j]; |
| a[j] = a[j - 1]; |
| a[j - 1] = t; |
| } |
| } |
| } |
| |
| for (int i = 0; i <= 9; i++) printf("%d",a[i]); |
| return 0; |
| } |
| |
| |
| |
| |
| void insertt_sort(int *r, int len){ |
| int i, j, k; |
| for (i = 1; i < len; i++){ |
| if (r[i] < r[i - 1]){ |
| k = r[i]; |
| for (j = i - 1; r[j] > k && j>=0; j--) |
| r[j + 1] = r[j]; |
| r[j + 1] = k; |
| } |
| } |
| } |
13 数组反转
| |
| void swap(int *a,int *b){ |
| int temp = *a; |
| *a = *b; |
| *b = temp; |
| } |
| |
| |
| |
| |
| void reverse(int *head,int len){ |
| int *tail = head+len-1; |
| while(head<tail) |
| swap(head++,tail--); |
| } |
14 查找
① 折半查找
| |
| |
| |
| |
| |
| int Halfsearch(int *arr,int len,int num){ |
| int mid,low = 0, high = len - 1; |
| do{ |
| mid = (low + high)/2; |
| printf("\n%d---%d",low,high); |
| if(arr[mid]>num) high = mid - 1; |
| else if(arr[mid]<num) low = mid + 1; |
| else return mid; |
| }while(low <= high); |
| return -1; |
| } |
| |
| |
| |
| |
| |
| int Halfsearch(int *arr,int low,int high,int num){ |
| if(low>high) return -1; |
| int mid = (low+high)/2; |
| if(arr[mid]>num) |
| return Halfsearch(arr,low,mid-1,num); |
| else if(arr[mid]<num) |
| return Halfsearch(arr,mid+1,high,num); |
| else return mid; |
| } |
② 顺序查找
| |
| int sequential(int *arr,int len,int num){ |
| for(int i = 0; i < len; i++) |
| if(arr[i]==num) return i; |
| return -1; |
| } |
| |
| int sequential(int *arr,int len,int num){ |
| for(int i = 0; i < len; i++) |
| if(arr[i]==num) return i; |
| else if(arr[i]>num) break; |
| return -1; |
| } |
15 字符串函数
① 字符串连接
| #include <stdio.h> |
| |
| void strconcat(char *s1,char *s2){ |
| int i,j; |
| for(i = 0;s1[i];i++); |
| for(j = 0;s2[j];i++,j++) |
| s1[i] = s2[j]; |
| s1[i] = '\0'; |
| } |
| int main(){ |
| char a[100],b[100]; |
| gets(a); |
| gets(b); |
| strconcat(a,b); |
| puts(a); |
| return 0; |
| } |
② 比较字符串
| #include <stdio.h> |
| |
| int strcomp(char *s1,char *s2){ |
| for(int i=0;s1[i] || s2[i];i++) |
| if(s1[i]!=s2[i]) return s1[i]-s2[i]; |
| return 0; |
| } |
| |
| int main(){ |
| char a[100],b[100]; |
| gets(a); |
| gets(b); |
| printf("%d",strcomp(a,b)); |
| return 0; |
| } |
③ 复制字符串
| #include <stdio.h> |
| |
| void strcopy(char *s1,char *s2){ |
| int i,j; |
| for(i=0;s2[i];i++) |
| s1[i] = s2[i]; |
| s1[i] = '\0'; |
| } |
| |
| int main(){ |
| char s1[100],s2[100]; |
| gets(s2); |
| strcopy(s1,s2); |
| puts(s1); |
| } |
16 链表
① 动态链表创建
| #define LEN sizeof(Player) |
| |
| typedef struct Node{ |
| int num; |
| struct Node *next; |
| } Player; |
| |
| Player *creat(){ |
| int temp; |
| Player *head, *p1, *p2; |
| head = p1 = p2 = (Player *)malloc(LEN); |
| printf("请输入你的编号 宝儿:"); |
| scanf("%d", &temp); |
| if (!temp) return NULL; |
| p2->num = temp; |
| do |
| { |
| scanf("%d", &temp); |
| if (!temp) break; |
| p1 = (Player *)malloc(LEN); |
| p1->num = temp; |
| p2->next = p1; |
| p2 = p1; |
| } while (1); |
| p2->next = NULL; |
| return head; |
| } |
② 链表打印+返回长度
| |
| int printLinked(Player *head){ |
| int len = 0; |
| if (!head) |
| printf("这个是空表哦 亲"); |
| else { |
| Player *p = head; |
| while (p){ |
| printf("%d ", p->num); |
| p = p->next; |
| len++; |
| if(p==head) break; |
| } |
| } |
| return len; |
| } |
③ 链表删除节点
| |
| void del_linked(Player *head,Player *del){ |
| Player *p = head; |
| while(p->next!=del){ |
| p = p->next; |
| if(!p){ |
| printf("\n找不到你要删除的节点呢 亲"); |
| return; |
| } |
| } |
| p->next = del->next; |
| } |
| |
| void del_linked(Player *del){ |
| Player *p = del; |
| while(p->next!=del) |
| p = p->next; |
| p->next = del->next; |
| } |
④ 链表插入
| |
| void insert(Player* head,Player *add,int n){ |
| if(n<1) {printf("非法操作!");return;} |
| if(n>linklegth(head)) n = linklegth(head); |
| Player * p = head; |
| while(--n) |
| p=p->next; |
| add->next = p->next; |
| p->next = add; |
| } |
17 求方程近似解
① 二分法
| #include <stdio.h> |
| #include <math.h> |
| double func(double n){ |
| return 2 * pow(n, 3) - 4 * pow(n, 2) + 3 * n - 6; |
| } |
| |
| double Solution(double low, double high){ |
| double mid, fm; |
| mid = (low + high) / 2; |
| fm = func(mid); |
| |
| if (fm == 0 || (high - low) < 1e-5) |
| return mid; |
| else if (fm < 0) |
| return Solution(mid, high); |
| else if (fm > 0) |
| return Solution(low, mid); |
| } |
| int main(){ |
| printf("%.2f", Solution(-10, 10)); |
| return 0; |
| } |
② 牛顿迭代法

| #include<stdio.h> |
| #include<math.h> |
| double func(double x){ |
| return 2*x*x*x-4*x*x+3*x-6.0; |
| } |
| double func1(double x){ |
| return 6*x*x-8*x+3; |
| } |
| int Newton(double *x,double precision,int maxcyc){ |
| double x1,x0; |
| int k; |
| x0=*x; |
| for(k=0;k<maxcyc;k++){ |
| if(func1(x0)==0.0){ |
| printf("迭代过程中导数为0!\n"); |
| return 0; |
| } |
| x1=x0-func(x0)/func1(x0); |
| if(fabs(x1-x0)<precision || fabs(func(x1))<precision){ |
| *x=x1; |
| printf("该值附近的根为:%lf\n",*x); |
| return 1; |
| } |
| else |
| x0=x1; |
| } |
| printf("迭代次数超过预期!\n"); |
| return 0; |
| } |
| |
| int main(){ |
| double x,precision; |
| int maxcyc; |
| printf("输入初始迭代值x0:"); |
| scanf("%lf",&x); |
| printf("输入最大迭代次数:"); |
| scanf("%d",&maxcyc); |
| printf("迭代要求的精度:"); |
| scanf("%lf",&precision); |
| if(Newton(&x,precision,maxcyc)==1) |
| ; |
| else |
| printf("迭代失败!\n"); |
| return 0; |
| } |
18 求最大值
① 输入三个数abc,输出其中最大值
| #include <stdio.h> |
| int main() |
| { |
| int a, b, c; |
| scanf("%d,%d,%d", &a, &b, &c); |
| if (a >= b && a >= c) |
| printf("max=%d", a); |
| else if (b >= a && b >= c) |
| printf("max=%d", b); |
| else if (c >= a && c >= b) |
| printf("max=%d", c); |
| return 0; |
| } |
②求出n个数字的最大值
| #include<stdio.h> |
| |
| int main() |
| { |
| int x,max,n; |
| scanf("%d",&n); |
| scanf("%d",&x); |
| max=x; |
| for(int i=0;i<n-1;i++) |
| { |
| scanf("%d",&x); |
| if(max<x) |
| max=x; |
| } |
| printf("%d",max); |
| return 0; |
| } |
19 打印图形
①打印菱形
| #include<stdio.h> |
| |
| int main() |
| { |
| int m=3,n=1; |
| for (int i = 0; i < 7; i++) |
| { |
| for (int i = 0; i < m; i++) |
| { |
| printf(" "); |
| } |
| i<3?m--:m++; |
| for (int j = 0; j < n; j++) |
| { |
| printf("%c",'*'); |
| } |
| n=i<3?n+2:n-2; |
| printf("\n"); |
| } |
| return 0; |
| } |
测试相关函数
| |
| #include <stdio.h> |
| int main(){ |
| |
| return 0; |
| } |
随机生成数组
| #include <time.h> |
| |
| void srand(unsigned seed); |
| int rand(void); |
| |
| void getArr(int *a,int l){ |
| int i=0; |
| srand(time(NULL)); |
| printf("\n你生成的数组为:"); |
| while (i < l) printf("%d,",a[i++] = rand()%(2*l+1)); |
| } |
打印数组
| void print_arr(int *a,int len){ |
| printf("\n数组为:"); |
| while(len--) printf("%d,",*a++); |
| } |
折半查找 测试案例
| |
| #include <stdio.h> |
| #include <time.h> |
| |
| void srand(unsigned seed); |
| int rand(void); |
| |
| void getArr(int *a,int l){ |
| int i=0; |
| srand(time(NULL)); |
| printf("你生成的数组为:"); |
| while (i < l) printf("%d,",a[i++] = rand()%(2*l+1)); |
| } |
| |
| void swap(int a,int b,int p[]){ |
| int temp = p[a]; |
| p[a] = p[b]; |
| p[b] = temp; |
| } |
| |
| |
| |
| void insertt_sort(int *r, int len){ |
| int i, j, k; |
| for (i = 1; i < len; i++){ |
| if (r[i] < r[i - 1]){ |
| k = r[i]; |
| for (j = i - 1; r[j] > k && j>=0; j--) |
| r[j + 1] = r[j]; |
| r[j + 1] = k; |
| } |
| } |
| } |
| |
| |
| |
| |
| int Halfsearch(int *arr,int len,int num){ |
| int mid,low = 0, high = len - 1; |
| do{ |
| mid = (low + high)/2; |
| printf("\n%d---%d",low,high); |
| if(arr[mid]>num) high = mid - 1; |
| else if(arr[mid]<num) low = mid + 1; |
| else return mid; |
| }while(low <= high); |
| return -1; |
| } |
| void print(int *a,int len){ |
| printf("\n数组为:"); |
| while(len--) printf("%4d",*a++); |
| } |
| int main(){ |
| int arr[10]; |
| getArr(arr,10); |
| insertt_sort(arr,10); |
| print(arr,10); |
| printf("\n%d",Halfsearch(arr,10,8)); |
| return 0; |
| } |
数组反转 测试
| #include <stdio.h> |
| #include <time.h> |
| |
| void srand(unsigned seed); |
| int rand(void); |
| |
| void getArr(int *a,int l){ |
| int i=0; |
| srand(time(NULL)); |
| printf("\n你生成的数组为:"); |
| while (i < l) printf("%d,",a[i++] = rand()%(2*l+1)); |
| } |
| |
| void swap(int *a,int *b){ |
| int temp = *a; |
| *a = *b; |
| *b = temp; |
| } |
| |
| void reverse(int *head,int len){ |
| int *tail = head+len-1; |
| while(head<tail) |
| swap(head++,tail--); |
| } |
| |
| void print_arr(int *a,int len){ |
| printf("\n数组为:"); |
| while(len--) printf("%d,",*a++); |
| } |
| int main(){ |
| int arr[10]; |
| getArr(arr,10); |
| reverse(arr,10); |
| print_arr(arr,10); |
| return 0; |
| } |
你生成的数组为:18,12,0,7,1,19,11,3,13,0,
数组为:0,13,3,11,19,1,7,0,12,18,
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了