c语言中闰年判断用while,关于C语言狗血的理解这是重点

原创

求1+2+……+n=?

给定一个n,其中n<=2^32;

明显超范围了的,用unsign long long int8X2X4(64)个位足够了,但是要先除2,再相乘,否则会超出64位。

#include

int main()

{

unsigned long long int n;

scanf("%lld",&n);

unsigned long long ans=0;

if(n%2==0)

printf("%llu",(n/2)*(n+1));

else

printf("%llu",((n+1)/2)*n);

return 0;

}

第一次实验:整数分割可以用求余,和求商的方法做。

想判断闰年的题不应该思考了,得有自己的套路了

判断闰年

#include

int main()

{

int n;

scanf("%d",&n);

if(n%400==0)printf("Yes");

else if(n%4==0&&n%100!=0)printf("Yes");

else printf("No");

}

如果能整除400是闰年,如果能被4整除但不能被100整除是闰年,其他的不是闰年。

2的多少次方

#include

#include

int main()

{

double x,y;

scanf("%lf",&x);

y=log2(x);

printf("%g",y);//不输出多余的0

}

double可以存一个很大的数

IEEE-754存储机制

68dfeaccceb5?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image

log函数log2

如果是读取一整行字符串肯定是用gets函数!!

(一旦有比较类的题就注意相等的情况)

第二次作业G题,以后逻辑判断全都用if判断做

循环模拟。

#include

int main()

{

int k,m,n;

int flag=0;

scanf("%d %d %d",&k,&m,&n);

int i;

for(i=1;i<=k;i++)

{

if();

else

{

if((i%m==0||i%n==0)&&!(i%m==0&&i%n==0))

{

if(flag)printf(" ");

printf("%d",i);

flag=1;

}

}

}

return 0;

}

注意&&优先级高于||的优先级,高一级。()是最高的优先级。

简单的保留两位小数的分数转小数。

#include

int main()

{

int i,j;

scanf("%d/%d",&i,&j);

printf("%.2f",i*1.0/j);

return 0;

}

作业3 problem C错误原因:没看清题。

作业3 problem F错误原因:严格按照题意写程序,不要按照自己的理解写程序。

输出的所有数在两行“=====”之间。

作业3 problem H错误原因:一没有严格按照题意做题,学到的知识如何三个条件

全满足时跳出循环那么应该是!(p^q^a)==!p||!q||!a.

还有写switch语句一定要用defualt做默认条件

其语法:switch(可以是数字也可以是字符f)

所有case均在switch的大括号之内。

case (一定要有空格)f//这儿不用加(),,:语句,break;不用括号。

default:{

break;}

#include

int main()

{

inta,b;

charc;

scanf("%d",&a);

c=getchar();

scanf("%d",&b);

while(a!=0||b!=0||c!=' ')

{

switch(c)

{

case'+':printf("%d\n",a+b);break;

case'-':printf("%d\n",a-b);break;

case'*':printf("%d\n",a*b);break;

case'/':printf("%d\n",a/b);break;

case'%':printf("%d\n",a%b);break;

default: {printf("invalid op\n");break;}

}

scanf("%d",&a);

c=getchar();

scanf("%d",&b);

}

return0;

}

switch标准形式

switch(controllingExpression)

{

case constantExpression1:statement1;break;

case constantExpression2:statement2;break;

case constantExpression3:statement3;break;

...

default:statement;

}

//注意以后这种以某种判断为结束的题均使用

while(scanf()……&&!结束条件)

实验3 problem C:

错误原因没看见1. 它是一个完全平方数。2. 它是一个偶数。

教训做题一发入魂最好,不可不看题阿,但不管怎样都不要慌。

需要判断给定的一个整数是否同时满足如下三个条件:

1. 它是一个完全平方数,若一个数能表示成某个自然数的平方的形式,则称这个数为完全平方数。

2. 它是一个偶数。

3. 它是一个正数。

#include

#include

int main()

{

inti;

scanf("%d",&i);

ints=sqrt(i);

if(i%2==0&&s*s==i)

printf("yes");

else

printf("no");

return0;

}

判断是否完全平方数就用:

int t=sqrt(n);

if(t*t==n)

输出等差数列的最好方式:

#include

#include

int main()

