NOIP完善程序练习题(C语言)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

NOIP完善程序练习题(C语言)
NOIP完善程序练习题(C语言)
1.【问题描述】求出所有满足下列条件的二位数:将此二位数的个位数字与十位数字进行交换,可得到一个新的数,要求新数与原数之和小于100。

【程序要求】每行输出6个满足要求的数。

【算法说明】分解每一个二位数,然后重新组成一个新数,当满足条件时,用计数器来统计个数.
【程序清单】
main()
{ int k=0,i,x,y,j;
for(i=____【1】____;i<100;i++)
{ x=____【2】____; y=____【3】____;
j=x*10+y;
if(____【4】____) { k++; printf("%4d",i); if(____【5】____) printf("\n");
} }
}
2.判断质数
题目描述:
给出一个正整数,判断这个数是否是质数。

输入:
一个正整数n(1 ≤ n ≤ 10000)。

输出:
如果n是质数,输出”YES”;否则,输出”NO”。

输入样例:
10
输出样例:
NO
程序:
#include
int main() {
int ①;
scanf("%d", &n);
if (n == 2) puts( ②);
else if ( ③|| n % 2 == 0) puts("NO");
else {
i = 3;
while (i * i <= n) {
if ( ④) {
puts("NO"); return 0;
}
i = i + 2;
}
puts("YES");
}
return 0;
}
3.三角形内切圆的面积(8分)
【题目描述】给出三角形三边的边长,求此三角形内切圆(如下图所示,三角形的内切圆是和三角形三边都相切的圆)的面积。

【输入】三个正实数a、b、c(满足a+b>c,b+c>a,c+a>b),表示三角形三边的边长。

【输出】三角形内切圆的面积,结果四舍五入到小数点后面2位。

【输入样例】3 4 5
【输出样例】3.14
【程序】
#include
#include
int main()
{ float a, b, c, r, s, t;
scanf("%f%f%f", &a, &b, &c);
s = ( 【1】 ) / 2;
t = 【2】 (s * (s - a) * (s - b) * (s - c));
r = t / s; printf(" 【3】 \n", 3.1415927 * r * 【4】 );
return 0;
}
4、【问题描述】找出小于33的6个整数,用这些整数进行加法运算,使得包括原来的整数在内能组成尽可能多的不同整数。

例如:用2,3,5这3个数能组成下面的数
2,3,5
2+3=5 5已经存在
2+5=7 3+5=8 2+3+5=10
所以用2,3,5能组成6个不同的数。

【程序要求】
输出所选的这6个数,以及能组成不同整数的个数。

【算法说明】
选择的这6个数,用来组成数时应该尽可能不重复,引入数组a保存找出的这6个数。

【程序清单】
main()
{ int a[7],t=0,i,j,s;
a[1]=1;
for(i=2;i<7;i++)
{ ____【1】____;
for(j=1;j<=i-1;j++) s=____【2】____; a=____【3】____; }
for(i=1;i<7;i++)
{ t=____【4】____; printf("%d ",a); }
printf("total=%d\n",t);
}
5、【问题描述】
求出2~1000之间长度最长的、成等差数列的素数(质数)。

例如:在2~50之间的全部素数有
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47
其中公差为1的素数数列为2, 3, 其长度为2
公差为2的素数数列为3, 5, 7, 其长度为3
……
程序要求:输出满足条件的素数数列。

【算法说明】
首先用筛选法求出此范围的全部素数,存放在数组b中,然后用2个变量i, j,逐步求出满足条件的素数数列。

【程序清单】
main()
{ int b[1001],c[1001],d[1001],max,num,i,j,k,i1,delta;
max=0; num=1000;
clrscr();
for(i=2;i<=num;i++) b=i;
for(i=2; ____【1】____ ;i++)
if( ____【2】____ )
{ k=i+i;
while(k<=num)
{ b[k]=0; k=k+i; }
}
for(i=2;i<num;i++)< p="">
if( ____【3】____ =0)
{ j=1; d[j]=b;
for(i1= ____【4】____ ;i1<=num;i1++)
if(b[i1]!=0)
{ delta=____【5】____ ;
k=delta;
while(i+k<=num && ____【6】____)
{ j=j+1; d[j]=i+k; k=k+delta; }
if(j>max)
{ max=j; for(i=0;i<=max;i++) c=d; }
j=1; }
}
printf("The max length is:%d\n",max);
printf("The string is:");
for(i=1;i<=max;i++) printf("%d ",c);
printf("\n");
}
6.一元二次方程(10分)
【题目描述】方程ax^2+bx+c=0,要求给出它的实数解。

【输入】三个实数:a,b,c,是方程的三个系数(a≠0).
【输出】如果无实数解,则输出"No solution";
如果有两个相等的实数解,则输出其中一个,四舍五入到小数点后面3位;
如果有两个不等的实数解,则解与解之间用逗号隔开,同样要四舍五入到小数点后3位。

