整数部分为零,小数部分各位数字相同的小数称为同码小数,例如0.3,0.33,0.333,.......是同数码3的小数,记这些小数的前五项之和为s(3,5),记前五项的加权和为w(3,5),一般的记:
s(d,n) = 0.d+0.dd+0.ddd+0,dddd+.......+0.d......d
w(d,n) = 0.d+0.dd*2+0.ddd*3+........+n*0.d.......d
两和式为n项之和,其中第k项小数点后有k个数字d,加权和第k项的权系数为k。
枚举设计描述
//求s(d,n)与w(d,n),并比较和s与w共有多少个小数位对应数字相同 #include<stdio.h> #include<math.h> main(){ int d,j,m,n; long t,s[10000],w[10000]; printf(" 请输入整数d,n:"); scanf("%d,%d",&d,&n); for(j=0;j<=n;j++){ s[j]=0; w[j]=0; //s,w数组清零 } for(t=0,j=n;j>=1;j--) { t=t+j; //t表示小数点后数的累加,且t只与w[j]有关,t会一直累加而不是运行一次就初始化 s[j]=(n+1-j)*d; //s[j]表示和s小数点后第j位的共n+1-j个d的和; w[j]=t*d; //加权和w小数点后第j位共t个d之和 } for(j=n;j>=1;j--) //从后往前逐一进位 { s[j-1]=s[j-1]+s[j]/10; s[j]=s[j]%10; w[j-1]=w[j-1]+w[j]/10; w[j] = w[j]%10; } m = 0; for(j=1;j<=n;j++) //比较相应小数位上s与w数字相同的位数 { if(s[j]==w[j]) m++; } printf(" s(%d,%d)=%ld.",d,n,s[0]); //输出和s,w for(j=1;j<=n;j++) printf("%ld",s[j]); printf("\n w(%d,%d)=%ld.",d,n,w[0]); for(j=0;j<=n;j++) printf("%ld",w[j]); printf("\n 和s与w共有%d个小数位对应数字相同.\n",m); }