用c语言编写一个程序

用c语言编写一个程序:对于一个自然数n(n<=50),统计具有下列数字的个数,并输出所有符合条件的数字:自然数n,在n的左边加上一个自然数,但该自然数不能超过原数的一半;继续按此规则进行处理,直到不能加自然数为止。例如当n=6时,符合条件条件的是:6,16,26,36,126,136共6个;当n=5时,符合条件的是:5,15,25,125.(0也是自然数,所以要加上本身)。。。求高手帮我解答!!!!定感激涕零!!!
这题可能理解起来可能有误,我先解释一下(教材解释的):当n是一位数时,例如n=6时,可在6之前加1、2、3得到16,26,36,,当加完以后,这个自然数n就变成了1,2,3。当n=1时,不能再加了,n=2时,得到126;n=3时,得到136。之后就再也不能加了。则一共有6个数字符合条件;当n是两位数时,例如,n=12,在12之前可加1、2、3、4、5、6,得到112,212,312,,421,512,612。这时n就变成了1、2、3、4、5、6,再根据不同的n求不同的值,直到不能再加为止,可得:1212,1312,1412,2412,1512,2512,1612,2612,3612;这时n就变成了1,2,3,继续得到12412,12512,12612,13612,。加上本身n=12这个数,则一共有20个数字符合题目所给条件。我搞了半天,就是没有完全搞定,帮帮我罗!!!

应该多给几个例子,n=10的时候如何处理?得到10,110,210,1210等等?
若是这样的,试试下面程序:
/*
用c语言编写一个程序:对于一个自然数n(n<=50),统计具有下列数字的个数,
并输出所有符合条件的数字:自然数n,在n的左边加上一个自然数,
但该自然数不能超过原数的一半;继续按此规则进行处理,直到不能加自然数为止。
例如当n=6时,符合条件条件的是:6,16,26,36,126,136共6个;
当n=5时,符合条件的是:5,15,25,125.(0也是自然数,所以要加上本身)。。。
*/
#include <stdio.h>
#include <stdlib.h>
int g_count=0;
void fun(int n,int d,int b)
{
int i;
printf("%8d ",d);
g_count++;
if(g_count%8==0) printf("\n");
for(i=1;i<=n/2;i++)
{
fun(i,i*b+d,b*10);
}
}
void result(int n)
{
int t=n,d=n,b=10;
printf("result:\n");
g_count=0;
while(t>=10)
{
t/=10;
b*=10;
}
fun(n,d,b);
printf("\ntotal %d numbers\n\n",g_count);
}
int main()
{
int n;
printf("input n(n<=50):\n");
while(scanf("%d",&n)!=EOF)
{
if(n>=0&&n<=50) result(n);
printf("input n(n<=50):\n");
}
return 0;
}

我这,若是放开n的限制,n=200的时候,计算花掉20多秒吧,总共205658个。
n=300的话,算了几分钟都没结束。估计也得使用long long数据类型了。使用递归不是最快的,重复计算多。

百度推荐也不求真相?有误导了吧。

对于楼主新补充的提升,我的程序是这样做的,满足你的要求。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-07-12
不知道有没有理解错,你的例题中当n=6时,符合条件条件的是:6,16,26,36,126,136共6个
我认为126,136,不符合条件 左边的数12 13 都比6大了,自然数n,在n的左边加上一个自然数,但该自然数不能超过原数的一半,你的题目要求不能超过原数的一半,所以我舍弃了
#include<stdio.h>
int main()
{
int n;
int i;
printf("please input a number(n<=50)\n");
scanf("%d",&n);
for(i = 0; i <= n / 2;i++)
{
if(n < 10)
printf("%-4d",n + i*10);
else
printf("%-4d",n + i*100);
}
printf("\n");
return 0;
}本回答被网友采纳
第2个回答  2012-07-12
#include<stdio.h>
int main(){
int a[51]={0,1},i;
for(i=2;i<=50;++i)
a[i]=a[i-1] + (i%2?0:a[i/2]);
while(scanf("%d",&i)!=EOF)
if(i>0&&i<=50)printf("%d\n",a[i]);
return 0;
}
希望能帮到你追问

哦哦,谢谢了,额。。。这个我已经搞定了,但我还想我这些数字全部输出来,这个我真的就不知道做了,纠结。。。,,,嘿嘿。。。这个。。。,好人做到底,麻烦你就再帮我一下吧,先谢谢啦!!!

相似回答