1 素数判断
法1,法2就是x/2换为根号x
#include<stdio.h>
int main(){
int n,x,i,j,a;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&x);
if(x==1){
printf("NO\n");
}
else{
for( j= 2;j <= x/2+1;j++){
if(x%j==0){
break;
}
}
if(j>=x/2+1){
printf("Yes\n");
}
else{printf("No\n");
}
}
}
return 0;
}
2
求e的近似值
法1,自然常数 e 可以用级数 1+1/1!+1/2!+⋯+1/n!+⋯ 来近似计算。本题要求对给定的非负整数 n,求该级数的前 n+1 项和
# include<stdio.h>
int main()
{
int m,n;
double j=1;
double sum=1.0;
scanf("%d",&n);
for(m=1;m<=n;m++)
{
j=j*m;
sum=sum+1.0/j;
}
printf("%0.8lf",sum);
return 0;
}
法2:
法2,
本题要求编写程序,根据下式求π的近似值,直到最后一项小于给定精度eps。
输入在一行中给出精度eps,可以使用以下语句来读输入:
scanf("%le", &eps);
代码如下:
#include<stdio.h>
int main(){
double i=1,pi=0,j=1,eps,d=1;
scanf("%le", &eps);
while(1){
pi+=i/j;
i*=d;
j*=(2*d+1);
d++;
if(i/j<eps) break;
}
pi*=2;
printf("PI = %.7lf",pi);
return 0;
}
3
17:57
1 素数判断
法1,法2就是x/2换为根号x
#include<stdio.h>
int main(){
int n,x,i,j,a;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&x);
if(x==1){
printf("NO\n");
}
else{
for( j= 2;j <= x/2+1;j++){
if(x%j==0){
break;
}
}
if(j>=x/2+1){
printf("Yes\n");
}
else{printf("No\n");
}
}
}
return 0;
}
法3
:质数分布的规律:大于等于5的质数一定和6的倍数相邻。例如5和7,11和13,17和19等
代码示例如下:
#include<stdio.h>
#include<math.h>
bool isPrime_3(int num)
{
if (num == 2 || num == 3)//两个较小数另外处理
return true;
if (num % 6 != 1 && num % 6 != 5) //不在6的倍数两侧的一定不是质数
return false;
}
int main()
{
int i,num;
for (i = 2; i <= sqrt(num); i += 6) //在6的倍数两侧的也可能不是质数
{
if (num % i == 0 || num % (i + 2) == 0)
return false;
}
//排除所有,剩余的是质数
return true;
}
2 求e的近似值
法1,自然常数 e 可以用级数 1+1/1!+1/2!+⋯+1/n!+⋯ 来近似计算。本题要求对给定的非负整数 n,求该级数的前 n+1 项和
# include<stdio.h>
int main()
{
int m,n;
double j=1;
double sum=1.0;
scanf("%d",&n);
for(m=1;m<=n;m++)
{
j=j*m;
sum=sum+1.0/j;
}
printf("%0.8lf",sum);
return 0;
}
法2,
本题要求编写程序,根据下式求π的近似值,直到最后一项小于给定精度eps。
输入在一行中给出精度eps,可以使用以下语句来读输入:
scanf("%le", &eps);
代码如下:
#include<stdio.h>
int main(){
double i=1,pi=0,j=1,eps,d=1;
scanf("%le", &eps);
while(1){
pi+=i/j;
i*=d;
j*=(2*d+1);
d++;
if(i/j<eps) break;
}
pi*=2;
printf("PI = %.7lf",pi);
return 0;
}
3使用函数验证哥德巴赫猜想
#include <stdio.h>
#include <math.h>
int prime( int p );
void Goldbach( int n );
int main()
{
int m, n, i, cnt;
scanf("%d %d", &m, &n);
if ( prime(m) != 0 ) printf("%d is a prime number\n", m);
if ( m < 6 ) m = 6;
if ( m%2 ) m++;
cnt = 0;
for( i=m; i<=n; i+=2 ) {
Goldbach(i);
cnt++;
if ( cnt%5 ) printf(", ");
else printf("\n");
}
return 0;
}
int prime( int p ){
int fact=1;
for(int i=2;i<p/2+1;i++){
if(p%i==0)fact=0;
}
return fact;
}
void Goldbach( int n ){
int j;
for(int i = 1;i<n;i++){
j=n-i;
if(prime(i)!=0&&prime(j)!=0){
printf("%d=%d+%d",n,i,j);break;}
}
}
4,常识区;
strlen计算字符串长度不算/0;
printf("%12d\n",n);
printf("%-12d\n",n);
printf("%012d\n",n);
Str函数用于字符型(char)数组;
二维数组A【10】【255];中的A【i】可当作一维数组;
5,简单计算器
模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算。
输入
输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束。
输出
在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息“ERROR”。
# include<stdio.h>
int main()
{
int a,b,c,flag=0;
char ch;
scanf("%d",&a);
while((ch=getchar())!='=')
{
scanf("%d",&b);
if((ch=='/')&&(b==0))
{
flag=1;break;
}
switch(ch)
{
case '+': a=a+b;break;
case '-':a=a-b;break;
case '*':a=a*b;break;
case '/':a=a/b;break;
default :
flag=1;break;
}
if(flag) break;
}
if(flag)
{
printf("ERROR");
}
else
{
printf("%d",a);
}
return 0;
}
6.进制转换
原理:
十进制转换为二进制代码
十进制转换为二进制:
十进制如何转二进制:将该数字不断除以2直到商为零,然后将余数由下至上依次写出,即可得到该数字的二进制表示。
以将数字21转化为二进制为例
当商为零时,将余数由下至上依次写出,即为21的二进制表示
>
10转N:
#include<stdio.h>
int jinzhi(unsigned int n,int N);
int main(){
unsigned int n;
int N;
scanf("%d,%d",&n,&N);
jinzhi(n,N);
return 0;
}
int jinzhi(unsigned int n,int N){
int m;
if(n<N&&n>=0){
m=n;
printf("%d",m);
}
else{
jinzhi(n/N,N);
m=n%N;
printf("%d",m);
}
}
7
方阵循环右移
本题要求编写程序,将给定n×n方阵中的每个元素循环向右移m个位置。
#include<stdio.h>
int main(){
int a[10][10],i,j,n,m;
scanf("%d %d",&m,&n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
m=m%n;
for(i=0;i<n;i++){
for(j=n-m;j<n;j++)
printf("%d ",a[i][j]);
for(j=0;j<n-m;j++)
printf("%d ",a[i][j]);
printf("\n");
}
return 0;
}
8找鞍靶
一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。
本题要求编写程序,求一个给定的n阶方阵的鞍点。
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
int a[n][n];
int max[n],min[n];
for(int i=0;i<n;i++){
max[i]=0;
min[i]=9999;
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&a[i][j]);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(j==0)max[i]=a[i][j];
if(max[i]<a[i][j]){
max[i]=a[i][j];
}
}
for(int j=0;j<n;j++){
if(min[i]>a[j][i]){
min[i]=a[j][i];
}
}
}
int flag=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(max[i]==min[j]){
printf("%d %d\n",i,j);
flag++;
}
}
}
if(flag==0){
printf("NONE");
}
}
横大列和竖小列相等处就是必然的靶点;
同时方便单排多点;
9, 螺旋方阵
所谓“螺旋方阵”,是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里。本题要求构造这样的螺旋方阵。
>
输入
输入在一行中给出一个正整数N(<10)。
输出
输出N×N的螺旋方阵。每行N个数字,每个数字占3位。
>
#include <stdio.h>
#define N 10
int main()
{
int i, j, n, a[N][N] = { 0 }, value = 1;
scanf("%d", &n);
// 改造代码
int k, start, end; //分别表示外圈循环标记,起始和末尾
k = n;
start = 0;
end = n;
while (k > 1) {
for (j = start; j < end; j++)
{
a[start][j] = value++;
}
for (i = start + 1; i < end; i++)
{
a[i][end - 1] = value++;
}
for (j = end - 2; j >= start; j--)
{
a[end - 1][j] = value++;
}
for (i = end - 2; i > start; i--)
{
a[i][start] = value++;
}
k = k - 2;
start = start + 1;
end = end - 1;
}
if (n % 2)
a[start][end - 1] = value;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
printf("%3d", a[i][j]);
printf("\n");
}
return 0;
}
>
10,数组元素和
题目描述
C语言二维数组a[M][N], 给定四个整数LX,LY,RX,RY, 定义函数f(LX,LY,RX,RY)求数组若干元素之和:
输入
输入第一行是两个整数M和N, 表示二维数组a的大小, 0<M,N<=300。
随后有M行, 每行有N个整数,是数组a的数组元素值,值位于-1000到1000之间。
第M+2行是一个整数Q,表示有Q个查询
再随后有Q行,每行有四个空格分开的整数LX,LY,RX,RY。其中0<=LX<=RX<M, 0<=LY<=RY<N
60%的数据, M,N<=20, Q<=20
40%的数据, Q=100000
输出
总共输出Q行
对于每一行查询,输出f(LX,LY,RX,RY)的值。
#include<stdio.h>
int main(void)
{
int n, i, j, k;
scanf("%d %d", &n,&k);
int w, lx, ly, rx, ry;
int a[301][301];
int sum[301][301];
for (i = 1; i <= n; i++) {
for (j = 1; j <= k; j++) {
scanf("%d", &a[i][j]);
sum[i][j] = sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1] + a[i][j];
}
}
scanf("%d", &w);
for (int z = 0; z < w; z++) {
int re = 0;
scanf("%d %d %d %d", &lx, &ly, &rx, &ry);
lx++; ly++; rx++; ry++;
re = sum[rx][ry] - sum[rx][ly-1] - sum[lx-1][ry] + sum[lx-1][ly-1];
printf("%d\n", re);
}
return 0;
}
>
11,数字字符转换
输入一个以回车结束的字符串(少于80个字符),将其中第一次出现的连续的数字字符(0..9)转换为整数,遇到非数字字符则停止。
输入
输入一个以回车结束的字符串(少于80个字符)。
输出
将其中第一次出现的连续的数字字符(0..9)转换为整数,遇到非数字字符则停止。
例如:输入字符串:“x+y = 35+x+9”,则输出的整数是35。
#include<stdio.h>
#include<string.h>
int main()
{
char str1[85],str2[85];
gets(str1);
int n=strlen(str1),min,index,i,j,t;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(str1[i]==str1[j])
{
str1[j]='?';
}
}
}
for(i=0;i<n-1;i++)
{
if(str1[i]=='?')continue;
min=str1[i];
index=i;
for(j=i+1;j<n;j++)
{
if(str1[j]=='?')continue;
if(str1[j]<min)
{
min=str1[j];
index=j;
}
}
t=str1[i];
str1[i]=str1[index];
str1[index]=t;
}
for(i=0;i<n;i++)
{
if(str1[i]=='?')continue;
printf("%c",str1[i]);
}
return 0;
}
>
12,数组循环右移
本题要求实现一个对数组进行循环右移的简单函数:一个数组a中存有n(>)个整数,将每个整数循环向右移m(≥)个位置,即将a中的数据由(a0a1⋯an−1)变换为(an−m⋯an−1a0a1⋯an−m−1)(最后m个数循环移至最前面的m个位置)
#include <stdio.h>
#define MAXN 10
int ArrayShift( int a[], int n, int m );
int main()
{
int a[MAXN], n, m;
int i;
scanf("%d %d", &n, &m);
for ( i = 0; i < n; i++ ) scanf("%d", &a[i]);
ArrayShift(a, n, m);
for ( i = 0; i < n; i++ ) {
if (i != 0) printf(" ");
printf("%d", a[i]);
}
printf("\n");
return 0;
}
int ArrayShift( int a[], int n, int m )
{
int temp;
while(m--)
{
temp = a[n - 1];
for(int j = n - 1; j >= 1; j--)
{
a[j] = a[j - 1];
}
a[0] = temp;
}
}
13,找到最小字符串(实际上考点是未知个字符串的定义)
本题要求编写程序,针对输入的N(1<=N<=100)个字符串,输出其中字典序最小的字符串。
>
输入
输入第一行给出正整数N;随后N行,每行给出一个长度小于80的非空字符串,每个字符都是小写字母。
输出
在一行中用以下格式输出最小的字符串:
Min is: 最小字符串
#include<stdio.h>
#include<string.h>
int main()
{
int n;
scanf("%d",&n);
char a[n][255];
for(int i=0;i<n;i++)
scanf("%s",a[i]);
char min[255];
strcpy(min,a[0]);
for(int i=0;i<n;i++)
{
if(strcmp(min,a[i])>0)
{
strcpy(min,a[i]);
}
}
printf("Min is: %s",min);
return 0;
}
>
14
本题要求编写函数,将输入字符串t中从第m个字符开始的全部字符复制到字符串s中。
函数strmcpy将输入字符串char *t中从第m个字符开始的全部字符复制到字符串char *s中。若m超过输入字符串的长度,则结果字符串应为空串。
#include <stdio.h>
#define MAXN 20
void strmcpy( char *t, int m, char *s );/*需要实现的函数*/
void ReadString( char s[] ); /* 由裁判实现,略去不表,即不用实现 */
int main()
{
char t[MAXN], s[MAXN];
int m;
scanf("%d\n", &m);
ReadString(t);
strmcpy( t, m, s );
printf("%s\n", s);
return 0;
}
void strmcpy( char *t, int m, char *s )
{
int n=strlen(t);
for(int i=0;i<=n-m+1;i++)
{
if(t[m+i-1]=='\0') s[i]='\0';
s[i]=t[m+i-1];
}
}
>
>
15,删除字符
本题要求实现一个删除字符串中的指定字符的简单函数。
来自 <湖南科技大学WebVPN系统>
#include <stdio.h>
#define MAXN 20
void delchar( char *str, char c );
void ReadString( char s[] ); /* 由裁判实现,略去不表 */
int main()
{
char str[MAXN], c;
scanf("%c\n", &c);
ReadString(str);
delchar(str, c);
printf("%s\n", str);
return 0;
}
void delchar(char* str, char c)
{
for (int i = 0; str[i] != '\0'; i++)
{
if (str[i] == c)
{
for (int j = i; str[j] != '\0'; j++)
{
str[j] = str[j + 1];
}
i--;
}
}
}
16,少见的倒序
void f( char *p )
{
int i=0,q=0,h;char huan;
while(p[i]!='\0')
i++;
h=i-1;
while(q<=h)
{
huan=p[q];
p[q]=p[h];
p[h]=huan;
q++;
h--;
}
}
>