语言典型问题处理方法小结.docx

上传人:b****7 文档编号:25105246 上传时间:2023-06-05 格式:DOCX 页数:28 大小:22.63KB
下载 相关 举报
语言典型问题处理方法小结.docx_第1页
第1页 / 共28页
语言典型问题处理方法小结.docx_第2页
第2页 / 共28页
语言典型问题处理方法小结.docx_第3页
第3页 / 共28页
语言典型问题处理方法小结.docx_第4页
第4页 / 共28页
语言典型问题处理方法小结.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

语言典型问题处理方法小结.docx

《语言典型问题处理方法小结.docx》由会员分享,可在线阅读,更多相关《语言典型问题处理方法小结.docx(28页珍藏版)》请在冰豆网上搜索。

语言典型问题处理方法小结.docx

语言典型问题处理方法小结

c语言典型问题处理方法小结

一、循环问题

(1)、数论问题

1、求素数

for(i=2;i<=a;i++)

if(a%i==0)

break;

if(a==i)

printf("yes\n");

else

第一个if判断是否能被2,3,4……直到本身整除。

第二个if判断是否只能被本身整除。

printf("no\n");

素数概念:

对于某个整数a>1,如果它仅有平凡约数1和a,则我们称a为素数(或质数)。

整数1被称为基数,它既不是质数也不是合数。

整数0和所有负整数既不是素数,也不是合数。

2、求最大公约数和最小公倍数

a、

if(a>b)

{

t=a;

a=b;

b=t;

}

for(i=a;i>=1;i--)

if(a%i==0&&b%i==0)

break;

