C算法列子Word文档格式.docx
《C算法列子Word文档格式.docx》由会员分享,可在线阅读,更多相关《C算法列子Word文档格式.docx(85页珍藏版)》请在冰豆网上搜索。
n++)
s=s+n;
if(s>
1000)
break;
n=%d\n"
n-1);
解2:
intk,n,s;
n=1;
while(s<
k=n;
n++;
k);
4.求1+22+32+42+……+102。
=10;
s=s+n*n;
s=%d\n"
s);
5.求1+(1+2)+(1+2+3)+…+(1+2+3+…+10)的值。
解法1(用双循环)
main()
inti,t,s;
s=0;
for(i=1;
=5;
i=i+1)
{
t=0;
for(j=1;
j<
=i;
j++)
t=t+j;
s=s+t;
}
解法2(用单循环)
inti,j,t,s;
t=0;
{t=t+i;
s=s+t;
6.求1+1/3+1/5+1/7+……+1/99的值。
floati,s;
s=0;
for(i=1;
=99;
i+=2)
s=s+1.0/i;
printf("
s=%f\n"
7.求1+1/32+1/52+1/72+……+1/992的值。
s=s+1.0/(i*i);
8.求1-1/2+1/3-1/4+……+1/99的值。
ints;
floati,t,p;
p=1;
s=1;
/*第一项1,作为累加变量的初值*/
for(i=2;
=4;
s=-s;
t=s/i;
/*先求各项*/
p=p+t;
/*累加各项*/
p=%f\n"
p);
9.求π的近视值π/4=1-1/3+1/5-1/7+……,直到最后一项的绝对值小于10的负6次方为止。
math.h"
floatn,t,pi;
t=1,pi=0;
n=1.0;
while(fabs(t)>
=1e-6)
{pi=pi+t;
n=n+2;
t=s/n;
pi=pi*4;
pi=%10.6f\n"
pi);
解:
用语句:
s=-s,控制各项和符号。
10.求1+3/5+5/9+7/13+……+97/193的值。
floati,t,s;
s=1;
for(i=3;
=97;
s=s+i/(2*i-1);
11.求1-3/5+5/9-7/13+……-97/193的值。
floati,p,t,s;
s=-s;
p=p+s*i/(2*i-1);
12.求1┿21┿22┿23┿24┿………┿263之值。
math.h>
/*求幂pow(),要用此头函数*/
inti;
doubles;
=63;
s=s+pow(2,i);
%e\n"
doublen,s;
n=n*2;
13.求1┿1/3┿1/3×
2/5┿1/3×
2/5×
3/7┿1/3×
3/7×
4/9┿……前10项之和。
doublea,b,t,s;
a=0,b=1;
t=1;
a=a+1;
b=b+2;
t=t*a/b;
%lf\n"
14.求用下列级数的前21项之和计算自然对数之底℮的近似值。
1,1/1!
,1/2!
,1/3!
,……,1/(N-1)!
doublet,s;
/*第一项赋为初值*/
=20;
t=t*i;
/*分母连乘*/
s=s+1/t;
15.求1×
1┿2×
2┿3×
4┿4×
8┿n×
2n-1……前10项之和。
inti,s;
s=s+i*pow(2,i-1);
inti,n,s;
s=s+i*n;
16.求10!
的值。
{inti;
longt;
//求i的阶乘
%ld\n"
t);
17.编一程序求1!
+3!
+5!
+7!
+9!
。
{inti,j;
longt,s;
=9;
i=i+2)
{t=1;
for(j=1;
j++)//求i的阶乘
t=t*j;
s=s+t;
//累加i的阶乘
18.求1!
+2!
+……+20!
的值。
解法1(用单循环):
t=t*i;
解法2(用双循环):
{inti,j;
for(j=1;
j++)//求i的阶乘
19.求1+1/2!
+1/3!
+1/4!
+……,前10项之和。
s=s+1/t;
//累加i的阶乘的倒数
20.求a+aa+aaa+aaaa+aaaaa+……的值,其中a和项数由自己确定。
inta,n,s=0,t=0,k=1;
inputa,n:
"
);
scanf("
%d,%d"
&
a,&
n);
while(k<
=n)
t=t*10+a;
k++;
a=%d,n=%d\n"
a,n);
a+aa+aaa+aaaa...=%d\n"
21.求分数序列2/1,3/2,5/3,8/5,13/8,……前20项之和。
(后一项的分子,等于前一项分子与分母之和)
{
intn,t;
floata=2,b=1,s=0;
s=s+a/b;
t=a;
/*先把分子a赋给t暂时保存*/
a=a+b;
/*把a+b赋给后一个分子a*/
b=t;
/*再把暂存的前一个分子,赋给后一个分母*/
22.求分数序列1/2,2/3,3/5,5/8,8/13,……前20项之和。
(后一项的分母,等于前一项分子与分母之和)
floata=1,b=2,s=0;
t=b;
/*先把分母赋给t暂时保存*/
b=a+b;
/*把a+b赋给后一个分母b*/
a=t;
/*再把暂存的前一个分母,赋给后一个分子*/
23.判断输入的一个整数是否能被3或7整除,若能整除输出“YES”否则输出“NO”
{intk;
printf("
Enteraintnumber:
scanf("
%d"
k);
if(k%3==0||k%7==0)
YES\n"
else
NO\n"
24.一个数用3除余2,用5除余3,用7除余5,求出其中最小的一个数。
longn;
while
(1)
if(n%3==2&
&
n%5==3&
n%7==5)
n=%ld\n"
n);
25.求出1000以内的3除余2,5除余3,7除余2的数。
{intn;
n%7==2)
26.下面程序从读入的整数数据中,统计大于0的整数个数i和小于0的整数个数j,当输入0时,程序运行结束。
#include<
voidmain()
{intn,i,j;
printf(“Inputintnumbers,with0toend:
”);
i=j=0;
scanf(“%d”,&
while(n!
=0)
{if(n>
0)i=i+1;
if(n<
0)j=j+1;
scanf(“%d”,&
/*继续输入下一个数*/
printf(“i=%d,j=%d\n”,i,j);
27.下面程序输入一个学生的生日(年:
y0,月:
m0,日:
d0),并输入当前日期(年:
y1,月:
m1,日:
d1)。
求出该学生的实足年龄。
#include<
main()
{intage,y0,m0,d0,y1,m1,d1;
输入生日日期(年、月、日)"
scanf("
%d,%d,%d"
&
y0,&
m0,&
d0);
输入当前日期(年、月、日)"
y1,&
m1,&
d1);
age=y1-y0;
if(m0>
m1)age--;
//如果出生月份>
当前月份,年龄减1岁
if((m0==m1)&
(d0>
d1))age--;
/*如果出生月份=当前月份,但出生日>
当前日,年龄减1岁*/
age=%3d\n"
age);
28.
/*若输入2003年3月5日,则输出是2003年第64天*/
/*反过来,若输入2003年第64天,则输出3月5日*/
intday_tab[][13]={
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31},
};
voidmain(void)
intday_of_year(intyear,intmonth,intday);
intmonth_day(intyear,intyearday);
inty,m,d;
Inputyear,month,day:
y,&
m,&
d);
%d年第%d天\n"
y,day_of_year(y,m,d));
/*打印天数*/
Inputyear,dayth:
month_day(y,d);
/*求月份数、当月第几天*/
intday_of_year(intyear,intmonth,intday)/*输入年、月、日,求是该年第几天*/
inti,leap;
/*闰年leap=1,非闰年leap=0*/
leap=year%4==0&
year%100==0||year%400==0;
month;
i++)/*i从1开始,不用第0月*/
day+=day_tab[leap][i];
/*若是2003年3月5号,则累加1月、2月的天数*/
return(day);
intmonth_day(intyear,intyearday)/*输入年、天数,求是该年几月几日*/
year%100!
=0||year%400==0;
yearday>
day_tab[leap][i];
yearday-=day_tab[leap][i];
/*若是2003年第64天,则减去1月,2月的天数*/
/*i是月份数,剩下的yearday是当月天数*/
%d月"
i);
/*打印月份*/
%d日\n"
yearday);
/*打印天数*/
/*运行情况:
2003,3,5
2003年第64天
2003,64
3月5日
*/
29.
二、枚举法
1.(枚举法)求解百鸡问题。
鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问鸡翁、母、雏各几何?
{intx,y,z;
for(x=1;
x<
18;
x++)
for(y=1;
y<
31;
y++)
{z=100-x-y;
if(5*x+3*y+z/3.0==100)//C语言中不能除以3
cock=%d,hen=%d,chick=%d\n"
x,y,z);
2.(枚举法)求满足ijk+kji=1333的i,j,k的值(i,j,k均是一位数)。
此问题实际是:
一个三位数,三位数字顺排倒排组成的两个三位数之和等于1333,求这个三位数的三位数字。
inti,j,k;
for(j=0;
for(k=1;
k<
k++)
if((i*100+j*10+k)+(k*100+j*10+i)==1333)
printf("
i=%d,j=%d,k=%d\n"
i,j,k);
3.
4.
三、排序
1.以下程序不用第三个变量,实现将两个数进行对调的操作。
#include“stdio.h”
{inta,b;
scafn(“%d%d”,&
b);
printf(“a=%d,b=%d\n”,a,b);
b=a-b;
a=a-b;
2.选择法排序
#include<
voidsort();
inti,j,k,t,a[10];
enterarraya[10]"
10;
a[i]);
k=i;
for(j=i+1;
if(a[j]>
a[k])k=j;
if(k!
=i)
{t=a[i];
a[i]=a[k];
a[k]=t;
%d"
a[i]);
\n"
3.冒泡法排序
inta[11];
/*不用0下标,故定义a[11]*/
inti,j,t;
Input10numbers:
11;
j++)/*控制比较的轮数为9轮*/
=10-j;
i++)/*从第1个元素开始,往下进行比较*/
if(a[i]>
a[i+1])/*若上面元素大于下面的元素,则交换*/
{t=a[i];
a[i]=a[i+1];
a[i+1]=t;
Thesorttednumbers:
getch();
4.D
5.
四、数组
1.(最大数、最小数)求出十个数中的最大数,最小数及其序号。
inta[10]={1,-3,-7,9,11,0,4,32,25,10};
inti,max,min,n1,n2;
arraya:
"
9;
%d,"
/*注意输出格式的控制*/
max=min=a[0];
n1=n2=0;
/*设0号元素最大、最小,n1,n2记序号*/
if(a[i]>
max)/*若a[i]大于max*/
{
max=a[i];
/*把a[i]赋给max*/
n1=i;
/*同时用n1记最大数的序号i*/
else/*否则*/
if(a[i]<
min)/*若a[i]小于min*/
{
min=a[i];
/*把a[i]赋给min*/
n2=i;
/*同时用n2记最小数的序号i*/
}