算法笔记0-1(输入输出,基础数学)

一、输入输出

多组数据:

输入不说明有多少个(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

            

   

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值