写了两个,都是同一种思路,先从0到n位列出从2开始的间隔为1的等差数列,直到第N位【值应当为N+1】使得余数left(等于输入值A减去前N个数之和)小于N+2;然后为了构造不同的值,将余数从N位到第一位开始每位加1,若有剩余循环执行。
以输入值A=8为例;可以构造数列2,3直到第N=2位,余数为3那肯定是小于N+2(4)的。依次从高位开始加1,一次循环【3,4】还有剩余1,再次执行【3,5】,然后结束。
第一个程序可以0ms,不过两个都是丑陋地200多K内存
#include<iostream>
using namespace std;
/*
*Author :Biang Hoo
*July 30 2013
*/
int main(){
int i;
int * array = new int[50];
int index=0;
int num=2;
while(cin>>i && i>=5 && i<=1000){
int sum=0;
for(int j=0;j<50;j++){
if(i-sum>num-1){
array[j]=num;
sum += num;
}else{
index = j;
i -= sum;
break;
}
num++;
}
num=i%index;
i=i/index;
for(int m=0;m<index;m++){
array[m] += i;
}
for(i=index-1;i>index-num-1;i--){
array[i]++;
}
for(i=0;i<index;i++){
cout<<array[i]<<" ";
}
num=2;
cout<<endl;
}
return 0;
}
#include<iostream>
using namespace std;
/*
*Author :Biang Hoo
*July 30 2013
*/
int main(){
int i;
int * array = new int[50];
int index=0;
int num=2;
while(cin>>i && i>=5 && i<=1000){
int sum=0;
for(int j=0;j<50;j++){
if(i-sum>num-1){
array[j]=num;
sum += num;
}else{
index = j-1;
i -= sum;
break;
}
num++;
}
num=index;
while(i-- > 0){
array[index]++;
index--;
if(index<0){
index=num;
}
}
index=num+1;
for( i=0;i<index;i++){
cout<<array[i]<<" ";
}
cout<<endl;
}
return 0;
}