zoukankan      html  css  js  c++  java
  • C编程(西安邮电大学MOOC)

    1、最大与次大值

    题目内容:编写程序,找出给定的n个数中的最大值及次大值。

    输入格式:在第一行中输入一个正整数n(1<n≤10)。第二行输入n个整数,用英文逗号,隔开。

    输出格式:在一行中输出最大值及次大值,中间用英文逗号,隔开。

    输入样例:7

    12,1,2,5,4,7,3

    输出样例:12,7

     1 /* 
     2     求最大值、次大值可以不用排序
     3  */
     4 #include <stdio.h>
     5 #define N 100
     6 int main()
     7 {    
     8     int n, a[N] = {0};
     9     scanf("%d",&n);
    10     for(int i=0; i<n-1; ++i){
    11         scanf("%d,",&a[i]);
    12     }
    13     scanf("%d",&a[n-1]);
    14     /* 只一个元素最大次大相同 */
    15     int max1 = a[0], max2 = a[0];
    16     a[1] > max1 ? max1 = a[1] : max2  = a[1];
    17     for(int k=2; k<n; ++k){
    18         if(a[k]>max1){
    19             max2 = max1;
    20             max1 = a[k];
    21         }
    22         else if(a[k]>max2){
    23             max2 = a[k];
    24         }
    25     }    
    26     printf("%d,%d
    ",max1, max2);
    27     return 0;
    28 }
     1 /*  
     2 与只求最大值的程序一样吗,
     3 好像是, 可以排序。
     4 */
     5 #include <stdio.h>
     6 #define N 100
     7 int main()
     8 {    
     9     int n, a[N] = {0};
    10     scanf("%d",&n);
    11     for(int i=0; i<n-1; ++i){
    12         scanf("%d,",&a[i]);
    13     }
    14     scanf("%d",&a[n-1]);
    15     /* 插入排序 */
    16     for(int i = 0; i<n; ++i){
    17         int min = a[i];
    18         int index = i;
    19         for(int j = i+1; j<n; ++j){
    20             if(min>a[j]){ 
    21                 min = a[j];
    22                 index = j;
    23             }                
    24         }
    25         if(index != i){
    26             a[index] = a[i];
    27             a[i] = min;
    28         }
    29     }    
    30     printf("%d,%d
    ",a[n-1],a[n-2]);
    31     return 0;
    32 }

    2、素数排序

    题目内容:输入10个正整数到a数组中,对a[10]数组中的素数升序排序。

    输入格式:在一行中输入10个用英文逗号,隔开的正整数。

    输出格式:在一行中输出升序的素数序列,每个数之间用英文逗号,隔开,末尾没有多余的空格

    输入样例:10,3,1,5,4,8,7,2,9,11

    输出样例:2,3,5,7,11

    输入样例:16,12,1,6,4,8,14,18,24,21

    输出样例:Not found!

     1 /*  */
     2 #include <stdio.h>
     3 #define N 100
     4 /* 判断素数 */
     5 int isPrime(int key)
     6 {
     7     if(key<2)
     8         return 0;
     9     for(int i=2; i<key; ++i)
    10         if(key%i==0)
    11             return 0;
    12     return 1;
    13 }
    14 /* 升序插入 */
    15 void InsertArr(int *arr, int n, int key)
    16 {
    17     int j=n;
    18     while(j>=0 && key>arr[j]){
    19         arr[j+1]=arr[j];/*移动,向后赋值*/
    20         j--;
    21     }
    22     arr[j+1]=key;/**/   
    23 }
    24 int main()
    25 {    
    26     int n=0, arr[N] = {0},a[N] = {0};    
    27     
    28     for(int i=0; i<9; ++i){
    29         scanf("%d,",&a[i]);
    30         if(isPrime(a[i])){
    31             InsertArr(arr,n,a[i]);
    32             n++;
    33         }            
    34     }
    35     scanf("%d",&a[9]);
    36     if(isPrime(a[9])){
    37         InsertArr(arr,n,a[9]);
    38         n++;
    39     }    
    40     if(n==0)
    41         printf("Not found!");
    42     else{
    43         for(int i=n-1; i>0; --i){
    44             printf("%d,",arr[i]);
    45         }
    46         printf("%d",arr[0]);
    47     }
    48     return 0;
    49 }

     3、循环右移

    题目内容:一个数组A中存有N>0个整数,将每个整数循环向右移M≥0个位置,即将A中的数据由(A0A1⋯AN−1)变换为(AN−M⋯AN−1A0A1⋯AN−M−1)(最后M个数循环移至最前面的M个位置)。

    输入格式:第1行输入N(1≤N≤100)和M(≥0)中间用英文逗号,分隔第2行输入N个整数,中间用英文 逗号,分隔。

    输出格式:在一行中输出循环右移M位以后的整数序列,中间用英文逗号,分隔,序列结尾不能有多余空格。

    输入样例:7,3

    1,2,3,4,5,6,7

    输出样例:5,6,7,1,2,3,4

    输入样例:7,0

    1,2,3,4,5,6,7

    输出样例:1,2,3,4,5,6,7

     1 #include <stdio.h>
     2 #define N 100
     3 
     4 /* 头插入 */
     5 void InsertHead(int *arr, int index, int key)
     6 {    
     7     for(int j=index-1; j>=0; j--){
     8         arr[j+1]=arr[j];/*移动*/
     9     }
    10     arr[0]=key;
    11 }
    12 int main()
    13 {    
    14     int n, m, arr[N] = {0};    
    15     scanf("%d,%d",&n,&m);
    16     
    17     for(int i=0; i<n-1; ++i){
    18         scanf("%d,",&arr[i]);        
    19     }
    20     scanf("%d",&arr[n-1]);
    21     
    22     while(m--)
    23         InsertHead(arr,n-1,arr[n-1]);
    24         
    25     for(int i=0; i<n-1; ++i){
    26         printf("%d,",arr[i]);
    27     }
    28     printf("%d",arr[n-1]);    
    29     return 0;
    30 }
     1 /* 算法2 整体右移动m位, 右m位全部移动到数组左边 */
     2 #include <stdio.h>
     3 #define N 100
     4 
     5 int main()
     6 {    
     7     int n, m, arr[N] = {0};    
     8     scanf("%d,%d",&n,&m);
     9     
    10     for(int i=0; i<n-1; ++i){
    11         scanf("%d,",&arr[i]);        
    12     }
    13     scanf("%d",&arr[n-1]);
    14     /* 1.数组整体向右移动m位 */
    15     for(int i=n-1; i>=0; --i)
    16         arr[i+m] = arr[i];
    17     /* 2.右m位全部移动到数组左边 */
    18     for(int i=0; i<m; ++i)
    19         arr[i] = arr[i+n];
    20         
    21     for(int i=0; i<n-1; ++i){
    22         printf("%d,",arr[i]);
    23     }
    24     printf("%d",arr[n-1]);    
    25     return 0;
    26 }
     1 /* 算法3 置换圈 */
     2 #include <stdio.h>
     3 #define N 100
     4 int gcd(int n, int m)//最大公约数
     5 {
     6     while(n)
     7     {
     8         int r = m%n;
     9         m = n;
    10         n = r;
    11     }
    12     return m;
    13 }
    14 int main()
    15 {    
    16     int n, m, arr[N] = {0};    
    17     scanf("%d,%d",&n,&m);
    18     
    19     for(int i=0; i<n-1; ++i){
    20         scanf("%d,",&arr[i]);        
    21     }
    22     scanf("%d",&arr[n-1]);
    23     
    24     int count = gcd(n,m);//圈数(最大公约数)
    25     int length = n / count; //圈长度
    26     for(int i=0; i<count; ++i)//循环处理count圈
    27     {
    28         int t = arr[i]; //圈头元素
    29         int start = i;  //圈头下标
    30         int end = (start-m+n)%n;//圈尾下标
    31         for(int j=1; j<length; j++)//圈内移位
    32         {
    33             arr[start] = arr[end];
    34             start  = end;
    35             end = (end-m+n)%n;
    36         }
    37         arr[start] = t;//圈头元素就位
    38     }
    39     
    40     for(int i=0; i<n-1; ++i){
    41         printf("%d,",arr[i]);
    42     }
    43     printf("%d",arr[n-1]);    
    44     return 0;
    45 }
     1 /* 算法4 逆序 */
     2 #include <stdio.h>
     3 #define N 100
     4 /* 逆序 */
     5 void reverse(int* arr, int left, int right)
     6 {
     7     while(left<right)
     8     {
     9         int t = arr[left];
    10         arr[left] = arr[right];
    11         arr[right] = t;
    12         left++, right--;
    13     }
    14 }
    15 int main()
    16 {
    17     int n, k, arr[N] = {0};    
    18     scanf("%d,%d",&n,&k);
    19     /* 输入数组 */
    20     for(int i=0; i<n-1; ++i){
    21         scanf("%d,",&arr[i]);        
    22     }
    23     scanf("%d",&arr[n-1]);
    24     /* 1.将数组分成两段,左段长为n-k,右段长为k
    25     分别将两段逆转(即元素排列次序与原次序相反) */
    26     reverse(arr,0,n-k-1);    
    27     reverse(arr,n-k,n-1);
    28     /* 2.再数组元素整体逆转 */
    29     reverse(arr,0,n-1);
    30     /* 打印 */
    31     for(int i=0; i<n-1; ++i){
    32         printf("%d,",arr[i]);
    33     }
    34     printf("%d",arr[n-1]);  
    35     return 0;
    36 }
     1 /* 算法5.辅助数组 */
     2 #include <stdio.h>
     3 #define N 100
     4 int main()
     5 {
     6     int n, k, arr1[N] = {0},arr2[N] = {0};    
     7     scanf("%d,%d",&n,&k);
     8     /* 输入数组 */
     9     for(int i=0; i<n-1; ++i){
    10         scanf("%d,",&arr1[i]);        
    11     }
    12     scanf("%d",&arr1[n-1]);
    13     /* 复制 */
    14      for(int i=0; i<n; ++i){
    15         arr2[i] = arr1[(i-k+n)%n];//左移arr1[(i+k)%n];
    16     }
    17     /* 打印 */
    18     for(int i=0; i<n-1; ++i){
    19         printf("%d,",arr2[i]);
    20     }
    21     printf("%d",arr2[n-1]);  
    22     return 0;
    23 }
     1 /* 算法6.循环队列理论,直接输出 */
     2 #include <stdio.h>
     3 #define N 100
     4 int main()
     5 {
     6     int i, n, k, arr[N] = {0};    
     7     scanf("%d,%d",&n,&k);
     8     /* 输入数组 */
     9     for(int i=0; i<n-1; ++i){
    10         scanf("%d,",&arr[i]);        
    11     }
    12     scanf("%d",&arr[n-1]);
    13     
    14     /* 打印 */
    15     for(i=0; i<n-1; ++i){
    16         printf("%d,",arr[(i-k+n)%n]);
    17     }
    18     printf("%d",arr[(i-k+n)%n]);  
    19     return 0;
    20 }

    4、爬楼梯

    题目内容:可爱的小明特别喜欢爬楼梯,他有的时候一次爬一个台阶,有的时候一次爬两个台阶,有的时候一次爬三个台阶。如果这个楼梯有n个台阶,小明一共有多少种爬法呢?n值从键盘输入。

    输入格式:输入一个整数n,(1<=n<46)。

    输出格式:输出当楼梯阶数是n时的上楼方式总数。

    输入样例:1

    输出样例:1

    输入样例:4

    输出样例:7

    输入样例:24

    输出样例:1389537

     1 #include <stdio.h>
     2 
     3 double fun(int n){
     4     if(n==1)
     5         return 1;
     6     else if(n==2)
     7         return 2;
     8     else if(n==3)
     9         return 4;
    10     return fun(n-1) + fun(n-2)+ fun(n-3);
    11 }
    12 
    13 int main()
    14 {
    15     int n;
    16     scanf("%d",&n);
    17     printf("%.f",fun(n));
    18     return 0;
    19 }

    5、三天打鱼两天晒网

    题目内容:中国有句俗语:“三天打鱼两天晒网”,某人从1990年1月1日起开始“三天打鱼两天晒网”。问这个人在以后的某一天是在“打鱼”还是在“晒网”?

    输入样例:1990-1-3

    输出样例:他在打鱼

    输入样例:2018-11-13

    输出样例:他在晒网

     1 #include<stdio.h>
     2 int inputdate();
     3 int main()
     4 {
     5     int n = inputdate();
     6    /*  if(-1==n){
     7         printf("Invalid input");
     8     }
     9     else  */
    10     if(n%5==0||n%5==4){
    11         printf("他在晒网");
    12     }
    13     else{
    14         printf("他在打鱼");
    15     }
    16  
    17     return 0;
    18 }
    19 int inputdate()
    20 {
    21     int year,month,day;
    22     int n = scanf("%4d-%2d-%2d",&year,&month,&day);
    23     /* if(3 != n||year<1990||month>12||month<=0||day>31||day<=0){
    24         return -1;
    25     } */
    26  
    27     int date[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},
    28                      {31,29,31,30,31,30,31,31,30,31,30,31}};
    29  
    30     int sum = 0, flag =(year%4==0&&year%100!=0)||(year%400==0);
    31     for(int i=0;i<month-1;++i){
    32         sum +=date[flag][i];
    33     }
    34  
    35     return sum+day;
    36 }

    6、时间换算

    题目内容:编写程序,实现输入的时间,屏幕显示一秒后的时间。显示格式为HH:MM:SS。

     程序需要处理以下三种特殊情况:

    (1)若秒数加1后为60,则秒数恢复到0,分钟数增加1;

    (2)若分钟数加1后为60,则分钟数恢复到0,小时数增加1;

    (3)若小时数加1后为24,则小时数恢复到0。

    输入样例:18:1:2

    输出样例:18:01:03

    输入样例:20:12:59

    输出样例:20:13:00

    输入样例:23:59:59

    输出样例:00:00:00

     1 #include<stdio.h>
     2 void run();
     3 int main()
     4 {
     5     run();
     6  
     7     return 0;
     8 }
     9 void run()
    10 {
    11     int h,m,s;
    12     scanf("%d:%d:%d",&h,&m,&s);
    13  
    14     s++;
    15     if(s==60){
    16         s=0;
    17         m++;
    18     }
    19     if(m==60){
    20         m=0;
    21         h++;
    22     }
    23     if(h==24){
    24         h=0;
    25     }
    26     printf("%02d:%02d:%02d
    ",h,m,s);
    27 }

    7、正向建立单链表

    题目内容:输入若干个正整数(输入-1为结束标志),要求按输入数据的逆序建立单链表并输出。

    输入格式:一行内输入若干个正整数,之间用空格隔开,并以-1结束。

    输出格式:一行内输出建立的单链表数据结果,之间用两个分隔符 -- 隔开,结束标志-1不输出。

    输入样例:2 4 6 8 10 -1

    输出样例:--2--4--6--8--10

     1 #include <stdio.h>
     2 #include <malloc.h>
     3 typedef struct node NODE;
     4 typedef struct node* Linklist;
     5 struct node{
     6     int data;
     7     Linklist next;
     8 };
     9 /* 
    10 //头插法(输入与输出是逆序)
    11 Linklist create(){
    12     Linklist L,p;
    13     L = p = (Linklist)malloc(sizeof(NODE));
    14     L->next = NULL;
    15     int x;
    16     scanf("%d",&x);
    17     while(x!=-1)
    18     {
    19         p = (Linklist)malloc(sizeof(NODE));
    20         p->data = x;
    21         p->next = L->next;
    22         L->next = p;
    23         scanf("%d",&x);
    24     }
    25     return L;
    26 } */
    27 // 尾插法(输入与输出正序) 
    28 Linklist create(){
    29     Linklist L,p,r;
    30     L = r = (Linklist)malloc(sizeof(NODE));
    31     L->next = NULL;
    32     int x;
    33     scanf("%d",&x);
    34     while(x!=-1)
    35     {
    36         p = (Linklist)malloc(sizeof(NODE));
    37         p->data = x;
    38         p->next = NULL;
    39         r->next = p;
    40         r = p;    
    41         scanf("%d",&x);
    42     }
    43     return L;
    44 }
    45 void print(Linklist L){
    46     while(L->next)
    47     {
    48         L = L->next;
    49         printf("--%d",L->data);
    50     }
    51 }
    52 int main()
    53 {
    54     Linklist L = create();
    55     print(L);
    56     return 0;
    57 }

    8、逆置单链表

    题目内容:一个单链表L=(a1 , a2 , … , an-1 , an),其逆单链表定义为L’=( an , an-1 , … , a2 , a1),编写算法将单链表L逆置,要求逆单链表仍占用原单链表的空间。

    输入格式:一行内输入原单链表中的数据(若干个正整数,之间用空格隔开,并以-1结束

    输出格式:一行内输出建立的原单链表数据结果,之间用两个分隔符 -- 隔开,结束标志-1不输出。

                      下一行内输出逆置后的单链表数据结果,之间用两个分隔符 -- 隔开。

    输入样例:2 4 6 8 10 -1

    输出样例:--2--4--6--8--10

                      --10--8--6--4--2

     1 #include <stdio.h>
     2 #include <malloc.h>
     3 typedef struct node NODE;
     4 typedef struct node* Linklist;
     5 struct node{
     6     int data;
     7     Linklist next;
     8 };
     9 void reverse(Linklist L)
    10 {
    11     Linklist NEW = NULL, CUR = L->next, TEMP;
    12     while(CUR)//是否空
    13     {
    14         TEMP = CUR->next;//保存新表的当前指针的前驱指针(无前驱为NULL)
    15         CUR->next = NEW;// 逆序(NEW为新表当前CUR的后继指针)
    16         NEW = CUR;//更新新表后继指针
    17         CUR = TEMP;//更新新表当前指针      
    18     }    
    19     L->next = NEW;//逆序的头指针插入头结点
    20 }  
    21 Linklist create()
    22 {
    23     Linklist L,p,r;
    24     L = r = (Linklist)malloc(sizeof(NODE));
    25     L->next = NULL;
    26     int x;
    27     scanf("%d",&x);
    28     while(x!=-1)
    29     {
    30         p = (Linklist)malloc(sizeof(NODE));
    31         p->data = x;
    32         p->next = NULL;
    33         /* ---------- */
    34         r->next = p;//尾插
    35         r = p;    //更新尾指针
    36         scanf("%d",&x);
    37     }
    38     return L;
    39 }
    40 void print(Linklist L)
    41 {
    42     while(L->next)
    43     {
    44         L = L->next;
    45         printf("--%d",L->data);
    46     }
    47     printf("
    ");
    48 }
    49 int main()
    50 {
    51     Linklist L = create();
    52     print(L);
    53     reverse(L);//逆序
    54     print(L);
    55     return 0;
    56 }

    9、链表合并

    题目内容:已知单链表LA=(a1,a2,…,am)和LB=(b1,b2,…,bn),编写程序按以下规则将它们合并成一个单链表LC,要求新表 LC利用原表的存储空间。

              LC=(a1b1,…,ambmbm+1,…,bn)m<=n

    或者

          LC=(a1b1,…,an,bn,an+1,…,am),m>n

    输入格式:一行内输入单链表LA中的数据(若干个正整数,之间用空格隔开,并以-1结束

                      一行内输入单链表LB的数据(若干个正整数,之间用空格隔开,并以-1结束

    输出格式:一行内输出合并后单链表LC的数据结果,之间用两个分隔符 -- 隔开,结束标志-1不输出。 

    输入样例:1 3 5 7 -1

                      2 4 6 -1

    输出样例:--1--2--3--4--5--6--7

     1 #include <stdio.h>
     2 #include <malloc.h>
     3 typedef struct node NODE;
     4 typedef struct node* Linklist;
     5 struct node{
     6     int data;
     7     Linklist next;
     8 };
     9 Linklist mergelist(Linklist LA,Linklist LB)
    10 {
    11     /* 
    12         LA的头指针为新链表的头、尾指针
    13         LB的头结点释放
    14     */
    15     Linklist head = LA,rear = LA,temp = LB; 
    16     LA = LA->next;
    17     LB = LB->next;
    18     free(temp);
    19     /* 逐个结点链接到新链表 */
    20     while(LA && LB)
    21     {
    22         /* 先插LA再插LB */
    23         if(LA)
    24         {    
    25             rear->next = LA;//尾插结点
    26             rear = rear->next;//更新尾结点
    27             LA = LA->next;    
    28         }
    29         if(LB)
    30         {        
    31             rear->next = LB;//尾插结点
    32             rear = rear->next;//更新尾结点
    33             LB = LB->next;
    34         }
    35     }
    36     if(LA)
    37         rear->next = LA;//尾插剩余结点
    38     if(LB)
    39         rear->next = LB; 
    40     return head;
    41 }
    42 Linklist create(){
    43     Linklist L,p,r;
    44     L = r = (Linklist)malloc(sizeof(NODE));
    45     L->next = NULL;
    46     int x;
    47     scanf("%d",&x);
    48     while(x!=-1)
    49     {
    50         p = (Linklist)malloc(sizeof(NODE));
    51         p->data = x;
    52         p->next = NULL;
    53         r->next = p;
    54         r = p;    
    55         scanf("%d",&x);
    56     }
    57     return L;
    58 }
    59 void print(Linklist L){
    60     while(L->next)
    61     {
    62         L = L->next;
    63         printf("--%d",L->data);
    64     }
    65     printf("
    ");
    66 }
    67 int main()
    68 {
    69     Linklist L1 = create();
    70     Linklist L2 = create();
    71     Linklist L3 = mergelist(L1,L2);
    72     print(L3);
    73     return 0;
    74 }

    10、求2~2000的所有素数.有足够的内存,要求尽量快

     1 #include <stdio.h>
     2 #include <assert.h>
     3 /* 素数集合 */
     4 int findvalue[2000];
     5 static int find;/*素数集合下标从0开始*/
     6 bool adjust(int value)
     7 {    
     8     assert(value>=2);/* value>=2 */
     9     if(value==2) return true; 
    10     /* 被素数整除的不是素数 */
    11     for(int i=0;i<=find;i++)
    12     {
    13         if(value%findvalue[i]==0)
    14             return false;
    15     }
    16     findvalue[find++];
    17     return true;
    18 }
    19 int main()
    20 {    
    21     /* 测试, 2~100中的素数集合 */
    22     for(int i=2; i<100; ++i)
    23         if(adjust(i))
    24             findvalue[find] = i;
    25     /* 打印素数集合 */
    26     for(int j=0;findvalue[j]; ++j)
    27         printf("%d ",findvalue[j]);
    28     return 0;
    29 }

    11、计算器

    输入一个四则运算算式,运算符为+、-、*、/,操作数为实型数据,对于除法算式,除数不为0,输出算式中的操作数要求保留小数点后两位。

    [测试输入1]1.2+3.4

    [测试输出1]1.20+3.40=4.60

    [测试输入2]2.5*2

    [测试输出2]2.50*2.00=5.00

     1 #include <stdio.h>
     2 #define N 100
     3 int main()
     4 {    
     5     double a,b;    
     6     char op;
     7     scanf("%lf %c%lf",&a,&op,&b);
     8     double result=0;
     9     switch(op){
    10         case '+':result = a+b;break;
    11         case '-':result = a-b;break;
    12         case '*':result = a*b;break;
    13         case '/':result = a/b;break;
    14     }
    15     printf("%.2f%c%.2f=%.2f
    ",a,op,b,result);       
    16     return 0;
    17 }

    12、日期合法性判定

     从键盘输入一个8位整数表示的日期(即yyyymmdd,表示yyyy年mm月dd日),判断该日期是否为合法日期。

    [输入样例] 19990101

    [输出样例] 1999年1月1日是合法日期

    [输入样例] 19361321

    [输出样例] 1936年13月21日是非法日期

    [输入样例] 19780431

    [输出样例] 1978年4月31日是非法日期

    [输入样例] 20000229

    [输出样例] 2000年2月29日是合法日期

    [输入样例] 21000229

    [输出样例] 2100年2月29日是非法日期

    [输入样例] 19980229

    [输出样例] 1998年2月29日是非法日期

     1 #include <stdio.h>
     2 #define N 100
     3 int main()
     4 {    
     5     int arr[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
     6     int y,m,d,flag =0;
     7     scanf("%4d%2d%2d",&y,&m,&d);
     8     int leapyear = y%4==0&&y%100!=0||y%400==0;
     9     if(leapyear) arr[2]++;
    10     if(m<=12&&m>=1&&d<=arr[m]&&d>=1)
    11         flag = 1;
    12     printf("%d年%d月%d日",y,m,d);  
    13     if(flag)
    14         printf("是合法日期");
    15     else
    16         printf("是非法日期");         
    17     return 0;
    18 }

    13、求完数

    一个正整数如果恰好等于它的因子之和,这个数就称为“完数”,编程找出X之内(包含X)的所有完数并从小到大依次输出各个完数,以空格间隔。例如:6=1+2+3,所以6就是完数。

    [样例输入] 100

    [样例输出] 6 28

    [样例输入] 1000

    [样例输出] 6 28 496

     1 #include<stdio.h>
     2 int fun(int i)
     3 {
     4     int sum=0,t = i-1;  
     5     while(t)
     6     {        
     7         if(i%t==0)     
     8             sum += t;
     9         t--;
    10     }
    11     if(sum==i) return 1;
    12     return 0;        
    13 }
    14 
    15 int main()
    16 {
    17     int n,flag=0;
    18     scanf("%d",&n);
    19    
    20     for(int i=6;i<=n;++i)
    21     {
    22         if(fun(i)){
    23             if(flag) printf(" ");
    24             printf("%d",i);
    25             flag = 1;
    26         }
    27     }    
    28     return 0;
    29 }

    14、生日蜡烛

    [题目描述] 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。现在算起来,他一共吹熄了N根蜡烛。

    请问,他从多少岁开始办生日party的,现在他多少岁?

    例如:若N=236,因为236=26+27+28+29+30+31+32+33,所以,他从26岁开始办生日party,他现在33岁。

    [输入说明] 输入一共吹熄的蜡烛数N。

    [输出说明] 输出他办生日party的起止年龄数,以空格隔开;若有多种情况,输出起始年龄最小的一种情况。

    [样例输入] 236

    [样例输出] 26 33

    [样例输入] 186

    [样例输出] 10 21

     1 #include<stdio.h>
     2 void fun(int n, int *s,int *e){
     3     for(int i=1;i<=100;++i)
     4     {
     5         int sum=0;
     6         for(int j=i; j<=100; ++j){
     7             sum += j;
     8             if(sum==n){
     9                 *s=i;
    10                 *e=j;
    11                 return;
    12             }            
    13         }            
    14     }    
    15 }
    16 int main()
    17 {
    18     int n,s,e;
    19     scanf("%d",&n);
    20     fun(n,&s,&e);
    21     printf("%d %d",s,e);
    22     return 0;
    23 }

    15、整数排序

    [题目描述] 从键盘输入n个整数,将其从小到大进行排序,并将排序后的结果输出。特别说明:待排序的整数的个数不超过20个。

    [输入说明] 第一行为n值,第二行输入n个整数,以空格间隔。

    [输出说明] 输出的数据用空格隔开。

    [样例输入] 

    5

    5 6 1 2 3

    [样例输出]

    1 2 3 5 6

     1 /*快速排序*/
     2 #include <stdio.h>
     3 void QuickSort(int *a,int n, int left, int right)
     4 {
     5     int i,j,t; 
     6         /*左指针left指向数组头 右指针right指向数组尾*/
     7     if(left<right){
     8         i=left,j=right+1;/*左右指针*/
     9         while(i<j){
    10             while(i+1<n && a[++i]<a[left]);/*左指针右移 指向大于基数的数据停止*/
    11             while(j-1>-1 && a[--j]>a[left]);/*右指针左移 指向小于基数的数据停止*/
    12             if(i<j)/*满足左指针小于右指针的条件 两指针指向数据交换*/
    13                 t=a[i],a[i]=a[j],a[j]=t;         
    14         }
    15         t=a[left],a[left]=a[j],a[j]=t;/*右指针指向数据与基数交换*/
    16         QuickSort(a,n,left,j-1);/*左边数据递归*/
    17         QuickSort(a,n,j+1,right);/*右边数据递归*/
    18     }
    19 }
    20 
    21 int main()
    22 {
    23     int i,n, arr[20]={0};
    24     scanf("%d",&n);
    25     for(i=0; i<n; ++i)
    26         scanf("%d",&arr[i]);
    27     QuickSort(arr,n,0,n-1);
    28     for(i=0; i<n; ++i)        
    29         printf("%d ",arr[i]);         
    30     return 0;
    31 }
  • 相关阅读:
    JQuery Ajax调用asp.net后台方法
    Android版本检测\自动更新
    android Manifest.xml选项
    Android: 自定义Tab样式
    Android TextView(EditView)文字底部或者中间 加横线
    activity横竖屏翻转不重载
    一句代码过滤字符串中所有tag标签
    去除掉TabHost下面那个边线的小技巧
    软键盘挡住控件的问题
    自定义 textview上LINK的点击事件
  • 原文地址:https://www.cnblogs.com/GoldenEllipsis/p/11703296.html
Copyright © 2011-2022 走看看