一、输入输出
多组数据:
输入不说明有多少个(N个)InputBlock(数组)
读取数据时,scanf的返回值等于成功读取数据的个数
while(scanf("%d%d",&a,&b)!=EOF)
printf("%d",a+b);
此时输入了ab俩个值,scanf返回值为2
EOF值为-1
或 while(scanf("%d%d",&a,&b)==2);
while(cin>>a>>b);
缺省以EOF(文件结束)为结束标志
给出多少组数:
——————————
2
1 10
3 5
——————————
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%d",&a,&b);
printf("%d\n",a+b);
}
当读取特定数字结束时:
例如读取00
while(scanf("%d%d",&a,&b)&&(a!=0||b!=0))
{
printf("%d",a+b);
}
或
while(scanf("%d%d",&a,&b)==2)
{
if(a==0&&b==0)
break;
printf("%d",a+b);
}
输出:
output的时候,在每一个output的之间有空行
—————— ——————
6 \n \n 6 \n
--(空行) 30
30 \n\n ___________
--
——————
——————
6 \n\n 或 o \n
---
30 \n \n o \n
——————
知识点:
整数/整数=整数
A65 Z90
‘o’数字字符!=0
‘1’-‘0’=1
long long :64位整数8*10的19次方
int 32位整数 2147483747
多组数据不需要一次性读完之后在一组一组处理
字符的输入:
scanf("%s%s",str1,str2);在多个字符串中用一个或多个空格分隔,
gets(str1);gets(str2);字符串之间用回车符分隔,
常规 短字符scanf,长字符用gets
getchar每次只能接受一个字符 c=getchar()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
二、基础数学
连续数相加,1+2+3+......+n
#include<stdio.h>
int main()
{
int n,i,sum;
while(scanf("%d",&n)==1)
{
sum=0;
for(i=0;i<=n;i++)
sum=sum+i;
prinft("%d\n",sum)
}
若使用公式n*(n+1)/2
则,必须考虑n*(n+1)远超过int
则,先考虑奇偶性,然后先让偶/2*奇
计算AB最小公倍数LCM
枚举,如1234567...从A开始往后依次寻找 配对B (A>B)
或 从A开始往后寻找A的倍数 配对B
或用公式
LCM=A*B/GCD(A,B)=A/GCD*B GCD(A,B) ------>最大公约数
转化为寻找最大公约数
辗转相除法
int gcd(int da,int xiao)
{
int temp;
while(xiao!=0)
{
temp=da%xiao;
da=xiao;
xiao=temp;
}
return (da);
}
求N个N相乘的个位数
1、1<=N<=1000,循环n-1次,取个位数相乘
2、1<=N<=10的9次方,分析出个位数的循环
斐波那契数列
F(0)=7
F(1)=11
F(N)=F(N-1)+F(N-2)
判断F(N)能否被三整除
思路:F(N)%3=[F(N-1)+F(N-2)]%3=F(N-1)%3+F(N-2)%3得到规律12022101120
求A^B(A的B次方)最后三位数表示的整数
快速幂运算
将B分成2*B/2
递归:
int power(int a,int n)
{
int ans;
if(n==o) ans==1;
else
{
ans=power(a*a,n/2);
if(n%2==1) ans=ans*a;
}
return ans;
}
非递归
int power(int a,int n)
{
int ans=1;
while(n)
{
if(n%2) ans=ans*a;
a=a*a;
n=n/2;
}
二分查找(折半查找) 数据单调
递归查找
int BiSearch(int a[],int n,int x)
int left=0,right=n-1;
while(left<=right)
{
int middle=(right+left)/2;
if(a[middle]==x)
return middle;
if(x>a[middle])
left=middle+1;
else
right=middle-1;
}
return -1; -------> left>right 时,还没有满足条件的值
非递归
int BiSearch(int a[],int x,int left,int right)
{
if( left>right)
return -1;
else
{
int middle=(right+left)/2;
if(a[mid]==x)
return mid;
else if(x>a[mid])
return BiSearch(a,x,mid+1,right);
else if(x<a[mid])
return BiSearch(a,x,left,right-1);
}
方程8*x^4+7*x^3+2*x^2+3*x+6=Y,其中Y满足fabs(Y)<=1e10,输出x在【0,100】的解,精确到小数点后四位
fabs(Y)------>Y的绝对值
#include<bits/stdc++.h>
using namespace std;
double Y;
double left,right,mid;
double f(double x)
{
return 8*pow(x,4.0)+7*pow(x,3.0)+2*pow(x,2.0)+3*x+6;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%lf",&Y);
if(f(0)<=f(Y)&&f(Y)<=f(100))
{
left=0;
right=100;
while(right-left>1e-6)
{
mid=(left+right)/2;
double ans=f(mid);
if(ans>Y)
right=mid-1e-7;
else
left=mid+1e-7;
}
printf("%.4f\n",(left+right)/2);
}
else
printf("NO Solution!\n");
}
}
return 0;
三分查找 数据凸性(不要求可导)
LeftThird=(left*2+right)/3
RightThird=(right*2+left)/3