9

这是来自的问题

ACM 国际大学生程序设计大赛亚洲区域赛,横滨,2006-11-05

从 x 开始并反复乘以x,我们可以计算出x^3130 次乘法:

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^nx给定的正整数nn<=200

对于 n = 31,最少 #operations 是 6
对于 n = 50,最少 #operations 是 7

欢迎任何想法。

4

2 回答 2

11

看到这个:http ://en.wikipedia.org/wiki/Addition-chain_exponentiation

没有有效的算法可以让您获得最少的步数,动态编程也不起作用。

我猜它n足够小,可以让蛮力解决方案通过,尽管它可能需要优化。你知道如何暴力破解吗?

于 2010-12-28T20:11:22.157 回答
0
#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;
}
于 2019-09-18T10:27:19.413 回答