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
-
这里主要是有一个
getline()
函数的使用,getline(cin,str)
用于读取一行字符串放入str中,但别忘了在使用他之前如果输入流还有东西的话(之前用过cin的话)千万要记得用cin.get()
函数将输入流中剩余的回车空格之类的吸收掉,类似与gets()后用getchar吸收空格,不过现在最好别再用gets(),换成fgets(str,num,stdin)。 -
string类型有一点好就在可以用+直接字符串拼接,很方便,但是如果要用到一些c里面的字符串处理函数得用
str.c_str()
转换成char[]类型的字符串数组。 -
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代入求导后的多项式,并将多项 式的值在一行中输出
推导过程
#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;
}