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 <stdio.h>
#include <stdlib.h>

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 <stdio.h>
#include <stdlib.h>
#include <math.h>

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 <stdio.h>
#include <stdlib.h>
#include <math.h>

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 <stdio.h>
#include <stdlib.h>
#include <math.h>

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;i<numA;i++){
            if(numA%i==0){
                numB = numB + i;
            }
        }
        if(numB<=3000){
            for(i=1;i<numB;i++){
                if(numB%i==0){
                    sum = sum+i;
                }
            }
            if(sum==numA&&numB>numA){
                printf("(%d,%d)",numA,numB);
            }
        }
    }
    printf("\n");
    return 0;
}
  • 按递增顺序依次列出所有分母为40,分子小于40的最简分数。
# include <stdio.h>

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 <stdio.h>
# include <string.h>

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 <stdio.h>
# include <string.h>

int main () {
    int num[40]={1,1};
    int i,len;
    scanf("%d",&len);
    for(i=2;i<len;i++){
        num[i]=num[i-1]+num[i-2];
    }
    for(i=0;i<len-1;i++){
        printf("%d ",num[i]);
    }
    printf("%d\n",num[len-1]);
    return 0;
}
  • 输入若干个整数,以-1标记输入结束。输出其中的最大数
# include <stdio.h>
# include <string.h>

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 <stdio.h>
# include <string.h>

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 <stdio.h>
# include <math.h>

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<i;j++){
            num = num + a*pow(10.0,j);
        }
        sum = sum + num;
    }
    printf("%d\n",sum);
}
  • 求具有abcd=(ab+cd)2性质的四位数:
# include <stdio.h>
# include <math.h>

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 <stdio.h>

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 <stdio.h>

int main () {
    int n,i,j,sum=0;
    int arr[10][10];
    scanf("%d",&n);
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            scanf("%d",&arr[i][j]);
        }
    }
    for(i=0;i<n;i++){
        sum = sum + arr[i][i];
    }
    for(i=0;i<n;i++){
        if(i!=(n-1-i)){
            sum = sum + arr[i][n-1-i];
        }
    }
    printf("%d\n",sum);
    return 0;
}

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

# include <stdio.h>
# include <math.h>

int main () {
    int n,i,j,sum=0;
    int arr[10][10];
    scanf("%d",&n);
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            scanf("%d",&arr[i][j]);
        }
    }
    for(i=0;i<n;i++){
        sum = sum + arr[i][i];
    }
    if(n%2==0){
        sum = sum*2;
    }
    else {
        sum = sum*2-arr[(n-1)/2][(n-1)/2];
    }
    printf("%d\n",sum);
    return 0;
}
  • 求出1-N中的所有素数:
# include <stdio.h>
# include <math.h>

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 <stdio.h>

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<i;j++){
            if(arr[j]!=arr[i-1-j]){/*判断是否是对称数*/
                flag = 1;
                break;
            }
        }
    }while(flag==1);/*标记为1代表当前数不是对称数,还要继续增值进行判断*/
    printf("新的对称数为:%d,车速为%lf(里程)/s\n",num,(num-95859)/7200.0);  //里程表的数字应该是千米的意思吗???
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,706评论 4 366
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,002评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,462评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,375评论 0 216
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,763评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,849评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,033评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,768评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,490评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,734评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,204评论 1 264
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,566评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,227评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,137评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,934评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,926评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,774评论 2 274

推荐阅读更多精彩内容