printf("largestcommondivisor:

%d\n",i);

printf("leastcommonmultiple:

%d\n",(a*b)/is);

b、辗转相除法求解

a1=a;

b1=b;

while(a%b!

=0)

{

t=a%b;

a=b;

b=t;

}

printf("largestcommondivisor:

%d\nleastcommonmultiple:

%d",b,a1*b1/b);

3、求完数

一个数如果恰好等于它的因子之和,这个数就称为“完数”。

例如:

6的因子为1、2、3,而6=1+2+3,因此6是“完数”。

for(a=1;a<=1000;a++)

{

s=0;

for(i=1;i<=a;i++)

if(a%i==0)

{

s+=i;

if(s>=a)

break;

}

if(s==a)

printf("%d\t",a);

注意S=0所放的位置

}

4、分解质因数

将一个整数写成几个质因数的连乘积,如:

输入36,则程序输出36=2*2*3*3。

解一、

看似简单,但要自己完整地写出来还真不容易!

竟然还动用了goto语句,正好可以熟悉一下goto语句的用法!

main()

{

inta,z,i;

clrscr();

scanf("%d",&a);

判断下一个数开始有要重新从2

开始了。

所以用loop语句回到for语句,这是for语句仍从2初始化。

从2开始的原则不变,变的是a的值。

loop:

for(z=2;z<=a;z++)

{

判断是否为质数

for(i=2;i<=z;i++)

if(z%i==0)

break;

判断是否为a的质因数

if(z==i)

if(a%z==0)

{

k++;

if(k==1)

printf("%d=%d",a1,z);

用计数器来解决每行输入不同的问题。

else

printf("*%d",z);

a/=z;

gotoloop;

}

}

}

解二:

main()

{intn,k=2,isfirst=1;

printf("Inputn=");scanf("%d",&n);

while(k<=n)

if(n%k==0)

{if(isfirst){printf("%d=%d",n,k);isfirst=0;}

elseprintf("*%d",k);

n/=k;

}

elsek++;

printf("\n");

}

5、从键盘输入两个整数,输出这两个整数的商的小数点后所有1000位整数

for(i=1;i<=1000;i++)

{

t=a%b;

主要体会除法运算中小数形成的原因

解决这类题目从本质出发

printf("%d",t*10/b);

a=t*10;

}

printf("\n");

6、编程计算并输出两个带分数的差。

带分数就是由一个整数和一个真分数合成的数,两个带分数(整数、分子、分母均大于0)从键盘输入,且带分数1大于带分数2,输入格式为:

整数1[分子1/分母1],整数2[分子2/分母2]。

差要求化简,整个输出样式为(如差为整数,则无分数部分,如差的整数为0,则无整数部分):

整数1[分子1/分母1]-整数2[分子2/分母2]=整数[分子/分母]

例如:

输入:

12[6/35],8[3/5]

输出:

12[6/35]-8[3/5]=3[4/7]

又如:

输入:

6[2/3],4[12/18]

输出:

6[2/3]-4[12/18]=2

又如:

输入:

9[7/8],9[3/8]

输出:

9[7/8]-9[3/8]=[1/2]

main()

{

intz1,fz1,fm1,fz1x,z2,fz2,fm2,fz2x,z,fz,fm,fzx,i;

scanf("%d[%d/%d],%d[%d/%d]",&z1,&fz1,&fm1,&z2,&fz2,&fm2);

fz1x=z1*fm1+fz1;

fz2x=z2*fm2+fz2;

fm=fm1*fm2;

fz=fz1x*fm2-fz2x*fm1;

for(i=fm;i>=2;i--)

if(fm%i==0&&fz%i==0)

{

fz/=i;

fm/=i;

}

z=fz/fm;

fzx=fz%fm;

if(fzx==0)

printf("%d[%d/%d]-%d[%d/%d]=%d\n",z1,fz1,fm1,z2,fz2,fm2,z);

elseif(z==0)

printf("%d[%d/%d]-%d[%d/%d]=[%d/%d]\n",z1,fz1,fm1,z2,fz2,fm2,fzx,fm);

else

printf("%d[%d/%d]-%d[%d/%d]=%d[%d/%d]\n",z1,fz1,fm1,z2,fz2,fm2,z,fzx,fm);

}

(2)近似问题

1、书P122习题4-6

注意千万不要忘记添加

#include“math.h”

#include"math.h"

main()

{

floatx,j=1,k,s,so;

intn;

scanf("%f",&x);

s=x;

so=x+1;

for(n=1;fabs(s-so)>1e-6;n++)

{

for(k=1;k<=n;k++)

j*=k;

so=s;

if(n%2!

=0)

s-=x*x*x/((2*n-1)*j);

else

s+=x*x*x/((2*n-1)*j);

}

printf("%f\n",s);

2、解方程问题:

编程用二分法求解方程x3+4x2-10=0的解。

#include"math.h"

main()

{

可以省略此句

floatx,x1=1,x2=4,f1=-1,f;

/*f1=x1*x1*x1+4*x1*x1-10;*/

while(fabs(x2-x1)>1e-6)

{

x=(x1+x2)/2;

f=x*x*x+4*x*x-10;

可以用/*if(f*f1<0)*/替代

if(f>0)

x2=x;

else

x1=x;

}

printf("%f\n",x);

}

(3)枚举法

(4)数列问题

二、数组问题

(1)排序问题

1、从小到大排序

main()

{

inta[10],i,j,t;

for(i=0;i<10;i++)

scanf("%d",&a[i]);

for(i=1;i<10;i++)

for(j=0;j<10-i;j++)

if(a[j]>a[j+1])

{

t=a[j+1];

a[j+1]=a[j];

a[j]=t;

}

for(i=0;i<10;i++)

printf("%d",a[i]);

printf("\n");

注意排序问题:

1、须迅速,熟练,无差错

经常插入在程序中间

2、现使用最大数下沉冒泡法

还可以使用最小数上浮冒泡法

3、j控制前面一个数和后面一个数一一比较。

由于是最大数下沉,i+1后j仍要从0开始。

4、i控制这样的操作一共要做多少次

5、注意ij的控制次数

}

2、从大到小排序

main()

现使用最大数上浮冒泡法

还可使用最小数下沉冒泡法

{

inta[10],i,j,t;

for(i=0;i<10;i++)

scanf("%d",&a[i]);

for(i=1;i<10;i++)

for(j=9;j>=i;j--)

if(a[j]>a[j-1])

{

t=a[j-1];

a[j-1]=a[j];

a[j]=t;

}

for(i=0;i<10;i++)

printf("%d",a[i]);

}

(2)二维数组

三、字符或字符串输入输出问题

(1)字符打印

1、打印*

此类题的溯源为书P1224.11

(1),其他题都是它的拓展

for(i=1;i<=n;i++)一共要输出的行数

{

for(j=1;j<=i;j++)每行要打印的*数

printf("*");

printf("\n");

}

a、

*

**

***

****

解题要点:

此类题关键在于找到每行要打印的个数和行数的关系。

此题j==i

j==n-i+1

b、

****

***

**

*

for(i=1;i<=n;i++)一共要输出的行数

{

for(j=1;j<=n-i;j++)控制空格数

printf("");

for(k=1;k<=i;k++)每行要打印的*数

printf("*");

printf("\n");

}

c、

*

**

***

****

解题要点:

在出现空格的时候,在找到每行要打印的‘*’个数和行数的关系后,还应找到空格和行数的关系,分不同的参数进行循环。

此题k==ij==n-i

j==i-1

k==n-i+1

d、

****

***

for(i=1;i<=n;i++)

{

for(j=1;j<=n-i;j++)

printf("");

for(k=1;k<=2*i-1;k++)

printf("*");

printf("\n");

}

**

*

e、

*

***

*****

*******

for(i=1;i<=n-1;i++)

{

for(j=1;j<=i;j++)

printf("");

for(k=1;k<=2*(n-1-i)+1;k++)

printf("*");

printf("\n");

}

for(i=1;i<=n;i++)

{

for(j=1;j<=n-i;j++)

printf("");

for(k=1;k<=2*i-1;k++)

printf("*");

printf("\n");

}

*

***

*****

*******

*****

***

*

2、打印9*9乘法表

解题要点:

注意寻找行与列的规律。

i*j

i代表列

j代表行

for(i=1;i<=9;i++)

{

for(j=1;j<=9;j++)

printf("%-3d",i*j);注意输出格式的控制

printf("\n");

}

3、九九乘法表

123456789

24681012141618

369121518212427

91827364554637281

4、杨晖三角形

1

11

121

1331

14641

15101051

1615201561

(2)字符串打印问题

for(i=1;i<=7;i++)

{

a[i][1]=1;

a[i][i]=1;

}

for(i=3;i<=7;i++)

for(j=2;j<=i-1;j++)

a[i][j]=a[i-1][j-1]+a[i-1][j];

gets(a);

puts(a);

for(i=1;i<=5;i++)

{

t=a[5];

for(j=5;j>0;j--)

a[j]=a[j-1];

a[0]=t;

for(k=0;k<=5;k++)

printf("%c",a[k]);

printf("\n");

}

1、

ABCDEZ

ZABCDE

EZABCD

DEZABC

CDEZAB

BCDEZA

注意交换过程和把所有的数后移一位的方法

注意点:

1、inti,不要误打成chari

2、a[i]!

=’\0’不要误打成i!

=’\0’

3、逻辑与&&

4、单引号内表示字符

5、不加单引号的字符型数据为其ASCII码

2、输入一字符串小写换大写

chara[81];

inti;

gets(a);

for(i=0;a[i]!

='\0';i++)

if(a[i]>='a'&&a[i]<='z')

a[i]-=32;

puts(a);

3、逆序输出

gets(a);

c=strlen(a);

for(i=0;i

{

t=a[i];

a[i]=a[c-1-i];

a[c-1-i]=t;

}

puts(a);

注意此问题的思想方法:

要求一组数的逆序实质就是将其对称换位

for(inti=n;i>=0;i--)蓝色部分可以简写为绿色部分

cout<

4、如输入:

ab1@3,;z

输出:

ab1

注意点:

1、‘==’

2、while语句的使用处体会

3、全面考虑问题

@3,;z

gets(a);

while(a[0]=='')

for(i=0;a[i]!

='\0';i++)

a[i]=a[i+1];

for(i=0;a[i]!

='\0';i++)

if(a[i]==''&&a[i+1]!

='')

printf("\n");

elseif(a[i]==''&&a[i+1]=='')

{

for(k=i;a[k]!

='\0';k++)

a[k+1]=a[k+2];

i--;

}

else

printf("%c",a[i]);

5、输入3个字符串,按从小到大排序输出这3个字符串。

使用一个两维数组贮存多个字符串

chara[81][81];

注意:

如何使用一个两维数组贮存多个字符串

inti,j;

for(i=0;i<3;i++)

gets(a[i]);

for(i=0;i<3;i++)

puts(a[i]);

注意:

1、scanf("%d%s",&n,str)其中%s为字符串格式

2、逐个给字符串赋值的方法见书140页。

不可for(i=0;a[i]!

=’\0’;i++)

3、str[i]=str[i]-'A'+10;

4、pow函数

5、任何进制转为十进制的方法

6、输入一个整数n和一个字符串str,计算并输出n进制数str的值。

如输入:

716

则输出:

13(16)7=(13)10

如输入:

163A

则输出:

58(3A)16=(58)10

#include"stdio.h"

#include"math.h"

main()

{

charstr[81];

intn,i,s=0,t;

clrscr();

scanf("%d%s",&n,str);

for(i=0;str[i]!

='\0';i++)

if(str[i]<='Z'&&str[i]>='A')

str[i]=str[i]-'A'+10;

else

str[i]=str[i]-'0';

t=strlen(str);

for(i=0;str[i]!

='\0';i++)

s+=str[t-i-1]*pow(n,i);

printf("%d",s);

}

编写程序,将一个十进制正整数转换成十六进制数。

注意类比

#include

main()

{

chara[20];

intx,i=0,j;

clrscr();

scanf("%d",&x);

while(x)

{

if(x%16>=10&&x%16<=15)

a[i]=x%16-10+'A';

else

a[i]=x%16+'0';

x=x/16;

i++;

}

for(j=i-1;j>=0;j--)

printf("%c",a[j]);

printf("\n");

}

7、输入一个字符串,将其中的缩写形式展开,并输出展开后的该字符串。

所谓展开缩写形式就是将其中由大小写字母或数字构成的形如"a-f"、"U-Z"、"3-8"的形式展开成为"abcdef"、"UVWXYZ"、"345678",若出现"f-a"、"A-7"、"9-5"等形式则不予理睬。

例如:

输入:

qwe246e-hA-d$-%4-7A-Dz-xp-R4-0

输出:

qwr246efghA-d$-%4567ABCDz-xp-R4-0

main()

{

chara[81];

inti,c,s,k,t;

gets(a);

for(i=0;a[i]!

='\0';i++)

if(a[i]=='-')if(a[i-1]='A'&&a[i+1]<='Z'||a[i-1]>='a'&&a[i+1]<='z'||a[i-1]>='0'&&a[i+1]<='9'))

注意:

1、必须在结尾处加上结束标记,才能实现puts语句。

2、加上结束标记后for(i=0;a[i]!

='\0';i++)语句才能实现。

3、逻辑&&与逻辑||的优先级。

4、s=strlen(a)摆放的位置。

{

s=strlen(a);

c=a[i+1]-a[i-1];

t=i+c-2;

for(k=s-1;k>i;k--)

a[k+c-2]=a[k];

a[s-1+c-2+1]='\0';

for(;i<=t;i++)

a[i]=a[i-1]+1;

}

puts(a);

}

补充:

循环:

求:

a+aa+aaa+…..的值

#include

voidmain()

{

inta,n,i=1,sn=0,tn=0;

cout<<"inputaandn"<

cin>>a>>n;

while(i<=n)

{

tn=tn+a;

sn+=tn;

a*=10;i++;

}

cout<<"theansweris"<

}

两个乒乓球队进行比赛,各出3人。

甲队为A,B,C;已对是X,Y,Z;已经抽签决定比赛名单。

有人向队员大厅比赛的名单。

A说他不和X比,C说他不和X,Z比。

请编程序找出3对赛手的名单。

#include

voidmain()

{

chari,j,k;

for(i='X';i<='Z';i++)

for(j='X';j<='Z';j++)

if(i!

=j)

for(k='X';k<='Z';k++)

if(i!

=k&&j!

=k)

if(i!

='X'&&k!

='X'&&k!

='Z')

cout<<"A--"<

}

枚举

口袋中有红,黄,蓝,白,黑5种颜色的球若干。

每次从口袋中任意取出3歌,问得到3种不同颜色球的可能取法,输出每种排列的情况。

#include

#include//在C语言中不用加这句

voidmain()

{enumcolor{red,yellow,blue,white,black};

colorpri;

inti,j,k,n=0,loop;

for(i=red;i<=black;i++)

for(j=red;j<=black;j++)

if(i!

=j)

{

for(k=red;k<=black;k++)

if((k!

=i)&&(k!

=j))

{

n++;

cout<

for(loop=1;loop<=3;loop++)

{

switch(loop)

{

case1:

pri=color(i);break;

case2:

pri=color(j);break;

case3:

pri=color(k);break;

default:

break;

}

switch(pri)

{

casered:

cout<

caseyellow:

cout<

caseblue:

cout<

casewhite:

cout<

caseblack:

cout<

default:

break;

}

}

cout<

}

}

cout<<"total:

"<

}

数组:

不用strcat函数,编写程序,将两个字符串串接起来。

#include

usingnamespacestd;

voidmain()

{

inti=0;

chara[20],b[10];

gets(a);gets(b);

for(i=0;i<10;i++)

if(a[i]=='\0')break;

for(intj=0;j<10;j++)

{a[i]=b[j];i++;if(b[j]=='\0')break;}

cout<

}

输入一行字符,统计其中有多少个单词,单词之间用空格分开。

#include

usingnamespacestd;

voidmain()

{

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教学研究 > 教学案例设计

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1