算法第一周:
第一个问题:
对于第一个问题,我自己首先想到的是用九重循环,加一个条件及一个判断,然后就可以输出,以下是我的代码:
test1.cpp
#include <stdio.h>
int main(){
int a,b,c,d,e,f,g,h,i;
for(a=1;a<10;a++)
for(b=1;b<10;b++)
for(c=1;c<10;c++)
for(d=1;d<10;d++)
for(e=1;e<10;e++)
for(f=1;f<10;f++)
for(g=1;g<10;g++)
for(h=1;h<10;h++)
for(i=1;i<10;i++)
{
if(a==b||a==c||a==d||a==e||a==f||a==g||a==h||a==i
||b==c||b==d||b==e||b==f||b==g||b==h||b==i
||c==d||c==e||c==f||c==g||c==h||c==i||d==e
||d==f||d==g||d==h||d==i||e==f||e==g||e==h
||e==i||f==g||f==h||f==i||g==h||g==i||h==i)
continue;
else{
if((a*100+b*10+c)*2==d*100+e*10+f&&(a*100+b*10+c)*3==g*100+h*10+i)
printf("%d %d %d\n",a*100+b*10+c,d*100+e*10+f,g*100+h*10+i);
else
continue;
}
}
return 0;
}
第二个问题:
第二个问题,我是想着用一个do while循环做的;就是先用一个数组b[],把每次算出来的和f赋值到数组中,然后每运算一次,就j++;由于最后一次还要输入0 0,所以j一开始是-1;以下是代码:
test2.cpp
#include<stdio.h>
int main(){
long n,m,t;
int i;
int j=-1;
double b[100]={0};
int k=0;
double f=0;
do{
j++;
scanf("%ld %ld",&n,&m);
if(n>m){
t=n;
n=m;
m=t;
}
for(i=n;i<=m;i++){
f +=1.0/i/i;
}
b[k++]=f;
f=0;
}while(m!=0 && n!=0 && m <= 1000000);
for(i=0;i<j;i++)
printf("Case %d: %.5lf\n",i+1,b[i]);
return 0;
}
对于冒泡排序,就是一趟一趟的比较两个相邻的数的大小,然后按照要求交换位置,最后输出,以下是代码:
test3.cpp
#include<stdio.h>
int main(){
int x[100];
int i,j,t,n;
printf("请输入n:");
scanf("%d",&n);
printf("请输入n个数:\n");
for(i=0;i<n;i++)
scanf("%d",&x[i]);
for(i=1;i<=n-1;i++)
for(j=i;j<n-i;j++)
if(x[j]>x[j+1]){
t=x[j];
x[j+1]=x[j];
x[j]=t;
}
printf("排序结果:\n");
for(i=0;i<n;i++){
printf("%d\n",x[i]);
if(i!=n-1)
printf(" ");
}
return 0;
}
选择排序和冒泡排序的不同之处在于,选择排序是一趟一趟的选择最小的数或最大的数排,也就是说,首先从所有数中选出最小或最大的数和第一个位置上的数交换,这样第一趟就结束了,第二趟就是从剩下的数中选出最大或最小的和第二位比较,交换,依次类推.以下是代码:
test4.cpp
#include<stdio.h>
int main(){
int x[100];
int i,j,t,n,min;
printf("请输入n:");
scanf("%d",&n);
printf("请输入n个数:\n");
for(i=0;i<n;i++)
scanf("%d",&x[i]);
for(i=0;i<n-1;i++){
min=i;
for(j=i+1;j<n;j++)
if(x[min]>x[j])
min=j;
if(i!=min){
t=x[i];
x[i]=x[min];
x[min]=t;
}
}
for(i=0;i<n;i++){
printf("%d",x[i]);
if(i != n-1)
printf(" ");
}
return 0;
}
第五个问题:
插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中.代码如下:
test5.cpp
#include<stdio.h>
#define M 10
void Insert(int a[])
{
int i;
for(i=0;i<M;i++)
scanf("%d",&a[i]);
}
void Sort(int a[]){
int i,j,x;
for(i=0;i<M;i++){
x=a[i];
j=i-1;
while(j>=0 && x<a[j]){
a[j+1]=a[j];
j--;
}
a[j+1]=x;
}
for(i=0;i<M;i++){
printf("%d",a[i]);
if(i != M-1)
printf(" ");
}
}
int main()
{
int a[M];
Insert(a);
Sort(a);
return 0;
}