其他数学计算Word格式.docx
《其他数学计算Word格式.docx》由会员分享,可在线阅读,更多相关《其他数学计算Word格式.docx(23页珍藏版)》请在冰点文库上搜索。
voidCompute(void)
voidmain()
inti;
for(i=0;
i<
MAX;
i++)xx[i]=0;
if(ReadDat()){
printf("
数据文件IN.DAT不能打开!
\007\n"
);
return;
Compute()
ODD=%d\nOVEN=%d\nAVER=%1f\nTOTFC=%lf\n"
odd,ave1,ave2,totfc);
writeDat();
voidWriteDat(void)
fp=fopen("
OUT.DAT"
w"
fprintf(fp,"
%d\n%lf\n%lf\n%lf\n"
}
--------------------------------------------------------------------------------
/*注:
注意该题还要编制读函数readdat(),在读函数中格式输入符的一定要加逗号。
在compute()函数中算方差的方式也要注意哦!
*/
intReadDat(void)
FILE*fp;
in.dat"
"
r"
))==NULL)return1;
i++)
{fscanf(fp,"
%d,"
&
xx[i]);
if(feof(fp))break;
fclose(fp);
return0;
inti,yy[1000];
if(xx[i]%2)
{odd++;
ave1+=xx[i];
yy[odd-1]=xx[i];
else
{even++;
ave2+=xx[i];
ave1/=odd;
ave2/=even;
odd;
totfc+=(yy[i]-ave1)*(yy[i]-ave1)/odd;
43、请编写函数countvalue(),它的功能是:
求n以内(不包括n)同时能被3和7整数的
所有自然数之和的平方根s,并作为函数值返回,最后结果s输出到文件out.dat中。
例如若n为1000时,函数值应为:
s=153.909064。
请勿改动主函数main()和输入输出数据函数progreadwrite()的内容。
#include<
conio.h>
math.h>
doublecountvalue(intn)
main()
clrscr();
s=%f\n"
countvalue(1000));
progreadwrite();
progreadwrite()
FILE*fp,*wf;
inti,n;
floats;
if(fp==NULL)
{printf("
Can'
topenthedatafilein.dat\007\n"
wf=fopen("
out.dat"
w"
10;
%d"
n);
s=countvalue(n);
fprintf(wf,"
%f\n"
s);
fclose(wf);
由于能同时被3和7整除的自然数最小的是21,而它们之间的间隔应是21(由最小
公倍数可得)。
因而在for()循环可定成如下形式。
floats=0.0;
for(i=21;
n;
i+=21)
s+=i;
s=sqrt(s);
returns;
55、下列程序的功能是:
计算出自然数SIX和NINE,它们满足的条件是SIX+SIX+SIX=NIN
E+NINE的个数cnt,以及满足此条件所有的SIX与NINE的和SUM。
请编写函数countvalue(
)实现程序的要求,最后调用函数writedat()把结果cnt和sum,输出到文件out15.dat中
。
其中S,I,X,N,E各代表一个十进制数字。
longcnt,sum;
voidcountValue()
{
cnt=sum=0;
countValue();
cnt=%d\n"
cnt);
sum=%ld\n"
sum);
writeDAT();
writeDAT()
OUT11.DAT"
fprintf(fp,"
%d\n%d\n"
cnt,sum);
由于有SIX+SIX+SIX=NINE+NINE可看出SIX的3倍必须大于等于2000(右边是一个
四位数字的数可知),因此从666开始循环,再由三个数的和是个偶数(右边为一个数的
2倍可知)可循环时步长为2。
再由SIX和NINE中有一个共同数字I所以得出第一个if()判
断,还有NINE中有一共同数字N所以得出第二个if()判断。
{inti;
\n"
for(i=666;
=999;
i=i+2)
if(i/10%10==(3*i/2)/100%10)/*以I为准*/
{cnt++;
sum+=i+3*i/2;
_________________________________
本人只是为了上机能通过,不追求什么算法速度,答案仅供大家参考,
cnt=0;
sum=0;
for(i=1000;
1500;
if(i/1000==i/10%10&
&
((2*i)/3)*3==(i+i))/*以N为准*/
{
cnt++;
sum+=i*5/3;
57、下列程序的功能是:
利用发下所示的简单迭代方法求方程:
cos(x)-x=0的一个实根。
xn+1=cos(xn)
迭代步骤如下:
(1)取X1初值为0.0;
(2)X0=X1,把X1的值赋给X0;
(3)X1=COS(X0),求出一个新的X1;
(4)若X0-X1绝对值小0.000001,执行步骤(5),否则执行步骤
(2);
(5)所求X1就是方程cos(X)-X=0的一个实根,作为函数值返回。
请编写函数countValue()实现程序的要求,最后调用函数WRITEDAT()把结果输出到
文件OUT17.DAT中。
请勿改动主函数main()和输出数据函数writeDAT()的内容。
floatcountValue()
A=%f\n"
countValue());
cos(countValue())-countValue());
FILE*wf;
out17.dat"
该迭代法的基本算法是:
反复赋值直到x0-x1的绝对值小于0.00001。
故而可用do-while循环。
这是一个典型的算法。
floatx0,x1=0.0;
do
{x0=x1;
x1=cos(x0);
}while(fabs(x0-x1)>
=0.000001);
returnx1;
59、请编写函数voidcountvalue(int*a,int*n),它的功能是:
求出1到1000之内能
被7或11整除但不能同时被7和11整除的所有整数放在数组a中,并通过n返回这些数的个
数。
voidcountValue(int*a,int*n)
intaa[1000],n,k;
countValue(aa,&
for(k=0;
k<
k++)
if((k+1)%10==0)printf("
elseprintf("
%5d"
aa[k]);
out19.dat"
for(k=0;
if((k+1)%10==0)fprintf(fp,"
elsefprintf(fp,"
由于7和11的最小公倍数为77故而可用i%77!
=0来表示不能同时被7和11整除。
在
a[(*n)++]=i,中必须有小括号,这是由于*与++的运算优先级别相同,而它们的结合方
向是自右向左,如不用括号则变成n所指的地址向前移一位,但本题要的是n所指的变量
的值增加1。
*n=0;
for(i=7;
1000;
if((i%7==0||i%11==0)&
i%77!
=0)
a[(*n)++]=i;
64、请编制函数READDAT()实现从文件IN.DAT中读取1000个十进制整数到数组XX中;
再
编制函数COMPUTE()分别计算出XX中奇数的个数ODD,偶数的个数EVEN,平均值`AVER以及方
差TOTFE的值,最后调用函数WRITEDAT()把结果输出到OUT.DAT文件中.
计算方差的公式如下:
原始数据文件存放的格式是:
每行存放10个数,并用逗号隔开(每个数均大于0且小于等于
2000).
intxx[MAX],odd=0,even=0;
doubleaver=0.0,totfc=0.0;
voidWriteDat(void);
inti;
xx[i]=0;
if(ReadDat())
topenthedatafilein.dat!
);
Compute();
ODD=%d\nEVEN=%d\nAVER=%lf\nTOTFC=%lf\n"
odd,even,aver,t
otfc);
WriteDat();
"
%d\n%d\n%lf\n%lf\n"
odd,even,aver,totfc);
{aver+=xx[i];
odd++;
even++;
aver/=(odd+even);
totfc+=(xx[i]-aver)*(xx[i]-aver)/(odd+even);
66、请编制函数READDAT()实现从文件IN.DAT中读取1000个十进制整数到数组XX中;
编制函数COMPUTE()分别计算出XX中偶数的个数EVEN,奇数的平均值`AVE1,偶数的平均值
AVE2以所有偶数的方差TOTFC的值,最后调用函数WRITEDAT()把结果输出到OUT.DAT文件中
.
设N为偶数的个数,XX[I]为偶数,AVE2为偶数的平均值.
EVEN=%d\nAVE1=%lf\nAVE2=%lf\nTOTFC=%lf\n"
even,ave1,ave
2,totfc);
%d\n%lf\n%lf\n%lf\n"
even,ave1,ave2,totfc);
yy[even-1]=xx[i];
even;
totfc+=(yy[i]-ave2)*(yy[i]-ave2)/even;
78、下列程序的功能是:
设A,B,C为三个不零的正整数,计算并输出下列不定方程组解
的个数CNT以及满足此条件的所有A,B,C之和SUM。
不定方程组为:
A+B+C=13
A-C=5
请编写函数COUNTVALUE()实现程序要求,最后调用函数WRITEDAT()把结果CNT和SUM
输出到文件OUT.DAT中.
intcnt,sum;
voidcountvalue()
countvalue();
sum=%d\n"
writedat();
writedat()
由A-C=5对A+B+C=13进行变换可得B=18-2*A,题中要求三个数都要大于0,所以A
必须从6开始(为了保证C不小于等于0),进而可得只要B大于0即可(即18-2*A>
0)。
inta;
for(a=6;
a<
13;
a++)
if(18-2*a>
0)
sum+=13;
086题下列程序的功能是:
寻找并输出11至999之间的数m,它满足m,m2和m3均为回文数。
所谓回文数是指其各位数字左右对称的整数,例如121,676,94249等。
满足上述条件的数如m=11,m2=121,m3=1331皆为回文数。
请编制函数intjsValue(longm)实现此功能,如果是回文数,则函数返回1,反之则返回0。
最后把结果输出到文件out.dat中。
请勿改动主函数main()的内容。
intjsValue(longn)
longm;
FILE*out;
out=fopen(\out.dat\,\w\);
for(m=11;
m<
m++){
if(jsValue(m)&
jsValue(m*m)&
jsValue(m*m*m)){
printf(\m=%41d,m*m=%61d,m*m*m=%81d\\n\,m,m*m,m*m*m);
fclose(out);
intjsvalue(longn)
{inti,strl,half;
charxy[20];
itoa(n,xy,10);
strl=strlen(xy);
half=strl/2;
iif(xy[i]!
=xy[--strl])break;
if(i>
=half)return1;
elsereturn0;
本人只是为了上机能通过,不追求什么算法速度,答案仅供大家参考.
inti,aa[10],j=0,b=1;
/*n为“long”型,n的三次方最多达到10位,所以定义为aa[10]*/
while(n)
aa[j++]=n%10;
/*将数拆散后依次按最高位到最低位(万-》千-》百-》十-》个位)的次序放入数组aa中*/
n=n/10;
j/2;
if(aa[i]!
=aa[j-i-1])b=0;
returnb;
088题编写函数jsValue,它的功能是:
求Fibonacci数列中大于t的最小的一个数,结果由函数返回。
其中Fibonacci数列F(n)的定义为:
F(0)=0,F
(1)=1
F(n)=F(n-1)+F(n-2)
最后调用函数writeDat()读取10个数据t,分别得出结果且把结果输出到文件out.dat中。
例如:
当t=1000时,函数值为:
1597。
请勿改动主函数main()和写函数writeDat()的内容。
intjsValue(intt)
intn;
n=1000;
printf(\n=%d,f=%d\\n\,n,jsValue(n));
writeDat()
FILE*in,*out;
inti,n,s;
in=fopen(\in.dat\,\r\);
i++){
fscanf(in,\%d\