常考题型归纳:
一:数值类
题型1:素数问题
素数:只能被自己与1整除的数,最小的素数是2,比如3,5,7等都是素数
算法:任意输入一个数判断是否是素数
#include <stdio.h>
#include <conio.h>
int prime(int n) // 实现判断素数函数
{for(int k=2;k<n;k++) //核心程序
{if(n%k==0) return 0;}
return 1;}
void main()
{int n;
scanf(“%d”,&n);
if(prime(n))
printf(“%s”,”yes”);
else
printf(“%s”,”no”);
getch(); clrscr(); //清屏}
题型2:整数拆分
整数拆分是将整数n的每一个数取出,在取数的过程中,不断使用”%”和”/”运算符号
算法:输入整数n,求出n的各个位数相加之和,如输入3476,结果为20
#include <stdio.h>
main()
{
int n, x, sum=0;
scanf(“%d”,&n);
while(n!=0) //此while程序为关键
{x=n%10;
sum+=x;
n=n/10;}
printf(“%d\n”,sum);}
题型3:回文数(反读与正读相同的数,比如121,313等)
编程题:
(1)在给定范围内查k使得用公式k^2+k+17生成的整数满足以下条件:该数的十进制表示中低3位数字相同,去掉低3位后的整数是回文数。例如,当k=461时用公式生成的整数是212999,该数满足所给条件。
【编程要求】
1.编写函数int findnum(int n1,int n2,long a[][2])实现以下功能:k依次取n1~n2范围内的每个整数,分别用每个k及公式k^2+k+17生成整数y,若y满足给定条件,则将k值及y值保存到a指向的数组中,函数返回a数组中k的个数。
2.编写函数main实现以下功能:声明二维数组a和变量n1、n2,输入两个整数并保存到n1、n2中,用 n1、n2及a数组作实参调用findnum函数,按所给格式输出a数组中的数据到屏幕及文件myf2.out中。最后将考生本人的准考证号输出到文件myf2.out中 。
【测试数据与运行结果】
输入:n1=1,n2=10000
输出:k number
461 212999
586 343999
3839 14741777
#include <stdio.h>
int findnum(int n1,int n2,long a[][2])
{ int i=0,j;
long x1,x2,x3,y,k;
for(k=n1;k<=n2;k++)
{y=k*k+k+17;
x1=x2=y/1000;x3=0;
while(x1>0) //本while循环将x1逆序变为x3
{x3=x3*10+x1%10;x1=x1/10;}
if(x2==x3&&y%10==y/10%10&&y%10==y/100%10) //判断是否是回文数同时低3位数是相同的
{ a[i][0]=k;a[i++][1]=y;}
}
return i;
}
main()
{int i,j;long a[10][2],n1,n2; FILE *fp;
fp=fopen("Myf2.out","w");
scanf("%d%d",&n1,&n2);
j=findnum(n1,n2,a);
printf("\n k\t number");
for(i=0;i<j;i++)
prinff("\n%ld\t%ld",a[i][0],a[i][1]);
fprintf(fp,"\n k \t number");
for(i=0;i<j;i++)
fprintf(fp,"\n%ld\t%ld",a[i][0],a[i][1]);
fprintf(fp,"\n My exam number is :0112400123");
fclose(fp);getch();
}
题型4:排序问题
(1)简单选择排序法
规律:(1)首先将第一个数a[0]与后面的每一个元素比较,比较时将比a[0]小的数和a[0]交换
(2)接着在除了a[0]以外的所有元素中,将a[1]与其之后的每一个元素比较,到次小数放在a[1]位置。
(3)重复这个过程a-1遍,最后构成递增序列
#include <stdio.h>
void sort(int a[ ],int n) //简单选择排序法
{ int k;
for(int i=0; i<n-1; i++)
{k=i;
for(int j=i+1;j<n;j++)
if(a[k]>a[j]) k=j;
if(k!=i)
{temp=a[i]; a[i]=a[k]; a[k]=temp;}}
}
void print(int b[ ], int n)
{for( int i=0; i<n; i++)
printf(“%6d”, b[i]);}
void main()
{int a[ ]={6,3,1,2,5,0,9,3,7,6};
sort(a,10);
print(a,10);
}
(2)冒泡排序法:
冒泡排序:(1)始终比较的是相邻数字
(2)每趟排序后,最大数移到后面,最小数移到前面,注意与快速排序法的区别。
编写基于冒泡排序法的排序函数对10个整数进行升序排序
#include <stdio.h>
void sort(int a[ ], int n)
{int temp;
for( int i=0; i<n-1; i++)
{for( int j=0; j<n-i; j++)
{if(a[j]>a[j+1])
{temp=a[j]; a[j]=a[j+1]; a[j+1]=temp;}}
}}
void print(int b[ ], int n)
{for(int i=0; i<n ; i++)
{printf(“%6d”, b[i]);}
}
main()
{int a[10]={6,7,4,10,2,5,9,8,3,1};
sort(a,10);
print(a,10);}
(3)插入排序法:
插入排序法是将数据一个一个地插入到已经有序的数列中,并保证每插入一个数后数列仍然有效。
插入排序的思想是:1先确定n个数x插到数组中的位置k,因为原本的数组有序,所以从第一个起到n-1个为止逐个比较,一直遇到比x大的数为止,这个位置就是x插入的位置
2确定应插入到位置k后,后面的元素要向后顺移一个位置以空出一个位置放入x
算法实现:
#include <stdio.h>
#include <conio.h>
void main()
{int i, n, x;
void insert(int *, int , int *);
int a[ ]={-3,2,6,9,14,19};
n=6;
scanf(“%d”,&x);
insert(a,x,&n);
for( i=0; i<n; i++)
printf(“%d”, a[i]);}
void insert(int *b, int y, int *m) //插入排序法
{int i,j, k;
for(i=*m-1; i>=0; i--)
{if(y<*(b+i))
*(b+i+1)=*(b+i);
else
break;
}
*(b+i+1)=y; (*m)++;
}
历年真题
投要求合并两个字符串。
【编程要求】
1.编写函数void fun(char *a,char *b,char *c),其功能是先将b指向的字符串逆存放,然后按a[0],b[0],a[1],b[1],…的顺序合并a字符串和b字符串到c指向的数组中,a或b中剩余字符拼
接在c数组的尾部。
2.编写main函数,声明三个一维数组s1、s2和s,接收键盘输入的两个字符串并保存数组sl和s2中,调用fun函数对s2字符串做逆序变换,再合并sl字符串和s2字符串到s数组中。将合并后产生的数组s中的字符串输出到屏幕
【测试数据与运行结某】
测试数据:s1字符串为"abcdefg",s2字符串为"ABCD"
运行结果:aDbCcBdAefg
#include<stdio.h>
#include<string.h>
void fun(char *a,char *b,char *c)
{ int i,j;
char ch;
i=0;j=strlen(b)-1;
while(i<j) //本while循环实现逆序
{ ch=b[i];b[i]=b[j];b[j]=ch;
i++; j--;
}
while(*a || *b) //本while循环实现将a与b放到c里面
{if(*a){*c=*a;c++;a++;}
if(*b){*c=*b;c++;b++;}
}
*c='\0';
}
void main()
{
char s1[80],s2[80],s[200];
prinff("\nEnter sl string:");
fprintf作用 gets(s1);
prinff("\nEnter s2 string:");
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论