以下是问题所在
ACM国际大学编程大赛亚洲区域竞赛,横滨,2006-11-05
从x开始,通过x重复乘法,我们可以用30个乘法计算x^31:
x^2 = x * x, x^3 = x^2 * x, x^6 = x^3 * x^3, x^7 = x^6 *x, x^14 = x^7 * x^7 ,
x^15 = x^14 * x, x^30 = x^15 * x^15 , x^31 = x^30 * x编写一个程序,为给定的正整数x^n和n<=200,从x开始,通过乘法和除法,找出最小的运算数来计算n和n<=200。
对于n= 31,最小的#操作是6
对于n= 50,最小的#操作是7
任何想法都欢迎。
发布于 2010-12-28 20:11:22
参见:http://en.wikipedia.org/wiki/Addition-chain_exponentiation
没有有效的算法可以为您提供最小的步骤数,而且动态规划也不起作用。
我猜想n是足够小的,允许暴力解决方案通过,尽管它可能需要优化。你知道怎么用暴力强迫它吗?
发布于 2019-09-18 10:27:19
#include<stdio.h>
long long int pow(long long int, long long int);
int count=0;
int main()
{
long long int a,b;
printf("Input: ");
scanf("%lld %lld",&a,&b);
pow(a,b);
printf("%d",count);
return 0;
}
long long int pow(long long int a, long long int b)
{
count++;
if(b==0)
return 1;
long long int res=pow(a,b/2);
if(b%2)
return res*res*a;
else
return res*res;
}https://stackoverflow.com/questions/4549099
复制相似问题