C语言实现选择排序算法
实现过程
第一个 for 循环是确定位置的,该位置是存放每次从待排序数列中经选择和交换后所选出的最小数。第二个 for 循环是实现将确定位置上的数与后面待排序区间中的数进行比较的。
代码
#include <stdio.h>
int main(){
int i,j,t,a[11]; //定义变量及数组为基本整型
printf("请输入10个数:\n");
for(i=1;i<11;i++)
scanf("%d",&a[i]); //从键盘中输入要排序的10个数字
for(i=1;i<=9;i++)
for (j=i+1;j<=10;j++)
if(a[i]>a[j]) //如果前一个数比后一个数大,则利用中间变量t实现两值互换
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
printf("排序后的顺序是:\n");
for(i=1;i<=10;i++)
printf("%5d", a[i]); //输出排序后的数组
printf("\n");
return 0;
}
C语言实现冒泡排序算法
实现过程
通过两个for循环实现冒泡排序的全过程,外层for循环决定冒泡排序的趟数,内层for循环决定每趟所进行两两比较的次数。
代码
#include <stdio.h>
int main()
{
int i,j,t,a[11]; //定义变量及数组为基本整型
printf("Input 10 nums:\n");
for(i=1;i<11;i++) //从键盘中输入10个整数
scanf("%d",&a[i]);
for(i=1;i<10;i++) //变量i代表比较的趟数
for(j=1;j<11-i;j++) //变量j代表每趟两两比较的次数
if(a[j]>a[j+1]){ //两两比较,如果前者大于后者利用中间变量t进行交换
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
printf("pai xu hou is:\n");
for(i=1;i<=10;i++)
printf("%5d",a[i]); //将冒泡排序后的顺序输出
printf("\n");
return 0;
}
求某一范围内的完数
如果一个数等于它的因子之和,则称该数为“完数”(或“完全数”)。例如,6的因子为1、2、3,而 6=1+2+3,因此6是“完数”。
问题分析
根据完数的定义,解决本题的关键是计算出所选取的整数i(i的取值范围不固定)的因子(因子就是所有可以整除这个数的数),将各因子累加到变量sum (记录所有因子之和),若sum等于i,则可确认i为完数,反之则不是完数。
代码
#include <stdio.h>
int main()
{
int i,j,sum,num; /*变量i控制选定数范围,j控制除数范围,s记录累加因子之和*/
printf("请输入所选范围上限:\n");
scanf("%d",&num); /* num的值由键盘输入*/
for(i=2;i<=num;i++){
sum=0; /*保证每次循环时sum的初值为0*/
for(j=1;j<i;j++){
if(i%j==0) /*判断j是否为i的因子*/
sum+=j;
}
if(sum==i) /*判断因子这和是否和原数相等*/
printf("%d is a perfect number!\n",i);
}
return 0;
}
求最大公约数
问题分析
如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数。几个自然数公有的约数,叫做这几个自然数的公约数。公约数中最大的一个公约数,称为这几个自然数的最大公约数。
根据约数的定义可知,某个数的所有约数必不大于这个数本身,几个自然数的最大公约数必不大于其中任何一个数。要求任意两个正整数的最大公约数即求出一个不大于其中两者中的任何一个,但又能同时整除两个整数的最大自然数。
代码
#include <stdio.h>
int main()
{
int m,n,temp,i;
scanf("%d%d",&m,&n);
if(m<n){
temp=m;
m=n;
n=temp;
}
for(i=n;i>0;i--){
if(m%i==0&&n%i==0){
printf("%d,%d,%d",m,n,i);
break;
}
}
return 0;
}
求最小公倍数
问题分析
最小公倍数,如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数,对于两个整数来说,指该两数共有倍数中最小的一个。计算最小公倍数时,通常会借助最大公约数来辅助计算。
最小公倍数=两数的乘积/最大公约(因)数,解题时要避免和最大公约(因)数问题混淆。
对于最小公倍数的求解,除了利用最大公约数外,还可根据定义进行算法设计。要求任意两个正整数的最小公倍数即,求出一个最小的能同时被两整数整除的自然数。
//方式一:a*b/最大公因数
#include <stdio.h>
int main()
{
int m,n,temp,i,LCM;
scanf("%d%d",&m,&n);
if(m<n){
temp=m;
m=n;
n=temp;
}
for(i=n;i>0;i--){
if(m%i==0&&n%i==0){
printf("%d,%d,%d",m,n,i);
break;
}
}
LCM=m*n/i;
printf("\n%d",LCM);
return 0;
}
//方法二:穷举法
#include <stdio.h>
int main()
{
int m,n,temp,i,LCM;
scanf("%d%d",&m,&n);
if(m<n){
temp=m;
m=n;
n=temp;
}
for(i=m;i>0;i++){
if(i%m==0&&i%n==0){
printf("%d,%d,%d",m,n,i);
break;
}
}
return 0;
}
百钱买百鸡
我国古代数学家张丘建在《算经》一书中曾提出过著名的“百钱买百鸡”问题,该问题叙述如下:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何?
翻译过来,意思是公鸡一个五块钱,母鸡一个三块钱,小鸡三个一块钱,现在要用一百块钱买一百只鸡,问公鸡、母鸡、小鸡各多少只?
题目分析
如果用数学的方法解决百钱买百鸡问题,可将该问题抽象成方程式组。设公鸡 x 只,母鸡 y 只,小鸡 z 只,得到以下方程式组:
{
5
x
+
3
y
+
1
3
z
=
100
x
+
y
+
z
=
100
0
≤
x
≤
100
0
≤
y
≤
100
0
≤
z
≤
100
\begin{cases} 5x+3y+\frac13z = 100\\ x+y+z = 100\\ 0 ≤ x ≤ 100\\ 0 ≤ y ≤ 100\\ 0 ≤ z ≤ 100 \end{cases}
⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧5x+3y+31z=100x+y+z=1000≤x≤1000≤y≤1000≤z≤100
代码
#include <stdio.h>
int main(){
int i, j, k;
printf("百元买百鸡的问题所有可能的解如下:\n");
for( i=0; i <= 100; i++ )
for( j=0; j <= 100; j++ )
for( k=0; k <= 100; k++ ){
if( 5*i+3*j+k/3==100 && k%3==0 && i+j+k==100 ){
printf("公鸡 %d 只,母鸡 %d 只,小鸡 %d 只\n", i, j, k);
}
}
return 0;
}
求π的近似值
编写一个主函数,功能是用PI/4≈1-1/3+1/5-1/7+…公式求π(PI)的近似值,直到某一项的绝对值小于10的-6次幂为止,并输出PI的值。
代码
#include <stdio.h>
#include <math.h>
main(){
int s;
float n,t,pi;
t=1;pi=0;n=1.0;s=1;
while(fabs(t)>1e-6){ /*通过fabs()函数求双精度浮点数的绝对值,并和10的-6次幂比较*/
pi=pi+t;
n=n+2; /*分母数值变换*/
s=-s; /*控制每一项的符号,正负交替*/
t=s/n;
}
pi=pi*4;
printf("pi=%10.6f",pi);
}
输出数阵
编程输出如下数阵,行数n从键盘输入
n
行
{
1
12
123
1234
…
…
…
…
…
…
…
1234
…
…
…
…
…
…
n
n行\begin{cases} 1\\ 1 2\\ 1 2 3\\ 1 2 3 4\\ …………………\\ 1 2 3 4 ………………n\\ \end{cases}
n行⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎧1121231234…………………1234………………n
代码
#include <stdio.h>
int main(){
int i,j,n;
scanf("%d",&n);
for(i=1;i<=n;i++){
for(j=1;j<=i;j++)
printf("%4d",j);
printf("\n");
}
return 0;
}
指针练习
编写程序,输入一个字符串,利用指针逆序输出该字符串。
#include <stdio.h>
int main(){
char a[100],*p=a;
gets(a);
while(*p!='\0')
p++;
while(--p>=a)
putchar(*p);
putchar('\n');
return 0;
}