原创
求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存储机制
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
按照等差通项输出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
#include
int main()
{
int n;
scanf("%d",&n);
int i;
for(i=0;i=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
[]的优先级比*高
()的优先级比*高,所以指针数组是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;
}