1.奇偶交换排序算法
举例:待排数组[6 2 4 1 5 9]
第一次比较奇数列,奇数列与它的邻居偶数列比较,如6和2比,4和1比,5和9比
[6 2 4 1 5 9]
交换后变成
[2 6 1 4 5 9]
第二次比较偶数列,即6和1比,5和5比
[2 6 1 4 5 9]
交换后变成
[2 1 6 4 5 9]
第三趟又是奇数列,选择的是2,6,5分别与它们的邻居列比较
[2 1 6 4 5 9]
交换后
[1 2 4 6 5 9]
第四趟偶数列
[1 2 4 6 5 9]
一次交换
[1 2 4 5 6 9]
以下表现其单处理器算法,类似冒泡排序,较为简单但效率并不特别高。
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
void swap(int *a, int *b)
{
int t;
t = *a;
*a = *b;
*b = t;
}
void printArray(int a[], int count)
{
int i;
for(i = 0; i < count; i++)
printf("%d ",a[i]);
printf("\n");
}
void Odd_even_sort(int a[], int size)
{
bool sorted = false;
while(!sorted)
{
sorted = true;
for(int i = 1; i < size - 1; i += 2)
{
if(a[i] > a[i + 1])
{
swap(&a[i], &a[i + 1]);
sorted = false;
}
}
for(int i = 0; i < size - 1; i += 2)
{
if(a[i] > a[i + 1])
{
swap(&a[i], &a[i+1]);
sorted = false;
}
}
}
}
int main(void)
{
int a[] = {3, 5, 1, 6, 9, 7, 8, 0, 11};
int n = sizeof(a) / sizeof(*a);
Odd_even_sort(a, n);
printArray(a, n);
return 0;
}
2.设圆半径r=1.5,圆柱高h=3
// 设圆半径r = 1.5,圆柱高h = 3,求圆周长,圆面积,圆球表面积,圆球体积,圆柱表面积,圆柱体积
// 要求:用scanf输入数据,取小数点后两位
#include <stdio.h>
int main()
{
float r,h;
float c,s,sq,vq,sv,vz;
float pai = 3.1415926;
printf("请输入圆半径:");
scanf("%f",&r);
printf("请输入圆柱高:");
scanf("%f",&h);
c = 2 * pai * r;
s = pai * r * r;
sq = 4 * pai * r * r;
vq = ( 4 / 3 ) * pai * r * r * r;
sz = 2*s+c*h;
vz = s * h;
printf("圆周长是:%4.2f\n",c);
printf("圆面积是:%4.2f\n",s);
printf("圆球表面积是:%4.2f\n",sq);
printf("圆球体积是:%4.2f\n",vq);
printf("圆柱表面积是:%4.2f\n",sz);
printf("圆柱体积是:%4.2f\n",vz);
return 0;
}
3.有一个分数序列2/1,3/2,5/3,8/5,13/8,21/13,···求出这个数列的前20项和。
看到分数,变量类型要用浮点型,格式化输出也要用相对应的输出符号
首先,找出这串数字的规律
1 2 3 5 8 13 21···
将数字这样展开并去掉重复的数字之后,很容易可以看出,从第三项开始,当前项等于前两项之和(和斐波那契数列有点像,所以借用斐波那契数列的思路)。
(以前3个数字1,2,3为例)
(1)计算当前分数<2/1>的值
(2)将当前数字<3>的前一个<2>的前一个数字<1>先存放在tmp<tmp=1>中
(3)将当前数字<3>的前一个<2>赋值给下一个分数<3/2>的分子< i >
(4)然后将前两个数字<1>、<2>的和<3>赋值给下一个分数< 3/2 >的分母< j >
(5)计算前n项的和
将以上内容放在一个循环中,循环20次,也就是计算出前20项的和。
#include<stdio.h>
int main(){
double i = 1.0, j = 2.0;
int n,count = 0;
double sum = 0;
printf("请输入n的值:");
scanf("%d",&n);
while (count < n){
double ret = j / i;//保存当前项的结果
double tmp = i;
i = j;
j = tmp + j;
sum += ret;//前n项的累加和
count++;
}
printf("sum=%lf", sum);
return 0;
}
4.用指针作为函数形参,完成三个数的排序
#include<stdio.h>
int sort(int *a,int *b,int *c)
{
int d;
if(*a>*b){
d=*a;*a=*b;*b=d;
}
if(*a>*c){
d=*a;*a=*c;*c=d;
}
if(*b>*c){
d=*b;*b=*c;*c=d;
}
}
void main(){
int a,b,c,*x,*y,*z;
printf("输入3个整数:");
scanf("%d,%d,%d",&a,&b,&c);
x=&a;
y=&b;
z=&c;
sort(x,y,z);
printf("这个三个数从小到大排列是:%d,%d,%d\n",a,b,c);
}