C语言:Oj题目总结(1)
1.多判断和分段函数型(内嵌最值判断)
if(a<1)
else if(a>=1&&a<10)
else(a>=10)
if()
if()
if()
例题:int min,a;
min=a;
if(b<min)
{
min=b;
}
If(c<min)
{
min=c;
}
printf(“%d\n”,min);
2.素数判断
只有被自己和1整除的数(要设置2个变量i,j 用(i%j0)这个条件去判断)
素数因子:分解数字(注意:一般每个因子是要打印一次的而已)
i%j0;//这个判断是不是他的素数因子
i/j==0;//这里求除过素数因子后的数(用短除法的思想)
if(i%j0)
{
if(flag1)
{
printf(“%d”,i);
Flag=0;
}
else
{
printf(“ %d”,i);
}
}
While(i%j0)
{ i=i/j;
}
3.闰年:第二个月29天,((year%40)&&(year/100!=0))||(year%400==0);
月份天数用数组构建:int run[13]={0,31,29,31,30,31,30,31,31,31,30,31}
这里就是用0占位下标0,从而输入1表示第一个月。
用类似思想的有星期,编号从1开始的
4.nnn与nnn的区别
前者是每位数都相等,后者是n的次方
记每一轮的值为term
前者表示term=term10+n;
后者是term=termn+n;
5.递推规律题(本质是数学,用c语言表示数学关系)
trem=-trem*(2n-1)/(2n)(xx)/(2n+1);
难的是:1.要先找到每一项递归规律
2.用同一个变量n表示每一项
3.细节:乘 除/ 括号()符号
6.某一个数的倒序打印
int i=0;
n=i%10;
y=i/10;
用这个循环,一个取最后一个数,一个让它少掉最后一位数
不过按这个顺序它是倒序的,如果还要正序打印,就要多用一个数组arr[]去储存。
某一个数的顺序打印
arr[i]=d;
i++;
这样的话它会先存一个数,然后数组扩大,为存下一个数做准备;在这之后就打印数组,即可实现顺序打印。
7.大小写变换
小变大
Int x=0;
f(x>’a’&&x<’z’)
x=x-32;
这里x在计算机中本身就表示ACSLL值
8.注意是否出现小数,分数,e这种
用double %lf
float %f
如果要保留小数,就(%.xf)表示
但是一般用double,因为可能会出现精度缺失的情况
9.目前遇到过的数学性质代码
#include<math.h>
Squr()开方
fabs()浮点型的取绝对值
abs()整形的取绝对值
10.关于空格的打印
如果要打印数字,printf(“%d”,n);
如果要打印空格数字,printf(“ %d”,n);
它们之间一般用if连接,用一个记号标记
Int flag=1;\这个是假设第一个打印的是数字
if(flag==1)\这个是判断第一个是数字
printf(“%d”,n);
else
printf(“ %d”,n);
11.二分法(有对应整形的,也有对应浮点型的,两者有细微差别)
大体思路:int right=0;
int left=0;
int mid=0;
int obj=0;
mid=(right+left)1.0/2 \如果是整形的就不用1.0
#include <math.h>
#define EPS 1e-6 // 精度,10的-6次方
// 定义函数 f(x) = x³ - x -1
double f(double x)
{
return xxx - x - 1;
}
int main(void)
{
double left = 1, right = 2;
double mid;
// 只要区间长度大于精度,继续循环
while( right - left > EPS )
{
mid = (left + right) / 2; // 取区间中点
if( f(mid) * f(left) < 0 )
{
// 中点和左端点异号,根在左边 [left, mid]
right = mid;
}
else
{
// 根在右边 [mid, right]
left = mid;
}
}
// 循环结束,left/right/mid都可以当作根
printf(“方程根 = %.6lf”, mid);
return 0;
}
#include<stdio.h>
int main(void)
{
int arr[8]={1,3,5,7,9,11,13,15};
int left=0, right=7; // 左右下标
int key;
scanf(“%d”, &key);
int flag=0; // 0=没找到,1=找到
int mid;
while(left <= right)
{
mid = (left + right)/2; // mid是中间下标,整数除法
if(arr[mid]==key)
{
flag=1;
break;
}
else if(arr[mid] < key)
{
//中间数字比目标小 → 目标在右边,左边界移动
left = mid + 1;
}
else
{
//中间数字比目标大 → 目标在左边,右边界移动
right = mid -1;
}
}
if(flag ==1)
printf(“找到了,下标是:%d”,mid);
else
printf(“没找到,返回-1”);
return 0;
}
318



被折叠的 条评论
为什么被折叠?



