
题目只要求输出自然数N的分解方案数,当N大的时候分解方案数会相当的多,所以为了提高效率,可以不一一枚举所有的分解方案而是运用数学方法计算。
计算方法如下
首先对自然数N做质因数分解(分解成若干个质数的乘积)
设N的质因数分解为N=p1^q1 p2^q2 p3 ^q3 pm ^ qm(比如当N=12时,N=2^2 3^1)
这样做之后,对N的分解就等价于将对质因子分组。
问题变成了:有m种物品,第i种物品有qi种,求将他们分成若干组的方案数。
设f[i][j]表示放了前i种物品,分了j组的方案数
转移的时候枚举一个k表示新增的组数
f[i][j+k] = f[i][j+k] + f[i-1][j] C ( qi-k + j+k-1 , j+k-1 )
后面那个组合数是插板法,表示将 qi-k个本质相同的物品分到j+k个盒子里
分析一下复杂度,N最大为20亿,质因子个数是log级别的,大约为30,这样组数的枚举上限就为30,质因子种类显然也是log级别
复杂度为 303030 = 27000,当然,由于方案数非常巨大,可能需要使用高精度存储,所以还要乘上高精度复杂度。
(最近转了C++,要代码的话可以给C++的吗?)
#include "stdioh"
#include "mathh"
int main(int argc,char argv[])
{
while(1)
{
printf("程序初始化中\n");
int a,b,c;
printf("已经启动,无异常发生\n");
printf("默认公式 ax·x+bx+c \n");
printf("相关数据初始化已经全部完成\n\n\n\n");
printf("请输入关于ax·x+bx+c因式分解的相关参数\n");
printf("请输入系数a的数值\n");
scanf("%d",&a);
printf("请输入系数b的数值\n");
scanf("%d",&b);
printf("请输入常数c的数值\n");
scanf("%d",&c);
printf("\n\n正在进行计算请稍候\n\n");
int i,j,m,n,z,flag;
i = 1;
j = 1;
z = 0;
flag=0;
if(a<0)
{
printf("(-1)");
a=-a;
b=-b;
c=-c;
}
while(i<=a)
{
if(a%i!=0)
{
i++;
continue;
}
m = a/i;
while(j<=abs(c))
{
if(c%j!=0)
{
j++;
continue;
}
n = c/j;
if(in+mj==b)
{
printf("(%dx",i);
if(j>0)
printf("+");
printf("%d)",j);
printf("(%dx",m);
if(n>0)
printf("+");
printf("%d)",n);
flag=1;
break;
}
else if(in+mj==-b)
{
j=-j;n=-n;
printf("(%dx",i);
if(j>0)
printf("+");
printf("%d)",j);
printf("(%dx",m);
if(n>0)
printf("+");
printf("%d)",n);
flag=1;
break;
}
else
{
j++;
z++;
}
}
if(flag==1)
break;
j=1;
i++;
}
if (flag==0)
{
printf("无法分解\n");
}
printf("所有运算已经结束\n\n\n");
}
return 1;
}
//可分解a,b,c为负的情形
x²-5x+6=0的解:x1=2,x2=3。
方法一:因式分解法。
x²-5x+6=0。
(x-2)(x-3)=0。
x1=2,x2=3。
方法二:配方法。
x²-5x+6=0。
x²-5x=-6。
x²-5x+25/4=1/4。
(x-5/2)²=1/4。
x-5/2=1/2或x-5/2=-1/2。
x1=2,x2=3。
扩展资料:
一元二次方程解法
1、公式法可以解所有的一元二次方程,公式法不能解没有实数根的方程(也就是b2-4ac<0的方程)。
2、因式分解法,必须要把等号右边化为0。
3、配方法,首先将方程二次项系数a化为1,然后把常数项移到等号的右边,最后后在等号两边同时加上一次项系数绝对值一半的平方。
4、求根公式, x=-b±√(b^2-4ac)/2a。
5、图像法,一元二次方程解的几何意义是二次函数与x轴的交点。
6、计算机方法,在使用计算机解一元二次方程时,和人手工计算类似,也是根据求根公式来求解,可以进行符号运算的程序,如软件Mathematica,可以给出根的解析表达式,而大部分程序则只会给出数值解(但亦有部分显示平方根及虚数的情况)。
参考资料来源:百度百科-一元二次方程
你的数要求的太大了,超出了计算机表示数据位数限制,建议想办法改为用数组分段表示a值:比如数组每个数都只占用八位,计算的中间结果和最后结果都用小于等于八位的数值来表示,前后位数之间的进位和退位也用程序计算进去就可以实现这个超位数字的计算,只要数组的上限足够的话,还是可以计算出结果的。
1958=2979=21189
程序化一点的来说,一个数N,你可以从2开始试验它能否被某一质数整除,直至试验到根号N
如上,先是1958从2开始,可以被2整除,于是1958=2979
然后979,从2开始,2,3,5,7,11,可以被11整除,于是979=1189
然后89是一百以内质数这个应该就比较熟了……
或者也可以用2,3,5,7,试到7了没有被整除就结束了。
以上就是关于Pascal 因式分解 将大于1的自然数N进行分解,满足N=A1*A2*……Am,求N的所有形式不同因式分解方案总数全部的内容,包括:Pascal 因式分解 将大于1的自然数N进行分解,满足N=A1*A2*……Am,求N的所有形式不同因式分解方案总数、c++ 十字相乘因式分解 循环问题、x的平方—5x+6=0解题过程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)