哥德巴赫猜想
#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。