求C语言算法比如输入15,要求在1,2,3,4,5.20里面求任任意数想加等于15,且得出的结果是按相加数数量从少到多排列,比如两位数相加排第一,三位数相加排第二.等,其中相加数1,2,3,4,5.20不变,每次就
来源:学生作业帮助网 编辑:六六作业网 时间:2024/12/20 07:30:21
求C语言算法比如输入15,要求在1,2,3,4,5.20里面求任任意数想加等于15,且得出的结果是按相加数数量从少到多排列,比如两位数相加排第一,三位数相加排第二.等,其中相加数1,2,3,4,5.20不变,每次就
求C语言算法
比如输入15,要求在1,2,3,4,5.20里面求任任意数想加等于15,且得出的结果是按相加数数量从少到多排列,比如两位数相加排第一,三位数相加排第二.等,其中相加数1,2,3,4,5.20不变,每次就是输入计算数(15).能否用最简单的C语言算法完成,我是初学者.
求C语言算法比如输入15,要求在1,2,3,4,5.20里面求任任意数想加等于15,且得出的结果是按相加数数量从少到多排列,比如两位数相加排第一,三位数相加排第二.等,其中相加数1,2,3,4,5.20不变,每次就
// 这种算法我会这样做,虽不是最优算法,但起码能解决问题,具体完整算法如下:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#define ARR_MAX 20
#define TARGET_MAX 19
inline void print_result(const int a[],const int t[],int m,int calValue){
\x09int sum,i;
\x09i=sum=0;
\x09for(i=0;i<m;i++){
\x09\x09sum+=a[t[i]];
\x09}
\x09if(sum==calValue){
\x09\x09for(i=0;i<m;i++) printf("%d+",a[t[i]]);
\x09\x09printf("\b=%d\n",calValue);
\x09}
}
bool Com(int a[],int n,int m,int calValue){
\x09if(m>n) return false;
\x09int temp[TARGET_MAX];
\x09int i,k;
\x09i=k=0;
\x09for(i=0;i<m;i++) temp[i]=-1;
\x09temp[k]=0;
\x09while (true){
\x09\x09if (temp[k]>=n){
\x09\x09\x09if(k==0) break;
\x09\x09\x09--k;
\x09\x09\x09temp[k]+=1;
\x09\x09}else if(k==m-1){
\x09\x09\x09print_result(a,temp,m,calValue);
\x09\x09\x09temp[k]+=1;
\x09\x09}else{
\x09\x09\x09++k;
\x09\x09\x09temp[k]=temp[k-1]+1;
\x09\x09}
\x09}
\x09return true;
}
int _tmain(int argc, _TCHAR* argv[])
{
\x09
\x09int a[ARR_MAX];
\x09int i,calValue;
\x09for(i=1;i<=ARR_MAX;i++) a[i-1]=i; // 为数组分配初始值 即1~20
\x09
\x09printf("请输入要计算的值:");
\x09scanf("%d",&calValue);
\x09
\x09if(calValue==210){
\x09\x09printf("1+2+...+20=%d\n",calValue);
\x09\x09return 1;
\x09}
\x09else if(calValue>210||calValue<=0){
\x09\x09printf("不在计算范围内,请重试.\n");
\x09\x09return 1;
\x09}
\x09for (i = 2; i <=TARGET_MAX; i++)
\x09{ // 开始调用函数
\x09\x09Com(a,ARR_MAX,i,calValue);
\x09}
\x09
\x09system("pause");
\x09return 0;
}