函数 数组方面的练习

哥德巴赫猜想

#include <stdio.h>
#include <math.h>
 
int number;
int Firstnum;
int Secondnum;
 
int  main()
{
	int x,y;
	int Temp;
	printf("Please input Number\n");
	scanf("%d",&number);
	for(x=2;x<=number/2;x++)//遍历一半数
	{
		Firstnum =x;//确定第一个数
		Temp =sqrt(Firstnum)+1;
		for(y=2;y<Temp;y++)//遍历,判断是否素数,这需要一个循环来实现
		{
			if(Firstnum % y == 0 )
			{
				Firstnum = 0;//为什么要给0,因为要用它来作判断条件,这不是个嵌套循环
				break;
           
			}
		}
			
		Secondnum=number-x;//确定第二个数
		   Temp=sqrt(Secondnum)+1;
		 for(y=2;y<Temp;y++)//同上一个一模一样,遍历判断素数
		{
			if(Secondnum % y == 0)
			{
				Secondnum = 0;//控制条件,有一个就结束循环
				break;
             }
        }
		
		  if(Firstnum&&Secondnum)
			printf("%d = %d + %d\r\n",number,Firstnum,Secondnum);
		
	}
	return 0;
}

/*先分解成c=a+b;在依次对a和b进行判断是否是质数,如果同时是质数,就打印。 
这一点太关键了  只要一个数是素数,拿原数减就行了,如果减下来的数是素数,则输出,如果不是则下一个
一个数是否是质数,就是一个数只能被1和它自身整除,没有其他因子。就需要尝试它能否被从2到它的平方根之间的数整除。
整个算法思想都是基于此  
*/

这道题的思想就是先把所有数表示出来,再看是不是素数,是素数就输出。

求最大公约数和最小公倍数

#include  <stdio.h>
int f1(int a,int b)//计算最大公约数
{
    int c;
    c=a%b;
    while(c!=0)
    {
        a=b;
        b=c;
        c=a%b;
    }
    return b;//返回的是b的值,c是判断条件
}

int f2(int a,int b)//计算最小公倍数
{
 int c,z;
 z=f1(a,b);
 c=a*b/z;//最小公倍数就是除去最大公约数再相乘
 return c;
}


int main()
{
    int a,b;
    scanf("%d %d",&a,&b);
    printf("%d %d\n",f1(a,b),f2(a,b));
    return 0;
}

这个就是熟悉欧几里得辗转相除法

#include <stdio.h>//这个界限问题可以百度一下
void f1(int a)
{
    int b,c,t,h;
    t=a;
    a=a%60;
    b=(t-a)/60;
    h=b;
    b=b%60;
    c=(h-b)/60;
    printf("%d时:%d分:%d秒\n",c,b,a);
}
int main()
{
    double x;
    scanf("%lf",&x);
    f1(x);
    return 0;
}

一元二次方程求根问题

​
#include <stdio.h>
#include<math.h>
double f1(double a,double b,double c)//b*b-4*a*c>0情况
{
    double t1,t2,h;
    h=sqrt(b*b-4*a*c);
    t1=(-b+h)/(2*a);
    t2=(-b-h)/(2*a);
    printf("方程的根为%.2lf和%.2lf\n",t1,t2);
}

double f2(double a,double b,double c)//b*b-4*a*c=0情况
{
    double t;
    t=-b/(2*a);
    printf("方程的根唯一,为%.2lf\n",t);
}

double f3(double a,double b,double c)//b*b-4*a*c<0情况
{
 
  printf("在实数区域内无解\n");
    
}

int main()
{
    double a,b,c;
    scanf("%lf %lf %lf",&a,&b,&c);
    if(b*b-4*a*c>0)
    f1(a,b,c);
    else if(b*b-4*a*c==0)
    f2(a,b,c);
    else
    f3(a,b,c);
    return 0;
}

​

找完全平方数

