C语言半总结

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的倍数相邻。例如571113,1719

代码示例如下:

 

#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中的数据由(a0a1an−1)变换为(anman−1a0a1anm−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--;

    }

     

}

 

 

>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天地过客1124

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值