c语言功能代码(一)

c菜鸟刷题打怪升级,记一些题,以后忘了可以参考参考,若有大神给出厉害的解决方法,感激不尽。
题目来源:http://www.scut.edu.cn/oj/

  • 输入一行数字,用空格分开,以Q或q字符作为结束标志,输出数字:
int main () {
    int i=0,j;
    int arr[100];
    char flag;
    printf("input numStr:");
    do {
        scanf("%d",&arr[i]);
        flag = getchar();
        i++;
    }while( flag!='Q' && flag!='q');
    for(j = 0; j < i-1; j++) {
        printf("%d\t",arr[j]);
    }
    return 0;
}
  • 输入一行数字,空格分开,回车结束,冒泡排序后输出,链表实现:
# include 
#include 

int main () {
    char flag; //作为判断是否输入结束的标志
    int tmp; //冒泡排序时交换数据暂时用的变量
    struct Node {
        int value;
        struct Node* next;
    };
    struct Node* head=NULL; //头结点
    struct Node* q = NULL;
    struct Node* p = NULL;
    head =  (struct Node*)malloc( sizeof(struct Node) );//生成头结点
    head->next = NULL;
    printf("input numStr:");
    //输入数据,生成链表
    while(1){
        p = (struct Node*)malloc( sizeof(struct Node) );
        scanf("%d",&p->value);
        flag =getchar();
        p->next= head->next;
        head->next = p;
        if(flag=='\n'){
            break;
        }
    }
    //冒泡排序
    for(p=head->next;p!=NULL;p=p->next){
        for(q=p->next;q!=NULL;q=q->next){
            if(p->value>q->value){
                tmp = p->value;
                p->value = q->value;
                q->value = tmp;
            }
        }
    }
    //输出链表
    p = head->next;
    while(p!=NULL){
        printf("%d\t",p->value);
        p=p->next;
    }
    return 0;
}
  • 求解一元二次方程:
# include 
#include 
#include 

int main () {
    double a,b,c,delta;
    printf("input a,b,c:");
    scanf("%lf",&a);
    while(a==0){
        printf("a cannot be 0:");
        scanf("%lf",&a);
    }
    scanf("%lf %lf",&b,&c);
    delta = b*b-4*a*c;
    if(delta<0){
        printf("无解");
    }
    else if(delta==0){
        printf("x1=x2=%.2lf",(-b)/(2*a));
    }
    else {
        printf("x1=%.2lf,x2=%.2lf",(-b+sqrt(delta))/(2*a),(-b-sqrt(delta))/(2*a));
    }
    printf("\n");
    return 0;
}
  • 有4个互不相同的数字,输出由其中三个不重复数字组成的排列。
# include 
#include 
#include 

int main () {
    int str[4];
    int i,j,k;
    for(i=0;i<4;i++){
        scanf("%d",&str[i]);
    }
    for(i=0;i<4;i++){
        for(j=0;j<4;j++){
            for(k=0;k<4;k++){
                if(k!=i&&k!=j&&i!=j){
                    printf("%d %d %d\n",str[i],str[j],str[k]);
                }
            }
        }
    }
    return 0;
}
  • 输出所有的"水仙花数".所谓"水仙花数"是指这样的一个三位数:其各位数字的立方和等于该数本身。例如:371是一个"水仙花数",371=33+73+1^3.
# include 
#include 
#include 

int main () {
    int num,tmp,sum,i;
    for(num=100;num<1000;num++){
        tmp = num;
        sum = 0;
        for(i=0;i<3;i++){
            sum = sum+(tmp%10)*(tmp%10)*(tmp%10);
            tmp = tmp/10;
        }
        if(sum == num) {
            printf("%d\n",num);
        }
    }
    return 0;
}
  • 一个自然数被8除余1,所得的商被8除也余1,
    再将第二次的商被8除后余7,最后得到一个商为a.
    又知这上自然数被17除余4.所得的商被17除余15,
    最的得到一个商是a的2倍.
    求这个自然数.
int main () {
    int x = 1993;
    int a,b,c,d,e,f,g;
    while(1){
        a = x%8;//1
        b = (x/8)%8;//1
        c = (x/8)/8/8;//a
        d = (x/8)/8%8;//7
        e = x%17;//4
        f = (x/17)%17;//15
        g = (x/17)/17;//2a
        //printf("%d %d %d %d %d %d %d\n",a,b,c,d,e,f,g);
        if((a==1)&&(b==1)&&(d==7)&&(e==4)&&(f==15)&&(g==2*c))break;
        x++;
    }
    printf("%d\n",x);
    return 0;
}
  • 两个不同的自然数A和B,如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。求3000以内的全部亲密数。3000以内的全部亲密数(输出格式:(A,B),不加换行,不加分隔符号) 一对亲密数只输出一次, 小的在前:
int main () {
    int numA,numB=0;
    int i,sum=0;
    for(numA=1;numA<=3000;numA++){
        sum=0;
        numB=0;
        for(i=1;inumA){
                printf("(%d,%d)",numA,numB);
            }
        }
    }
    printf("\n");
    return 0;
}
  • 按递增顺序依次列出所有分母为40,分子小于40的最简分数。
# include 

int main () {
    int i,factor,j;
    for(i=1;i<40;i++){
        factor = 1;
        for(j=1;j<=i;j++){
            if(i%j==0&&40%j==0){
                factor = j;
            }
        }
        if(factor == 1){
            printf("%d/40,",i);
        }
    }
    printf("\n");
    return 0;
}
  • 某侦察队接到一项紧急任务,要求在A、B、C、D、E、F六个队员中尽可能多地挑若干人,但有以下限制条件:
    1)A和B两人中至少去一人;
    2)A和D不能一起去;
    3)A、E和F三人中要派两人去;
    4)B和C都去或都不去;
    5)C和D两人中去一个;
    6)若D不去,则E也不去。
    问应当让哪几个人去?