#include <stdio.h>//找完全平方数
int main()
{
    long int i,j,k;
    for(i=-99;i<=84*84;i++)//遍历数,找这个原数
    {
        for(j=0;j<84;j++)//找出每个j的平方
        if(i+100==j*j) //判断i+100
        {
            for(k=j;k<1000;k++)//判断i+268,
            {
            if(i+268==k*k)
            printf("%ld\n",i);
            }
        }
    }
    return 0;
}

二分法

#include <stdio.h>
 int sort(int a[],int n)//排序函数
 {
     int temp,j,i;
     for(i=0;i<n-1;i++)//第一个开始比较,n-1轮,到数组倒数第二个结束
     for(j=0;j<n-1-i;j++)//i每进行一轮,最大的那个就到最底下,那么每一次比较的数就要-1,所以是j<n-1-i
                         //一次j循环只交换两个数,一次i周期内的循环,就是从前一个数和后一个数交换,不断下移,故为冒泡
      {
         if(a[j]>a[j+1])
       {
         temp=a[j];
        a[j]=a[j+1];
        a[j+1]=temp;//把最大的放到下面
       }
      }
 }

 int main()
 {
  int s[40];
  int n;
  printf("Input numbers:\n");
  scanf("%d",&n);
  int t;
  for(t=0;t<n;t++)//对数组初始化
  {
      scanf("%d",&s[t]);
  }
  sort(s,10);//排序,数组名做参数,地址传递,可以更改
  int x;
  printf("Please input x:\n");//输入要找的数
  scanf("%d",&x);
  int d,h,i,m;
  d=0,h=9;//给底部变量和顶部变量赋初值
  while(d<=h)
  {
      m=(d+h)/2;
      if(x==s[m])
      break;
      else if(x>s[m])
      d=m+1;//上边界更改,缩小一半范围
      else if(x<s[m])
      h=m-1;//下边界更改,缩小一半范围
  }
  if(d<=h)//说明存在,因为满足条件就可以继续找,找到就能出来,找不到的话满足不了条件才会出来
   printf("The %d is in the %d place\n",x,m);
   else
   printf("Can not find the %d\n",x);
   return 0;
 }

方阵移动

#include <stdio.h>
int main()
{
    int i,j;
    int a[11][11]={0};
    int b[11][11]={0};
    int n;
    scanf("%d",&n);
    int k;
    k=1;
    for(i=0;i<n;i++)//初始化数组
   {
       for(j=0;j<n;j++)//对每一行开始赋值
       {
           a[i][j]=k;//赋值只在内循环里,因为内循环确定了位置
           k++;
       }
   }
    int m;
    scanf("%d",&m);
    m=m%n;//就是类似于周期2k派的意思,取余数直接算最小周期内
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        { 
          if(j+m<n)//越界就分类讨论呗,列一个实际数组找规律就清楚了
          b[i][j+m]=a[i][j];//越界问题,保存数据问题,保存数据可以通过新建一个数组解决
          else
          b[i][j+m-n]=a[i][j];
        }
    }
    for(i=0;i<n;i++)//输出数组
  {
      for(j=0;j<n;j++)
      {
          printf("%4d  ",b[i][j]);
      }
      printf("\n");
  }

   }

计算天数

#include <stdio.h>
int main()
{
 //31 28/29 31 30 31 30 31 31 30 31 30 31
 //想法是先判断年,分为闰年和非闰年情况
 //再根据月来计算,可以用个for循环
 //最后加上天数

//数组的话,存放天数?
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//初始化注意格式
int year,month,day,i,sum;
sum=0;
scanf("%d/%d/%d",&year,&month,&day);

if(year%4==0&&year%100!=0||year%400==0)
{
    a[2]=29;
}

for(i=0;i<month;i++)
{
  sum=a[i]+sum;
}
sum=sum+day;

printf("%d\n",sum);

return 0;
}

矩阵运算

