算法笔记之黑匣子问题(c++实现)

来源:互联网 发布:淘宝手机发票怎么开 编辑:程序博客网 时间:2024/04/30 06:20
最近在知乎上看见一个问题:
有一个黑匣子,黑匣子里有一个关于 x 的多项式 p(x) 。我们不知道它有多少项,但已知所有的系数都是正整数。每一次,你可以给黑匣子输入一个整数,黑匣子将返回把这个整数代入多项式后的值。那么,最少需要多少次, 我们可以得到这个多项式每项的系数呢?
思维过程和答案都很有意思,本人也是个菜鸟,默默地用c++实现并记录下来。
/*输入:n:多项式的指数;an...a2,a1,a0各项系数(p(x)=an*x^n+an-1*x^(n-1)+...+a1*x+a0;)第一次输入的数:1 第二次输入的数:s+1输出:第一次输入数代入结果:s第二次输入数代入结果:s1热后输出各项系数:an,an-1...a1,a0;算法思想:第一次输入1所得s=an+an-1+..+a1+a0,第二次输入s,则s1=an*(s+1)^n+an-1*(s+1)^(n-1)+...+a1*(s+1)+a0  此处有重点,注意观察s1可以用s+1进制表示则可以将s1转换成s+1进制,然后得出各项系数注意:第一次得到S是为了保证对于任意系数其实最大系数不超过N的多项式,本来就是N进制的本质*/#include <iostream>#include <cmath>using namespace std;int main(){cout << "输入n:多项式的指数;an...a2,a1,a0各项系数:" << endl;int n;cin >> n;int *a = new int[n+1];for (int i = n; i >=0; i--){cin >> a[i];}cout << "第一次输入的数b1:" << endl;int b1, b2;cin >> b1;int s = 0;for (int i = n; i >=0; i--){s += (a[i] * pow(b1, i)); //调用乘方函数}cout << "第一次输入数b1代入结果s=" << s << endl;cout << "第二次输入的数b2:" << endl;cin >> b2;int s1= 0;for (int i = n; i >= 0; i--){s1 += (a[i] * pow(b2, i));}cout << "第一次输入数b2代入结果s1=" << s1<< endl;int *c = new int[n + 1];cout << "各项系数(an--a0):" << endl;for(int i = 0; i <= n; i++){//进制转换 辗转相除法  也可以用栈实现c[i] = s1 % (s + 1);s1 = s1 / (s + 1);}for (int i = n; i >= 0; i--){cout << c[i] << " ";}cout << endl;system("pause");return 0;
}



0 0