题目:求1+x+x^2+x^3+...+x^n的和(尽可能少的使用乘法运算)。
分析:可以使用折半的方式,每次计算两个的和,比如首先计算出1+x的值保存,然后用保存的这个值乘以x^2可以得到后面两项的值再保存,依次类推直到计算结束。需要注意的是如果n是奇数或者偶数的情况是不同的,当n为奇数的时候就完全按照前面的方法计算即可,但是n为偶数的时候比较麻烦,因为最后一项的计算比较困难,所以当n为偶数的时候首先计算x+x^2的值,然后用这个和来作为迭代的基础,剩余的1最后再加到和里面,这样相当于把最后一项替换为1,这样计算简便不少。这样处理之后需要做的乘法的次数大约为n/2次。
程序的代码如下:
#include运行结果截图:int main() { int x, n, x2; int sum = 0, value; int count = 0, i; printf("Please input x and n:\n"); scanf("%d%d", &x, &n); printf("x=%d, n=%d\n", x, n); if(n%2) //n为奇数,用户输入n实际上是求n+1个数的和 { x2 = x*x; count ++; value = 1 + x; sum += value; i = 1; while(i < n) { value *= x2; sum += value; i += 2; count ++; } } else //n为偶数 { x2 = x*x; value = x + x2; sum += value; count ++; i = 2; while(i < n) { value *= x2; sum += value; i += 2; count ++; } sum += 1; //n为偶数时,最后才把1加到和里面 } printf("运算的结果为:%d.\n", sum); printf("一共需要做%d次乘法。\n", count); return 0; }