#include <stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    int i,j;
    int a[15][15];
    for(i=0;i<n;i++)//输入 初始化等工作
    {
        for(j=0;j<n;j++)
        {
            scanf("%d",&a[i][j]);
            
        }
     
    
    }

    
    //就是计算了,副对角线上元素的数学特征找出来就行了i+j=n-1
   int sum;
    sum=0;
  for(i=0;i<n;i++)//
        for(j=0;j<n;j++)
        {
            if(i+j!=n-1&&i!=n-1&&j!=n-1)//注意是逻辑且,满足不在副对角线且不在最后一行和最后一列
            
                sum=sum+a[i][j];
            
            
          }
 printf("%d",sum);
 return 0;
} 

冒泡排序

#include <stdio.h>
int main()
{
    int score[40];
    int i,n;
    printf("input number:\n");
    scanf("%d",&n);//输入数字
    printf("input score:\n");
    for(i=0;i<n;i++)
    {
        scanf("%d",&score[i]);
    }
    //初始化数组
    int temp,j;
     for(i=0;i<n-1;i++)//第一个开始比较,n-1轮,到数组倒数第二个结束
     for(j=0;j<n-1-i;j++)//i每进行一轮,最大的那个就到最底下,那么每一次比较的数就要-1,所以是j<n-1-i
                         //一次j循环只交换两个数,一次i周期内的循环,就是从前一个数和后一个数交换,不断下移,故为冒泡
      {
         if(score[j]>score[j+1])
       {
         temp=score[j];
        score[j]=score[j+1];
        score[j+1]=temp;//把最大的放到下面
       }
      }
      printf("Output score:\n");
      for(i=0;i<n;i++)
      {
          printf("%-3d",score[i]);//遍历输出
      }
      return 0;

}
//总结冒泡归根到底就是把每一次循环把最大的数放到最底下,只不过内循环是通过前一个数与后一个数比较,直到后一个数到了最大的数的前一个数为止
//内循环每次都从0开始,0与1比,1与2比,这就是我不熟悉的地方

魔方阵

#include <stdio.h>
int main()
{

   int n;
   printf("Input number:\n");
   scanf("%d",&n);
   int a[11][11]={0};
    //初始化
    int i,j,i1,j1;
   j=n/2;
   i=0;
   a[i][j]=1;
   int k;
   for(k=2;k<=n*n;k++)//遍历的其实不是位置,而是将数值遍历赋给对应位置,里面就是位置参数的运算
   { 

     i1=i;
     j1=j;//保护变量,算法给你的是判断前一个数的行列,如果是两种特殊情况,固定。如果不是就是通常算法
     i--;
     j++; //行减1,列加1
     if(i1==0)//判断上一个行数
      i=n-1;
     if(j1==n-1)//判断上一个列数
      j=0;
     if(a[i][j]!=0)//已被赋值
     {
        i=i1+1;
        j=j1;//注意是原来的位置,i,j都要复原
       a[i][j]=k;    
     }
     a[i][j]=k;
    }
  for(i=0;i<n;i++)//输出魔方阵
  {
      for(j=0;j<n;j++)
      {
          printf("%4d ",a[i][j]);
      }
      printf("\n");
  }
  return 0;

}
//数组数与输出的几行几列不影响,你可以通过不打印来使其他0不输出,而且给数组初始化必须是确定的数组
//因为用到0判断,所以必须初始化

求矩阵各元素之和

#include <stdio.h>
int main()
{
    int m,n;
    scanf("%d %d",&m,&n);
    int a[8][8];
    int i,j;
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        scanf("%d",&a[i][j]);
    }
    int sum;
    for(i=0;i<m;i++)
    {   sum=0;
        for(j=0;j<n;j++)
        {
         sum=sum+a[i][j];
        }
        printf("%d\n",sum);
    
    }
    return 0;
}

筛选法找素数

