南开100题版 上机 题型及思路总结 c语言.docx
- 文档编号:8904357
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:44
- 大小:31.36KB
南开100题版 上机 题型及思路总结 c语言.docx
《南开100题版 上机 题型及思路总结 c语言.docx》由会员分享,可在线阅读,更多相关《南开100题版 上机 题型及思路总结 c语言.docx(44页珍藏版)》请在冰豆网上搜索。
南开100题版上机题型及思路总结c语言
一、数的处理
1.四舍五入(编程:
16)
算法:
若预保留的位数的个数为n,则先把实数乘以10n+1(将涉及运算的的小数移到整数位上);然后对此数加5再除以10(+5:
若个位大于5则进位;÷10:
舍弃个位);最后把所得的整数强制转换成float型再除以10n就得到最后的结果
程序代码:
保留两位小数(注意各个变量的数据类型)
floatfun(floath)
{
longt;
floats;
h=h*1000;
t=(h+5)/10;
s=(float)t/100.0;
returns;
}
2.与位数有关的
①挑出奇(偶)数位(改错19,65)
程序代码:
(挑出偶数位,高低位顺序不变)
voidfun(longs,long*t)
{
longs1=10;
s/=10;(若要求挑出奇数位的,则要删掉此句)
*t=s%10;(将第一个奇数/偶数,放在t所指的存储单元中)
while(s>0)
{
s=s/100;(移动到下一个奇数/偶数位)
*t=s%10*s1+*t;(将得到的数字放在t所指的存储单元中)
s1=s1*10;(以便于下一次取出的数字放在*t的最高位)
}
}
②挑出每位的奇(偶)数(改错34,76)
程序代码:
(挑出奇数,高低位顺序不变)
voidfun(longs,long*t)
{
intd;
longs1=1;
*t=0;
while(s>0)
{
d=s%10;(取得整数s当前值的最低位,放入变量d中)
if(d%2!
=0)(判断d的奇偶性。
若题意要求找出偶数,则为:
if(d%2==0))
{
*t=d*s1+*t;(将得到的数字放在t所指的存储单元中)
s1*=10;(以便于下一次取出的数字放在*t的最高位)
}
s/=10;(移动到下一位)
}
}
③数字某位的积(或和)(改错30,90)
程序代码:
{
longk=1;(当求积时,设变量k=1;当求和时,设变量k=0)
do
{
k*=num%10;(若求和,则为k+=num%10)
num/=10;
}while(num);
return(k);
}
④某数的低(高)n位值(改错89;编程15)
程序代码:
⑴求w的后n-1位
unsignedfun(unsignedw)
{
unsignedt,s=0,s1=1,p=0;
t=w;
while(t>10)(确定w至少为两位数)
{
if(t/10)(确定w至少为两位数)
p=t%10;(将数w的最后一位数赋值于p)
s=s+p*s1;(将要得出的结果放在s上,且符合位数)
s1=s1*10;(位数是用s1调整的,所以循环即将结束后s1*10,挪到下一位上)
t=t/10;(将w的最后一位数删除,开始新的循环)
}
returns;
}
⑵求低三位值
longfun(intx,inty,long*p)
{
inti;
longt=1;
for(i=1;i<=y;i++)
t=t*x;(按照题意求得Xy)
*p=t;(指针所指地址的值为t,保留了原t的值)
t=t%100;(求第三位,故求余)
returnt;
}
3.合并、组合(编程48,65,71,77,81,84,87,91)
整数按位分离合并算法:
:
(1)按位拆分正整数a和b,算法是:
对于两位数的正整数与10整除(/)求其高位(十位),与10取模(%)求其低位(个位)。
(2)按位合并,每位上的数字与该位上的位权相乘,然后各位相加。
程序代码:
(a数的十位和个位数依次放在c数的千位和十位;b数的十位和个位依次放在c数的百位和个位上)
voidfun(inta,intb,long*c)
{
*c=(a/10)*1000+(b/10)*100+(a%10)*10+b%10;
}
4.求绝对值(填空41)
算法:
条件语句,if(n<0)n*=-1;
5.闰年(填空16)
算法:
闰年:
年份能被4整除,但不能被100整除或年份能被400整除
程序代码:
intfun(intn)
{
intflag=0;
if(n%4==0)
ifn%100!
=0
flag=1;(第一个条件语句:
判断是否能被4整除但不能被100整除)
ifn%400=0
flag=1;(第二个条件语句:
判断是否能被400整除)
returnflag;(本题主要用flag赋值,也就是真假,来判断是否为闰年)
}
6.素数(填空13改错78)
⑴引入第三个变量控制yes和no
charfun(intn)
{
inti,m;
m=1;
for(i=2;i if(n%i==0) { m=0; break; } if(m==1&&n>1) return(“yes! ”); else return(“no! ”); } ⑵用除数和被除数之间的余数的关系来判断 intfun(intm) { intk=2; while(k<=m&&(m%k))(k<=m且m%k为真) k++; if(m=k) return1; else return0; } 7.排序、交换 ①两个整数的交换(改错18,38,83) 程序代码: voidfun(int*a,int*b) { intt; t=*b;(将b指向的整数预先存在变量t中) *b=*a;(将a指向的整数覆盖b指向的整数) *a=t;(将预先保存在t中的原b的整数覆盖a指向的整数,完成了整个的交换过程) } 或 intfun(int*a,intb) { intt; t=*b;(将b指向的整数预先存在变量t中) *b=*a;(将a指向的整数覆盖b指向的整数) return(t);(将t作为数据返回【下方提取函数语句为: b=fun(&a,b)】) } ②按题中的条件输出符合题目的数(填空10,24) 算法: 条件语句,用if…else或a? b: c ③按题中要求的排序方式排序(填空51改错86) 程序代码: (相互交换值,也可用指针,86用的就是指针) if(x>y) { t=x; x=y; y=t; } if(x>z) { t=z; z=x; x=t; } if(y>z) { t=y; y=z; z=y; } 8.统计 ①按照题中要求条件将多位数中的每个数字分类(填空7改错100) 程序代码: intfun(unsignedn,int*zero) { intcount=0,max=0,t; do { t=n%10; if(t==0) count++;(统计某位上为0的数的个数) if(max max=t;(取出每位中的最大值) n=n/10;(移动到下一位,然后进行判定,是否为最后一位) }while(n); 或运用swich语句(7) PS: swich语句: 先执行swich后的表达式,然后将其结果与case后的常量表达式比较,若符合则执行其后的语句,一般最后接break;语句,结束结构 ②某区间符合某条件的数(改错17)因条件不同不具备统一条件,故不说明 9.求值(填空5改错98) 由于类型多变,所以为例子,不代表所有 例(改错98) #defineFU(m,n)(m)/(n)(预处理变量必须加括号,否则表达式表达不明确) floatfun(floata,floatb,floatc) { floatvalue; value=FU((a+b),(a-b))+FU((c+b),(c-b)); return(value); } 10.进制转换(改错11) 关于进制转换: 1十进制转化成x进制的数 如: 十进制数转换成二进制数,这是一个连续除2的过程: 把要转换的数,除以2,得到商和余数,将商继续除以2,直到商为0。 最后将所有余数倒序排列,得到数就是转换结果 ②x进制转化成十进制的数 如: 假设有一个十六进数2AF5,那么如何换算成10进制呢? A,B,C,D,E,F这五个字母来分别表示10,11,12,13,14,15 用竖式计算: 2AF5换算成10进制: 第0位: 5*16^0=5 第1位: F*16^1=240 第2位: A*16^2=2560 第3位: 2*16^3=8192+ ———————————— 10997 ③二进制转化成为x进制的数 如: 二进制换八进制时,从右到左,三位一组,不够补0 然后每组中的3个数分别对应4、2、1的状态,然后将为状态为1的相加,如: 010=2 110=4+2=6 111=4+2+1=7 011=2+1=3 结果为: 2673 十六进制换二进制的方法也类似,只要每组4位,分别对应8、4、2、1就行了 关于数字的ASCII码值与数字的关系 数字=数字的ASCII码值-0的ASCII码 11.判断是否组成三角形(改错68) 算法: ①等边三角形(a==b&&b==c)②等腰三角形(a==b||b==c||a==c)③三角形(a+b>c&&b+c>a&&a+c>b) 二、循环 1.迭加(填空4,6,28,29,57,58,59,75,95改错6,13,22,27,46,60,61,62,66,71,73,80,81,82,93,95,96编程8,9,10,26,58,63,68,69? 70,76,86,90,92,93,97,98,100) 迭加题形式多变且各种题型均有分布 此种类型题的主要编程套路为: 拆分公式,将每一项用变量表示,然后利用表达式表示关系式(一般多为叠加叠乘),其中要注意初值的设定。 常见运算关系: 1阶乘: for(j=1;j<=i;j++)t*j;②累加: t+=s;③开方: pow(i,0.5);④求绝对值: fabs(y);⑤xn: p=1.0;p=p*x ⑥计算x的平方根: sqrt(x); 2.求数的因子【最大公约(改错29)】 算法: 1)若n>m,则用n除以m求余数r;2)若r=0,则m为最大公约数,若r≠0,则将r赋值于m,m赋值于n,继续用n除以m求余数r;3)直到r=0,m为最大公约数 程序代码: intfun(inta,intb) { intr,t; if(a>b) { t=a; a=b; b=t; } r=a%b; while(r! =0) { a=b; b=r; r=a%b; } return(b); } 3.递归(填空1,2改错23,53,67) ①阶乘 程序代码: longfun(intn) {ifn>1 return(n*fun(n-1)); return1; } 2波那契数列 程序代码: intfun(intn) {if(n==0) return0; elseif(n==1) return1; else returnfun(n-1)+fun(n-2);} 4.求方程的解 ①一元二次方程(填空49改错14)二分法什么的…需查找 3二元二次方程组(填空84) 三.一维数组 1.平均数 求平均后分组或计数(填空19,23,32改错9,52,32编程1,82,96) 算法: (1)定义一个变量,用于保存总和与平均数,由于总和是累加得到的,因此该变量必须赋初值;利用循环语句累加数组中所有数组元素的值求总和与平均数; (2)若分组则利用循环和条件语句找出低于平均数的数并放在形参数组中,用数组的下标记录其个数;若仅计数,则定义一个变量用于保存个数,该变量必须赋初值(5)用return语句返回 程序代码: intfun(intscore[],intm,intbelow[]) { inti,k=0,aver=0; for(i=0;i aver+=score[i]; aver/=m; for(i=0;i if(score[i] { below[k]=score[i]; k++; } returnk; } 编程96: fun函数的功能是计算并输出给定数组: (长度为9)中每相邻两个元素之平均值的平方根之和。 doublefun(doublex[9]) { doublesum=0.0; inti,j=1; for(i=0;i<9;i++) if(j<=8) { sum+=sqrt((x[i]+x[i+1])/2.0); j++; } returnsum; } 2.求符合条件的数组 ①能被…整除(填空: 26,91编程: 2,27) 程序代码: voidfun(int*a,int*n) { inti,j=0; for(i=2;i<1000;i++)(利用循环遍历1到1000之内的整数) if((i%7==0||i%11==0)&&i%77! =0)(利用if条件语句判断,把查找到的整数保存到形参数组a中) a[j++]=i; *n=j;(把数组a中数组元素的个数赋值到形参指针n所指的内存) } ②下标、ASCII码(填空76编程31,32,49,64,72,78) 程序代码: : fun函数的功能是将s所指字符串中除了下标为偶数且ASCII值也为偶数的字符外,其余的全都删除;串中剩余字符所形成的一个新串放在t所指的数组中。 voidfun(char*s,chart[]) { inti,j=0,n; n=strlen(s);(intstrlen(char*str)求字符串str的长度,不含’/0’) for(i=0;i if(i%2==0&&s[i]%2==0)(利用if语句把符合保留要求的字符复制到新串中) { t[j]=s[i]; j++; } t[j]='\0';(新字符串t必须以字符串结束字符'\0'结尾) } ③元素比较(填空77) #include #defineN10 main() {inti,n=0; intaa[N]={45,55,62,42,,35,52,78,95,66,73}; intbb[N]; for(i=0;i if(aa[i] bb[n++]=aa[i]; printf(“\n************displaybb************\n”) for(i=0;i printf(“bb[%d]=%2d”,i,bb[i]); ④不同位上数的比较(填空37,38,47改错43,70) 程序代码: fun函数的功能是: 从一组无符号整数中查找出个位与十位数字之和大于5的无符号整数,并把结果保存在数组bb中 intfun(intxx[],intbb[],intnum) { inti,n=0; intg,s; for(i=0;i { g=xx[i]%10; s=xx[i]/10%10; if((g+s)>5) bb[n++]=xx[i]; } returnn; } ⑤统计(填空17)与②相似 3.关于素数(填空99改错55编程5,20,51,99) 程序代码1: fun函数的功能是将大于整数m且紧靠m的k个素数存入xx所指的数组中 voidfun(intm,intk,intxx[]) { intg=0,i,j,flag=1; for(i=m+1;i { for(j=2;j { if(i%j! =0)(在内循环中判断整数i是否为素数) flag=1; else { flag=0; break; } } if(flag==1&&j>=i) { if(k>=0) { xx[g++]=i;(把素数保存在形参数组xx中,并判断循环是否可以结束) k; } else break; } } } 程序代码2: fun函数的功能是求出小于或等于lim的所有素数并放在aa数组中,该函数返回所求出的素数的个数。 intfun(intlim,intaa[MAX]) { intk=0,i,j; for(i=lim;i>1;i) { for(j=2;j if(i%j==0) break; else continue; if(j>=i) { aa[k]=i; k++; } } 程序代码3: : fun函数的功能是计算并输出3到n之间所有素数的平方根之和 doublefun(intn) { intm,k,i; doubles=0.0;(定义保存和的变量,由于要累加求和,因此要事先赋初值) for(m=3;m<=n;m++) { k=sqrt(m); for(i=2;i<=k;i++)(利用循环查找3到n之的素数,累加求其平方根之和) if(m%i==0)break; if(i>=k+1) s+=sqrt(m); } returns; } 4.整除x(填空20编程3) 程序代码: fun函数的功能是求出能整除x且不是偶数的各整数,并按从小到大的顺序放在pp所指的数组中,其个数通过形参n返回 voidfun(intx,intpp[],int*n) { inti=1,j=0,k=0,*t=pp; for(i=0;i<=x;i++)(利用循环遍历0到x之间的整数) if(i%2! =0)(利用if条件语句把奇数保存在一个临时数组) 中 { t[j]=i; j++; } for(i=0;i if(x%t[i]==0) { pp[k]=t[i]; k++; } *n=k;(把pp数组中数组元素的个数赋给形参指针n所指的内存) } 5排序(填空60,79,96改错7,40) 6.移动(填空25,33,80改错5,8) 7.插入(填空66) 8.字符串操作 ①删除*(编程33[尾部不得多于n],36[删去前导并且将其移动到尾部],45[删去前导和尾部],56[删去尾部以外的],66[删去所有的],73[删去中间],83[删去尾部],88[删去除了前导以外的],94[删去前导],95[前导不得多于n]) (1)尾部不得多于n: 由于只对字符串后面的“*”操作,所以先利用循环遍历整个字符串,把指针定位到字符最后;如果“*”大于给定的个数,则从后向前进行删除 (2)删去前导并且将其移动到尾部: 定义一个指针并指向字符串的首地址;利用循环语句找出字符串的前导*的个数n;利用循环语句把剩余的字符拷贝到字符串中;在字符串的末尾接上n个*。 (3)删去前导和尾部: 直接把前后*之间的字符拷贝到原串中,注意不要处理字符间的*。 需要注意的是下标的确定。 (4)删去前导和尾部: 由于题目告诉形参p已指向字符串中最后的一个字母,这里需要查看main()函数,才能具体搞清楚其实形参p指向的是字符串中最后一个非*字符。 因此只需再定义一个字符指针并初始指向原串的首地址,然后后移该指针直到等于形参指针所指向的地址,把非“*”字符拷贝到原串中,然后再把原串结尾的*拷贝到原串的后面。 注意要给改动过的原串赋结尾标志字符'\0'。 (5)删去所有的: 利用循环遍历字符串的所有字符;利用条件语句判断,把非'*'字符拷贝到原串中;给修改后的原串赋结尾标志字符'\0 (6)删去中间: 分段实现: 拷贝字符串前导*到原串;拷贝字符串前导和后部*之间的非*字符;依次把字符串尾部的*号拷贝到原串尾部。 需要注意下标的变化。 (7)删去尾部: 分段实现: 用循环遍历字符串求其长度(或把指针定位到字符串最后一个字符处);利用循环语句及条件语句删除字符串尾部的*字符;把修改后的字符串拷贝到原串。 需要注意指针或下标的变化。 (8)删去除了前导以外的: 定义一个临时指针p,初始指向原串首地址;利用循环把字符串前导*拷贝到原串;继续移动指针,把串中和串尾的非*字符拷贝到原串;为修改后的字符串赋结尾字符'\0'。 需要注意指针或下标的变化。 (9)删去前导: 定义一个临时指针p,初始指向原串首地址利用循环把字符指针移动到前导*后的第一个字母字符处;继续移动指针,把串中和串尾的字符拷贝到原串;给修改后的原串赋结尾标志字符'\0'。 需要注意指针或下标的变化。 (10)前导不得多于n: 定义临时字符指针,并初始指向a的首地址;由于只对字符串前导“*”操作,所以先计算字符串前导*的个数;如果“*”大于给定的个数,则从前向后删除多余的*;用临时指针把字符串拷贝到原串;给修改后的字符串a赋结尾标志字符。 本题需要注意: 对字符串操作应定义足够的临时指针变量(或临时字符串变量)辅助循环,否则程序会很混乱。 ②比较(填空54改错48,54编程25,43) 程序代码: (1)不用字符函数 char*fun(char*s,char*t) { char*p,*t1=t,*s1=s; intn=0,m=0; while(*s1) { n++; s1++; } while(*t1) { m++; t1++; } if(n>=m) p=s; else p=t; returnp; } (2)用字符函数 voidfun(char*a,intn,inth,inte) { inti=0; char*p;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 南开100题版 上机 题型及思路总结 c语言 南开 100 题版 题型 思路 总结 语言