急求代码?c语言

tiger_my 2008-04-22 05:19:47
要求输入一个数A (0-10000)用1-n的自然数相加得到这个数
并且每个自然数只能出现一次 可以正也可以负
问最少用多少个自然数可以得到这个输入的数
例如输入 12
12=-1+2+3+4+5+6-7 答案为7
例如输入5
5=-1+2+3-4+5 答案为5
例如输入2
2=1-2+3 答案为3
例如输入1
1=1 答案为1
...全文
154 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
UltraBejing 2008-05-01
  • 打赏
  • 举报
回复
等待牛人来答.
tiger_my 2008-04-23
  • 打赏
  • 举报
回复
谢谢各位!
szduweibing 2008-04-23
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
int a[200];
int i,j;
int sum,num;
int n;

printf("input a num:");
scanf("%d",&n);

memset(a,0,200);
sum=0;
for(i=1;i<=2*n;i++)
{
sum+=i;
if(sum>=n && ((sum%2)==(n%2)))
break;
}
num=i;

sum=(sum-n)/2;
while(sum>i)
{
a[i]=-1;
sum=sum-i;
i--;
}
if(sum>0)
a[sum]=-1;

printf("%d=",n);
for(j=1;j<=num;j++)
{
if(a[j]==0)
{
if(j==1)
printf("%d",j);
else
printf("+%d",j);
}
else
printf("-%d",j);
}
printf("\n");
}
fozaber 2008-04-23
  • 打赏
  • 举报
回复
我说一下原理,就是先求1~n的和sum,然后用sum去减A,当sum大于A的时候,才可以写出A的表达式。然后用
(sum-A)/2,得出的值就是负数的总和!
例如:
A=8
sum=1+2+3+4=10
(sum-A)/2=1
那么只要把sum里的1写成负值就行了。
8=-1+2+3+4

A=12
sum=1+2+3+4+5+6+7=28
(sum-A)/2=8=1+7
所以只要把1,7写成负值就行了。
12=-1+2+3+4+5+6-7

我上面的代码可以写出表达式!
fozaber 2008-04-23
  • 打赏
  • 举报
回复
#include <stdio.h>

int main()
{
while(1)
{
int index_number,array_index1=0,sum_number1=0,input_number,output_number,array_index2,sum_number2,key_number;
bool ok=true;
int sub_array[100];
printf("input a number (1~10000):\n");
scanf("%d",&input_number);
for(index_number=1;;index_number++)
if(((sum_number1-input_number)%2==0)&&((sum_number1-input_number)>=0))
break;
else
sum_number1=sum_number1+index_number;
printf("the key is %d\n",index_number-1);
sum_number2=(sum_number1-input_number)/2;
key_number=index_number-1;
for(key_number;key_number>0;key_number--)
if(sum_number2-key_number>=0)
{
sub_array[array_index1]=key_number;
array_index1++;
sum_number2=sum_number2-key_number;
}
printf("%d=",input_number);
for(output_number=1;output_number<=(index_number-1);output_number++)
{
for(array_index2=0;array_index2<array_index1;array_index2++)
{
ok=true;
if(output_number==sub_array[array_index2])
{
printf("-%d",output_number);
ok=false;
break;
}
}
if(ok)
printf("+%d",output_number);
}
printf("\n\n");
}
return 0;
}

ForestDB 2008-04-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ljq279318147 的回复:]
假设1~ n的和sum
如果((sum - A) % 2) == 0 && sum > A就行了
[/Quote]
为啥?
lukeamon 2008-04-23
  • 打赏
  • 举报
回复
原理说明一下啊。
lee213 2008-04-22
  • 打赏
  • 举报
回复
楼上的厉害,学习ing……
Alix-Lei 2008-04-22
  • 打赏
  • 举报
回复
按照思路写了个简单的实现,也可以用递归实现
#include <stdio.h>

int main()
{
int i;
int sum = 0;
int count = 0;
int num;
printf("Enter the num you want:");
scanf("%d",&num);
for(i = 1;i <= 1000;i++)
{
count ++;
sum += i;
if(sum == num)
{
printf("%d ",count);
return 0;
}
if(sum < num && (sum + count + 1) > num)
{
for(i;i < 1000;i++)
{
count++;
sum += count;
if(((sum - num) % 2) == 0)
{
printf("%d ",count);
return 0;
}
else
{
for(i;i <= 1000;i++)
{
count++;
sum += count;
if(((sum - num) % 2) == 0)
{
printf("%d ",count);
return 0;
}
}
}
}
}
}
return 0;
}
Alix-Lei 2008-04-22
  • 打赏
  • 举报
回复
假设1~ n的和sum
如果((sum - A) % 2) == 0 && sum > A就行了
darkarthur 2008-04-22
  • 打赏
  • 举报
回复
貌似在ACM上看到过这样的题目~
一下子找不到代码了
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ForestDB 的回复:]
帮顶,看谁能给个好算法.
[/Quote]
jieao111 2008-04-22
  • 打赏
  • 举报
回复
sc
ForestDB 2008-04-22
  • 打赏
  • 举报
回复
帮顶,看谁能给个好算法.

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