【输入样例】l 2 1
【输出样例】-1.000
【程序】
#include "math.h"
main()
{ float a,b,c,m;
scanf("%f%f%f",&a,&b,&c);
m=b*b-4*a*c;
if( 【1】 )
{
printf("%.3f,", 【2】 );
printf(" 【3】 ",(-1*b-sqrt(m))/(2*a)); }
else if( 【4】 )
printf("%.3f", 【5】 );
else
printf("No solution");
}
7.(字符串替换)给定一个字符串S(S仅包含大小写字母),下面的程序将S中的每个字母用规定的字母替换,并输出S经过替换后的结果。

程序的输入是两个字符串,第一个字符串是给定的字符串S,第二个字符串S’由26个字母组成,它是a-z的任一排列,大小写不定,S’规定了每个字母对应的替换字母:S’中的第一个字母是字母A和a的替换字母,即S中的A用该字母的大写替换,S中的a用该字母的小写替换;S’中的第二个字母是字母B和b的替换字母,即S 中的B用该字母的大写替换,S中的b用该字母的小写替换;…… 以此类推。

#include
#include
char change[26], str[5000];
void CheckChangeRule()
{ int i;
for (i = 0;i < 26;i ++)
{ if ( ① ) change[i] -= 'A' - 'a'; }
}
void ChangeString()
{ int i;
for (i = 0;i <="" p="">
{ if ( ② )
str[i] = change[str[i] - 'A'] -'a' + 'A';
else
③ }
}
int main()
{ int i;
scanf("%s", str); scanf("%s", change);
CheckChangeRule();

printf("%s\n", str);
return 0;
}
8. (找第k大的数) 给定一个长度为1,000,000的无序正整数序列, 以及另一个数n (1<=n<=1000000),然后以类似快速排序的方法找到序列中第n大的数(关于第n大的数:例如序列{1,2,3,4,5,6}中第3大的数是4)。

#include
#include
int a[1000001],n,ans = -1;
void swap(int *a,int *b)
{ int c; c = *a; *a = *b; *b = c;}
int FindKth(int left, int right, int n)
{ int tmp,value,i,j;
if (left == right) return left;
tmp = rand()% (right - left) + left;
swap( &a[tmp], &a[left] );
value = ①
i = left; j = right;
while (i < j)
{ while (i < j && ② ) j --;
if (i < j) {a[i] = a[j]; i ++;} else break;
while (i < j && ③ ) i ++;
if (i < j) {a[j] = a[i]; j - -;} else break;
}

if (i < n) return FindKth( ⑤ );
if (i > n) return ⑥
return i;
}
int main()
{ int i;
int m = 1000000;
for (i = 1;i <= m;i ++)
scanf("%d", &a[i]); scanf("%d", &n);
ans = FindKth(1,m,n); printf("%d\n", a[ans]);
return 0;}
9.下面的程序的功能是输入若干行字符串,每输入一行,就按逆序输出该行,最后键入CTRL+Z终止程序(程序中EOF为输入终止的标记,相应的按键为CTRL+Z,机内码为-1)。

请将程序补充完整。

#include "stdio.h"
#include "string.h"
int maxline=100;
int getline(char s[],int lim)
{ int c,i;
for(i=0;i<="" ;="" c!="\n" p="">
s[ i]=____【1】____;
if(c=='\n') {s[ i]=c; ++i; }
s[ i]='\0'; return ____【2】____;
}
int reverse(char s[])
{ int i,j,t;
for(i=0,j=strlen(s)-2; i<="" ____【3】____)="" p="" s[strlen(s)-1]为换行符="">
{t=s[ i]; s[ i]=s[ j]; s[ j]=t;}
return 0;
}
main()
{ char line[100];
while((getline(line,maxline))>0)
{ printf("%s",line); ____【4】____; printf("%s",line); }
}
10. 【题目描述】原始的Joseph问题的描述如下:有n个人围坐在一个圆桌周围,把这n 个人依次编号为1,…,n。

从编号是1的人开始报数,数到第m个人出列,然后从出列的下一个人重新开始报数,数到第m个人又出列,…,如此反复直到所有的人全部出列为止。

比如当n=6,m=5的时候,出列的顺序依次是5,4,6,2,3,1。

现在的问题是:假设有k个好人和k个坏人。

好人的编号的1到k,坏人的编号是k+1到2k。

我们希望求出m的最小值,使得最先出列的k个人都是坏人。

【输入】仅有的一个数字是k(0<k<14)。

< p="">
【输出】使得最先出列的k个人都是坏人的m的最小值。

【输入样例】4
【输出样例】30
【程序清单】
#include
long k, m, begin;
int check(long remain)
{ long result =( 【1】 ) % remain;
if( 【2】 )
{ begin = result; return 1; }
else
return 0;
}
int main()
{ long i, find = 0;
scanf("%ld", &k);
m = k;
while( 【3】 )
{ find = 1; begin = 0;
for (i = 0; i < k; i++)
if (!check( 【4】 ))
{ find = 0; break; }
m++; } printf("%ld\n", 【5】 ); return 0; }
</k<14)。

<>
</num;i++)<>。

相关文档
最新文档