问题描述:
设I是一个n位十进制整数。如果将I划分为k段,则可得到k个整数。这k个整数的乘积称为I的一个k乘积。试设计一个算法,对于给定的I和k,求出I的最大k乘积。
编程任务:
对于给定的I 和k,编程计算I 的最大k 乘积。
Input
输入的第1 行中有2个正整数n和k。正整数n是序列的长度;正整数k是分割的段数。接下来的一行中是一个n位十进制整数。(n<=10)
Output
计算出的最大k乘积。
Input:
5 3
54321
Output:
6420
动态规划、n重for循环用 while (1) 结构实现
/************************************************************************* > File Name: max_k.c > Author: zhanglp > Mail: 820221185@qq.com > Created Time: 2013年11月17日 星期日 20时19分11秒 ************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> #define MAX_BUFFER 128 int main (void) { char str_num[MAX_BUFFER]; char buf[MAX_BUFFER]; int i, j, k; printf ("please input num : "); for (i= 0; isdigit (str_num[i] = getchar ()); i++) ; str_num[i] = 0; int n = i; int w[n][n]; memset ((char *)&w, 0, sizeof (w)); do { printf ("please input k : "); scanf ("%d", &k); }while (k > n); for (i = 0; i < n; i++) for (j = i; j < n; j++) { strcpy (buf, str_num); buf[j+1] = 0; sscanf (buf+i, "%d", &w[i][j]); } /* for (i = 0; i < n; i++) { for (j = 0; j < n; j++) printf ("%-8d", w[i][j]); printf ("\n"); } */ #if 0 // 有 k 重 for 循环 int s = 0, max = 0; for (i = 0; i < n; i++) for (j = i+1; j < n; j++) for (k = j+1; k < n; k++) { printf ("(%d, %d, %d)\n", i, j, k); s = w[0][i] * w[i+1][j] * w[j+1][k]; // printf ("(%d, %d) * (%d, %d) * (%d, %d)\n", 0, i, i+1, j, j+1, k); if (s > max) max = s; } #endif #if 1 int s = 0, max = 0; int xunhuan[k+1]; for (i = 0; i <= k; i++) xunhuan[i] = i-1; while (1) { for (s = 1, i = 1; xunhuan[k] < n && i <= k; i++) s *= w[xunhuan[i-1]+1][xunhuan[i]]; if (s > max) max = s; int kk = k; while (kk > 0) { if (xunhuan[kk] < n-1) { xunhuan[kk]++; break; } else { xunhuan[kk] = xunhuan[kk-1]+2; kk--; } } if (kk <= 0) break; } #endif printf ("max = %d\n", max); return 0; } |