#include <stdio.h>
int main()
{
    int a[1001];//1001个数
    a[0]=0;
    int i;
    for(i=1;i<1001;i++)//初始化赋值
    {
        a[i]=i;
    }
    a[1]=0;
    int j;
    for(i=2;i<1000;i++)//i不能取1000,不然会使j越界,这个就是遍历挖,比方说i=2,就把2的所有倍数都挖了
    {
        if(a[i]!=0)//是0就不要挖了,直接下一个
        for(j=2*i;j<=1000;j++)//遍历挖倍数,从2*i开始和i+1开始差不多
        if(a[j]!=0)//不是0才可以除
        if(a[j]%a[i]==0)//能整除说明不是素数,挖掉
        a[j]=0;
    }
    a[1000]=0;
    for(i=0;i<1001;i++)
    {
        printf("%d ",a[i]);
    }
}

删除最大数

#include <stdio.h>
int main()
{
    int a[10];
    int i;
    for(i=0;i<10;i++)
    {
        scanf("%d",&a[i]);
    }//初始化
    int max,k;
    max=a[0];
    for(i=1;i<10;i++)//找最大值
    {
        if(a[i]>max)
        {
            k=i;
            max=a[k];
        }
    }
    for(i=k;i<9;i++)
    a[i]=a[i+1];//每个从k提前一个
    a[9]=0;
    for(i=0;i<10;i++)//输出
    {
        printf("%d  ",a[i]);
    }
}

数组逆序

#include <stdio.h>
int main()
{
    int a[10];
    int i;
    for(i=0;i<10;i++)
    {
        scanf("%d",&a[i]);
    }//初始化
    int max,k;
    max=a[0];
    for(i=1;i<10;i++)//找最大值
    {
        if(a[i]>max)
        {
            k=i;
            max=a[k];
        }
    }
    for(i=k;i<9;i++)
    a[i]=a[i+1];//每个从k提前一个
    a[9]=0;
    for(i=0;i<10;i++)//输出
    {
        printf("%d  ",a[i]);
    }
}

行列互换