{

int i,t,flag=0;

int a,b,c;

scanf("start = %d, step = %d, times = %d",&a,&b,&c);

for(i=0;i

{

if(flag)printf(" ");

printf("%d",a+i*b);

flag=1;

}

return0;

}

按照等差通项输出a+i*b,i=0,1,2,……;

实验4 problem A没看清题,每组测试样例对应一行输出,输出所给的N个整数之和,顺序与输入对应,输出没有换行。

实验4

登录密码验证 之二 一个很隐蔽的bug

gets和scanf的读取

海伦公式:

s=sqrt(p*(p-a)*(p-b)*(p-c)).

p=(a+b+c)/2;

杨辉三角函数核心代码

后面的均等与上一排同列和上一排前一列之和*/

a[i][j]=a[i-1][j]+a[i-1][j-1];

#include

int yanghui(int a[14][14])

{

int i,j;

for(i=1;i<14;i++)

{

a[i][1]=1;//初始化同样很重要。

}

for(i=2;i<14;i++)

{

for(j=1;j<=i;j++)//重点

a[i][j]=a[i-1][j-1]+a[i-1][j];

}

}

int main()

{

int n;

int a[14][14]={0};

yanghui(a);

while(scanf("%d",&n)!=EOF)

{

int i,j;

for(i=1;i<=n;i++)

{

for(j=1;j<=i;j++)

{

if(i!=n)

{

int k;

for(k=0;k

if(j==1) printf(" ");

printf("%4d",a[i][j]);

}

if(i==n)

{

printf("%4d",a[i][j]);

}

}

printf("\n");

}

printf("\n");

}

}

#include

int main()

{

int n;

scanf("%d",&n);

int i;

for(i=0;i

{

int a,b;

scanf("%d%d",&a,&b);

double x=(4*a-b)/2.0;

double y=(b-2*a)/2.0;

if(x>=0&&y>=0&&(x==(int)x&&y==(int)y))

printf("%.0lf %.0lf\n",x,y);

else

printf("no result\n");

}

return 0;

}

鸡兔同笼

问题单纯解方程以及判断条件

if(x>=0&&y>=0&&(y==(int)y&&x==(int)x))输出整数可用%.0lf或者无符号长整形unsigned long long int

%llu这是重点。

输出整数的最低两位,一开始麻烦的做法,其实完全可以用%100算数。

#include

int main()

{

int a[1010];

int i,y=0,j=0;

int ans=0;

scanf("%d",&i);

if(i>=0)

{

while(i&&j<2)

{

a[j]=i%10;

i/=10;

j++;

}

if(j==2)

{

while(j--)

ans=(ans)*10+a[j];

printf("%.2d",ans);

}

else

printf("%d",a[0]);

}

else

{

int p=-1*i;

while(p&&j<2)

{

a[j]=p%10;

p/=10;

j++;

}

if(j==2){

while(j--)

ans=(ans)*10+a[j];

printf("%.2d",ans);

}

else

{

printf("%d",a[0]);

}

}

return 0;

}

#include

intm[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

intd[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};

intisLeapyear(inty)

{

if(y%400!=0&&y%100==0)return0;

if(y%4==0)return1;

else

return0;

}

intisright(inta,intb,intc)

{

if(b>12)

{

printf("error date!\n");

return0;

}

if(!isLeapyear(a)&&c>m[b])

{

printf("error date!\n");

return0;

}

if(isLeapyear(a)&&c>d[b])

{

printf("error date!\n");

return0;

}

return1;

}

int main()

{

intn,i,j,sum=0;

scanf("%d",&n);

inta,b,c;

for(i=0;i

{

sum=0;

scanf("%d-%d-%d",&a,&b,&c);

isLeapyear(a);

if(isright(a,b,c))

{

if(!isLeapyear(a))

{

for(j=1;j

{

sum+=m[j];

}

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

}

if(isLeapyear(a))

{

for(j=1;j

{

sum+=d[j];

}

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

}

}

}

return0;

}

[]的优先级比*高

()的优先级比*高,所以指针数组是int p1[10]; 是数组指针int(p2)[10];

int a[3][4];

int (*p)[4];

p=a;

p++;

如此便变成指向一维数组的指针,因为多一维相当于多一取地址。

二维数组的使用方法。

#include

int main()

{

char s[6][6];

gets(s[0]);

gets(s[1]);

gets(s[2]);

char (*p)[6];

p=s;

gets(p+3);

int i;

for(i=0;i<=3;i++)

puts(s[i]);

}

二分查找

int erfen(int min,int max)

{

while(low<=high)

{

mid=(low+high)/2;

if(value==array[mid])

return mid;

else if(value>array[mid])

low=mid;

else

high=mid;

}

}

查找第一次出现的位置。

while(scanf("%d",&k)!=EOF)

for(j=1;j<=a[0];j++)

{

if(a[j]==k)

{

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

count=1;

break;

}

if(count==0)

printf("NOT FOUND\n");

count=0;

}

如果是查找最后一个就把for循环反过来用。

指针问题:如下所示,如果不用数组名必须使用初始化因为得让

int b=-1;

int *a=&b;

*a=2;

scanf("%d",a);

printf("%d",*a);

素数求法

#include

int isprime(int num)

{

if(num==2||num==3)return 1;

if(num%6!=1&&num%6!=5)

return 0;

int tmp=sqrt(num);

for(int i=5;i<=tmp;i+=6)

{

if(num%i==0||num%(i+2)==0)

return 0;

}

return 1;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值