主题:请教高手
C行天下
[专家分:10] 发布于 2010-04-19 12:42:00
以下是在一本书里看到的计算:1+11+111+1111.......数列的程序,但经验证感觉有错,修改了一下,程序二,但还是错,找不到原因,求各位高手指点一下,谢谢!
书上原程序:
#include"stdio.h"
#include"math.h"
main()
{
int a,x,n=1;
long i=1,tn,sum=0;
scanf("%d%d",&a,&x);
tn=a;
while(n<=x)
{
sum+=tn;
tn=tn*10+x;
n++;
}
printf("result is %ld",sum);
getch();
}
[color=FF0000]此程序运行:当a=1,x=2时,输出为13,结果显然是错误的;[/color]
修改后程序二:
#include"stdio.h"
#include"math.h"
main()
{
int a,x,n=1;
long tn;
scanf("%d%d",&a,&x);
tn=a;
while(n<x[color=FF0000])/*去掉了“=”*/[/color]
{
tn=tn*10+x[color=800000];/*去掉了sum一行,直接用tn代替*/[/color]
n++;
}
printf("result is %ld",tn);/[color=FF0000]*用tn代替sum输出*/[/color]
getch();
}
本人觉得tn=tn*10+x就能达到求和sum的功能,因此去掉了sum,但是当x>=3时还是有错误,不知何故?
最后更新于:2010-04-19 12:46:00
回复列表 (共16个回复)
沙发
PP_make [专家分:60] 发布于 2010-04-19 17:47:00
你的算法好像不对,看了半天没看懂 。 其中的一种思路,是拆分成:个位,十位,百位.....再进行求和
下面的程序参考一下,也许对你有些帮助:
#include<stdio.h>
int main(void)
{
int i,j,flag;
int num,m=1,sum;
printf("The sum of number\n");
scanf("%d",&num);
sum=num;
for(i=1,j=1;num-i>0;i++,j++)
{
for(flag=1;flag<=num-i;flag++)
{
m*=10;
}
m*=j;
sum+=m;
m=1;
}
printf("%d\n",sum);
return 0;
}
板凳
雪光风剑 [专家分:27190] 发布于 2010-04-19 19:11:00
为什么会有两个输入?分别代表什么?
3 楼
C行天下 [专家分:10] 发布于 2010-04-19 22:01:00
因为此求和函数为:a+aa+aaa+......+.....,a代表初值,x代表有项,假如输入a=1,x=3,则是求1+11+111的值。
4 楼
C行天下 [专家分:10] 发布于 2010-04-19 22:08:00
[quote]你的算法好像不对,看了半天没看懂 。 其中的一种思路,是拆分成:个位,十位,百位.....再进行求和
下面的程序参考一下,也许对你有些帮助:
#include<stdio.h>
int main(void)
{
int i,j,flag;
int num,m=1,sum;
printf("The sum of number\n");
scanf("%d",&num);
sum=num;
for(i=1,j=1;num-i>0;i++,j++)
{
for(flag=1;flag<=num-i;flag++)
{
m*=10;
}
m*=j;
sum+=m;
m=1;
}
printf("%d\n",sum);
return 0;
}
[/quote]
谢谢,虽然与我所要求的不一样,但是具有参考价值!
5 楼
雪光风剑 [专家分:27190] 发布于 2010-04-19 22:41:00
思路有问题,如果进位的话程序就会出错
6 楼
C行天下 [专家分:10] 发布于 2010-04-19 22:48:00
[quote]思路有问题,如果进位的话程序就会出错[/quote]
我也知道思路有问题,麻烦指出哪里有问题,估计就错在算法那里。谢谢!
7 楼
雪光风剑 [专家分:27190] 发布于 2010-04-19 22:57:00
按照你的算法,1+11+111的计算过程变成了:1 13 133
显然是错的,先不要想优化计算,先写出最普通的计算方法吧
实现如下过程:
定义加数,结果,赋初值
循环
结果与加数相加
加数增长一位
8 楼
PP_make [专家分:60] 发布于 2010-04-19 23:00:00
如果要是按你的要求的话,添加个a ,就行了!
以下就是最终的程序,反正也就是这个思路:
#include<stdio.h>
int main(void)
{
int i,j,flag;
int num,a,m=1,sum; //a代表初值,num 代表有项
printf("The sum of number and the a :\n");
scanf("%d,%d",&num,&a);
sum=num*a;
for(i=1,j=1;num-i>0;i++,j++)
{
for(flag=1;flag<=num-i;flag++)
{
m*=10;
}
m*=j*a;
sum+=m;
m=1;
}
printf("%d\n",sum);
return 0;
}
9 楼
雪光风剑 [专家分:27190] 发布于 2010-04-19 23:05:00
[quote]如果要是按你的要求的话,添加个a ,就行了!
以下就是最终的程序,反正也就是这个思路:
#include<stdio.h>
int main(void)
{
int i,j,flag;
int num,a,m=1,sum; //a代表初值,num 代表有项
printf("The sum of number and the a :\n");
scanf("%d,%d",&num,&a);
sum=num*a;
for(i=1,j=1;num-i>0;i++,j++)
{
for(flag=1;flag<=num-i;flag++)
{
m*=10;
}
m*=j*a;
sum+=m;
m=1;
}
printf("%d\n",sum);
return 0;
}[/quote]
弯子绕的不小,虽然没看出算法错误吧……但是你图什么啊……开了这么多没必要的变量
10 楼
PP_make [专家分:60] 发布于 2010-04-19 23:05:00
我也想听听你的思路,能不能详细讲讲,谢谢了!!
我来回复