#include <stdio.h>
int main()
{   int m ,n;
    scanf("%d %d",&m,&n);
    int a[m][n];
    int b[n][m];
    int i,j;
    for(i=0;i<m;i++)//初始化二维数组,先固定行,再遍历列
    {
        for(j=0;j<n;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    for(j=0;j<n;j++)//行列互换,b有n行,固定n行,就是先把每一行的固定列赋出去
    {
        for(i=0;i<m;i++)
        {
            b[j][i]=a[i][j];
        }
    }
    
   //同样,可以把每一列固定行赋出去
   /*for(i=0;i<m;i++)
   {
       for(j=0;j<n;j++)
       {
        b[j][i]=a[i][j];
      }
   }
   */
   for(i=0;i<n;i++)
   {
       for(j=0;j<m;j++)
       {
           printf("%4d",b[i][j]);
       }
       printf("\n");//每一行结束后换行
   }
return 0;
}
//用具体数组比较好像
//C语言输出无法设置默认为右对齐,只能通过输出格式指定为右对齐。
/* 1 C语言中要使用右对齐,只能使用printf进行格式化输出;
2  要进行右对齐,必须指定输出宽度,否则输出时无法确定对齐位置;
3 设置输出宽度,可以在输出格式前加代表宽度的数字,比如 %14d,表示输出宽度为14个字符;
4 设置输出宽度后,默认为左对齐,要设置右对齐,需要加-号,即%-14d;
5  %-14d这个例子用来输出整型,其它类似,比如 %10f用来输出float类型,10位宽度,右对齐,而%-18s表示输出字符串,18位宽度,右对齐;
6 当以这种形式输出时,要保证输出的有效宽度小于设置的宽度,即输出的可见字符总数要小于指定的宽度数值,否则printf会按照实际宽度输出,导致对齐失败。

学生最高分

#include <stdio.h>
int main()
{
    int score[40],max;
    int num,i,n;
    printf("input total numbers:\n");
    scanf("%d",&n);
    printf("input score:\n");
    for(i=0;i<n;i++)
    {
        scanf("%d",&score[i]);//初始化,给每个单元赋值还是要用取址符
    }
    max=score[0];//赋值之后再赋max
   for( num=0,i=1;i<n;i++)
   {
       if(score[i]>max)
       {
           max=score[i];
           num=i;
       }    
   }
   printf("max=%d,num=%d\n",max,num);
   return 0;
}

杨辉三角

#include <stdio.h>
int main()
{   int n;
   printf("Input number:\n");
   scanf("%d",&n);
    int a[n][n];
    int i,j;
    for(i=0;i<n;i++)
    {
        a[i][0]=a[i][i]=1;
    }//对每一行的第一个和最后一个赋值1
    for(i=2;i<n;i++)//固定行
    {
        for(j=1;j<i;j++)//寻找列的规律
      a[i][j]=a[i-1][j-1]+a[i-1][j];
    }
    for(i=0;i<n;i++)//输出数组
    {
        for(j=0;j<=i;j++)
        {
            printf("%4d  ",a[i][j]);
        }
        printf("\n");
    }
    return 0;
}

找出不是相同数

这是我自己写的,遇到了一些困难

#include <stdio.h>
int main()
{
 int x,y;
 scanf("%d",&x);
 int a[21];//20就够了
 int b[21];//20就够了
 int c[21];//40,两倍
 int i;
 for(i=0;i<x;i++)
 {
     scanf("%d",&a[i]);
 }
 printf("\n");
 scanf("%d",&y);
 for(i=0;i<y;i++)
 {
     scanf("%d",&b[i]);
 }
 int j,t;
 t=0;//全局变量
for(i=0;i<x;i++)//检查第一个数组
 {
     for(j=0;j<y;j++)
     {
          if(a[i]==b[j])
          break;
          if(j==y)//最后一轮还在循环里,说明一个相同的都没有
          c[t]=a[i];
          t++;//每赋值一个加1
     }
 }
   
for(i=0;i<y;i++)//检查第二个数组
 {
     for(j=0;j<x;j++)
     {
          if(b[i]==a[j])
          break;
          if(j==x)
          c[t]=b[i];
          t++;
     }
 }
 for(i=0;i<=t;i++)
 {
     printf("%d ",c[t]);
 }
 printf("%d",c[t]);
/*  //检查重复的
 for(i=0;i<=t;i++)
 {

 } */


}
//初步想法是遍历第一个与第二个比,不同就输出,第二个与第一个比,不同就输出
//第二个问题是重复的怎么办?因为重复只能在自己的数组里重复,所以遍历检查就行了
//不如输出检查?

然后我借鉴了这个兄弟

找出不是两个数组共有的元素


#include<stdio.h>
 
int main(void){
	int n,m,a[20],b[20],c[40],i,j,k;
 
	scanf("%d",&n);//初始化数组
	for(i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	
	scanf("%d",&m);//初始化数组
	for(i=0;i<m;i++){
		scanf("%d",&b[i]);
	}
	
	k=0;
	for(i=0;i<n;i++){
		for(j=0;j<m;j++){
			if(a[i]==b[j]){    //相同的就跳出去,从j里循环跳到i的下一个数
				break;
			}
		}
		if(j==m){  //就是一次没跳
			c[k]=a[i];
			k++;
		}
	}
	for(i=0;i<m;i++){
		for(j=0;j<n;j++){
			if(b[i]==a[j]){
				break;
			}
		}
		if(j==n){
			c[k]=b[i];
			k++;
		}
	}
	
	printf("%d",c[0]);
	for(i=1;i<k;i++){  //注意这里是<k,因为最后k++了
		for(j=0;j<i;j++){ //其实也是遍历了,查重的解决方法就是与已经输出的比,不一样就输出,一样就不输出,这个算法确实高明
			if(c[i]==c[j]){
				break;
			}
		}
		if(j==i){//每一轮下来最后j都会等于i,其实就是一次没跳,和上面的思想差不多
			printf(" %d",c[i]);
		}
	}
	printf("\n");
return 0;
}

//我写的代码除了最后查重没有想到,大部分还是差不多的,两次遍历比较,通过检验循环次数来看是否一个都找不到相同的
//查重其实就是和已经输出的比较,如果相同就不输出,确实厉害

最后想说的是,没有一条路是容易的,希望共勉,封面还是用星史郎,酷酷的boy。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值