# include 
# include 

int main () {
    int a,b,c,d,e,f;
    int flag1=0,flag2=0,flag3=0,flag4=0,flag5=0,flag6=0;
    for(a=0;a<=1;a++){
        for(b=0;b<=1;b++){
            for(c=0;c<=1;c++){
                for(d=0;d<=1;d++){
                    for(e=0;e<=1;e++){
                        for(f=0;f<=1;f++){
                            flag1 = a||b;
                            flag2 = (a==1&&d==0)||(a==0&&d==1);
                            flag3 = (a==1&&e==1&&f==0)||(a==1&&e==0&&f==1)||(a==0&&e==1&&f==1);
                            flag4 = (b==1&&c==1)||(b==0&&c==0);
                            flag5 = (c==1&&d==0)||(c==0&&d==1);
                            flag6 = (d==0&&e==0)||(d==1&&e==1)||(d==1&&e==0);
                            if(flag1&&flag2&&flag3&&flag4&&flag5&&flag6){
                                    if(a==1)printf("A,");
                                    if(b==1)printf("B,");
                                    if(c==1)printf("C,");
                                    if(d==1)printf("D,");
                                    if(e==1)printf("E,");
                                    if(f==1)printf("F,");
                                    return 0;
                            }
                        }
                    }
                }
            }
        }
    }
    return 0;
}
  • 输出N个数的斐波那契数列
# include 
# include 

int main () {
    int num[40]={1,1};
    int i,len;
    scanf("%d",&len);
    for(i=2;i
  • 输入若干个整数,以-1标记输入结束。输出其中的最大数
# include 
# include 

int main () {
    int num[100],i,len=0,max;
    scanf("%d",&num[0]);
    max=num[0];
    while(num[len]!=-1){
        len++;
        scanf("%d",&num[len]);
    }
    for(i=1;i<=len;i++){
        if(num[i]>max){
            max = num[i];
        }
    }
    printf("%d\n",max);
    return 0;
}
  • 求1+2!+3!+...+N!的和(N<=20)
# include 
# include 

int multi (int num) {
    int i,result=1;
    for(i=1;i<=num;i++){
        result = result*i;
    }
    return result;
}

int main () {
    int num,i,result=0;
    scanf("%d",&num);
    for(i=1;i<=num;i++){
        result = result+multi(i);
    }
    printf("%d\n",result);
    return 0;
}
  • 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个一位的整数。
    例如2+22+222+2222+22222(此时共有5个数相加),整数a和n(n个数相加,1<= n, a<=9)
# include 
# include 

int main () {
    int a,n,i,j,num=0,sum=0;
    scanf("%d %d",&a,&n);
    for(i=1;i<=n;i++){
        num = 0;
        for(j=0;j
  • 求具有abcd=(ab+cd)2性质的四位数:
# include 
# include 

int main () {
    int num,front,back;
    for(num=1000;num<10000;num++){
        front = num/100;
        back = num%100;
        if(pow((front+back),2.0) == num){
            printf("%d  ",num);
        }
    }
}
  • 按如下递归公式求函数值。
    x=1时 f(x)=10;x>1时 f(x)=f(x-1)+2.输入x输出f(x)的值
# include 

int f(int x){
    if(x==1) return 10;
    if(x>1) return f(x-1)+2;
}
int main () {
    int x;
    scanf("%d",&x);
    printf("%d\n",f(x));
    return 0;
}
  • 求矩阵的两对角线上的元素之和,输入:矩阵的行数N和一个N*N的整数矩阵a[N][N] (N<=10),输出:所输矩阵的两对角线上的元素之和:
# include 

int main () {
    int n,i,j,sum=0;
    int arr[10][10];
    scanf("%d",&n);
    for(i=0;i

法二:利用矩阵对角线相加的规律:若N为奇数,则和为正对角线和乘以2再减去矩阵的最中间数arr[i][i](因为中间值被算了两次,所以要减掉);若N为偶数,则和为正对角线和乘以2.

# include 
# include 

int main () {
    int n,i,j,sum=0;
    int arr[10][10];
    scanf("%d",&n);
    for(i=0;i
  • 求出1-N中的所有素数:
# include 
# include 

int main () {
    int n,i,num,flag;
    scanf("%d",&n);
    for(num=2;num<=n;num++){
        flag = 0;
        for(i=2;i<=sqrt((double)num);i++){
            if(num%i==0){
                flag = 1;
                break;
            }
        }
        if(flag == 0){
            printf("%d ",num);
        }
    }
    return 0;
}
  • 一辆以固定速度行驶的汽车,司机在上午10点看到里程表上的读数是一个对称数(即这个数从左向右读和从右向左读是完全一样的),为95859。两小时后里程表上出现了一个新的对称数。问该车的速度是多少?新的对称数是多少?
# include 

int main () {
    int num = 95859;
    int shang,yu;
    int arr[20],i,j,flag;
    do{
        num++;
        shang = num;
        i=0;
        flag=0;
        /*分解当前值,得到每一位,存入数组*/
        do {
            yu = shang%10;
            shang = shang/10;
            arr[i] = yu;
            i++;
        }while(shang!=0);
        for(j=0;j

你可能感兴趣的:(c语言功能代码(一))