冬令营第三天

1.欧几里得辗转相除法求最大公约数

只有一行代码,熟悉了很快就能敲出来。

int gcd(int a, int b) {
	return b == 0 ? a : gcd(b, a%b);
}

重要的是扩展的欧几里得算法!!!

扩展的欧几里得算法用于ax+by=GCD(a,b)的x和y求解。

1.先看看推导过程:
我觉得推导起来还是挺复杂的,如果觉得难理解,把代码背下来吧😣
在这里插入图片描述
2.上代码
(🤫其实不多的)

int exgcd(int a,int b, int &x,int &y) {
	if (b==0) {x=1; y=0; return a;} 
	int t=exgcd(b, a%b, x, y);
	int x0=x, y0=y;
	x=y0; y=x0-(a/b)*y0;
	return t;
}

2.数字字符串拆开放入整型数组中
#include<iostream>

#include<cstdlib>
#include<cstring>
#include <cmath>

using namespace std;



int main(){
  
  int x=0;
  
  while(cin>>x){
    int m=0;
    long long int sum=0;
    cin.get();
    
    string str,s="";
    
    int coef[100]={0},num=0;
    
    getline(cin,str);
    
    str+=" ";
    for(int i=0;i<str.length();i++) {
      if(str[i]!=' ') {
        s+=str[i];
      }
      else {
        num++;
        coef[m++]=atoi(s.c_str());
        s="";
        
      }
    }
    cout<<"x = "<<x<<endl;
    cout<<"x + coef[i] = ";
    for (int i=0; i<num; i++) 
      cout<<coef[i]+x<<" ";
    cout<<endl;
    
  }
  
  return 0;
  
}

输入7 和1 -1的结果

7
1 -1
x = 7
x + coef[i] = 8 6 
  1. 这里主要是有一个getline()函数的使用,getline(cin,str)用于读取一行字符串放入str中,但别忘了在使用他之前如果输入流还有东西的话(之前用过cin的话)千万要记得用 cin.get() 函数将输入流中剩余的回车空格之类的吸收掉,类似与gets()后用getchar吸收空格,不过现在最好别再用gets(),换成fgets(str,num,stdin)

  2. string类型有一点好就在可以用+直接字符串拼接,很方便,但是如果要用到一些c里面的字符串处理函数得用 str.c_str()
    转换成char[]类型的字符串数组。

  3. atoi(char []) 函数可以将数字字符串转换成int类型,十分方便,虽然用-‘0’也能做到。记得加上 #include <stdlib.h>

3. 题目 498-bis

我刚开始想用getline字符串处理然后枚举求解,但是会runtime error,可能测试的数据量太大崩溃了。

  • 题目

在“在线测试试题集文档”中,有一道非常有趣的试题,编号为 498,题目名称为“Polly the Polynomial”。坦率地说,我没有去 解这道试题,但我从这道试题衍生出了本题。
• 试题498的目的是“…设计这一试题是帮助你掌握基本的代数技能, 等等”。本题的目的也是帮助你掌握基本的求导代数技能。
• 试题498要求计算多项式 a0x^n + a1x^n-1 + . . . + an-1x + an的值。
• 本题则要求计算该多项式的导数的值,对该多项式求导,得到的
多项式是:在这里插入图片描述

• 本题的所有输入和输出都是整数,也就是说,其绝对值小于231。

输入
程序输入偶数行的文本。每两行为一个测试用例;其中,第一行 给出一个整数,表示x的值;第二行则给出一个整数序列a0, a1,
…, an-1, an,表示一组多项式系数。 • 输入以EOF终止。

• 输出
• 对于每个测试用例,将给出的x代入求导后的多项式,并将多项 式的值在一行中输出

推导过程
h

#include<cstdio>
#include<cmath>

using namespace std;

int main()
{
    int x,a;
    char c;
    while(scanf("%d",&x)!=EOF)
    {
        int origin=0;   //原函数的值
        int ans=0;      //求导后的值
        while(scanf("%d",&a)!=EOF)
        {
            ans=ans*x+origin; //导数=上阶段倒数*x+上阶段原函数
            origin=origin*x+a; //原函数更新= 上阶段原函数*x+a
            scanf("%c",&c);
            if(c=='\n')
                break;
        }
        printf("%d\n",ans);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值