c語言習題

C語言習題

1.學生成績信息管理

#include  <stdio.h>
#define STUD   30           /* 最多可能的學生人數 */
#define COURSE 5            /* 最多可能的考試科目數 */
void  Total(int pScore[][COURSE], int sum[], float aver[], int m, int n);
void  Print(int pScore[][COURSE], int sum[], float aver[], int m, int n);
int main()
{
    int     i, j, m, n, score[STUD][COURSE], sum[STUD];
    float   aver[STUD];
    printf("How many students?");
    scanf("%d", &m);
    printf("How many courses?");
    scanf("%d", &n);
    printf("Input scores:\n");
    for (i = 0; i < m; i++)
    {
        for (j = 0; j < n; j++)
        {
            scanf("%d", &score[i][j]);
        }
    }
    Total(score, sum, aver, m, n);
    Print(score, sum, aver, m, n);
    return 0;
}
void  Total(int pScore[][COURSE], int sum[], float aver[], int m, int n)
{
    int  i, j;
    for (i = 0; i < m; i++)
    {
        sum[i] = 0;
        for (j = 0; j < n; j++)
        {
            sum[i] = sum[i] + pScore[i][j];
        }
        aver[i] = (float) sum[i] / n;
    }
}
void  Print(int pScore[][COURSE], int sum[], float aver[], int m, int n)
{
    int  i, j;
    printf("Result:\n");
    for (i = 0; i < m; i++)
    {
        for (j = 0; j < n; j++)
        {
            printf("%4d\t", pScore[i][j]);
        }
        printf("%5d\t%6.1f\n", sum[i], aver[i]);
    }
}

2.將輸入同學的名字按順序排列

#include <stdio.h>
#include <string.h>
main()
{
    char a[5][10],t[10];
    int i,j;
    for(i=0;i<5;i++)
    {
        printf("請輸入第%d個同學名字:",i+1);
        gets(a[i]);
    }
    for(i=1;i<5;i++)
        for(j=0;j<5-i;j++)
        if(strcmp(a[j],a[j+1])<0)
        {
            strcpy(t,a[j]);
            strcpy(a[j],a[j+1]);
            strcpy(a[j+1],t);
        }
    for(i=0;i<5;i++)
        puts(a[i]);
    }

3.實現字符串的逆序輸出

#include <stdio.h>
#include <string.h>
void main()
{
  char str[100];
  int n, i;
  printf("Input a string:");
  scanf("%s", str);
  n = strlen(str);

  printf("The reversed string:");
  for (i = n - 1; i >= 0; i--)
    printf("%c", str[i]);
  printf("\n");
}

運行結果:
Please Enter String1: 0
2 Result is: 0
3 .tneduts a ma I
4.找到3*4矩陣中的最大元素

#include<stdio.h>
int max(int a, int b, int c, int d);
main()
{
    int a, b, c, d, a1, b1, c1, d1, a2, b2, c2, d2;
    int q, w, e;
    scanf("{{%d,%d,%d,%d},{%d,%d,%d,%d},{%d,%d,%d,%d}}", &a, &b, &c, &d, &a1, &b1, &c1, &d1, &a2, &b2, &c2, &d2);
    q = max(a, b, c, d);
    w = max(a1, b1, c1, d1);
    e = max(a2, b2, c2, d2);
    printf("max value is %d\n", max(q, q, w, e));
}
int max(int a, int b, int c, int d)
{
    int x;
    if (a > b) x = a;
    else x = b;
    if (x > c);
    else x = c;
    if (x > d);
    else x = d;
    return x;
}

5.找到字符串中的最大元素和最小元素及其位置

#include<stdio.h>
main()
{
    int a[10], i, k, flag = 1;
    for (i = 0; i < 10; i++)
    {
        scanf("%d", &a[i]);
    }
    i = 0;
    do
    {
        for (k = 0; k < 10; k++)
        {
            if (a[i] < a[k])
                flag = 0;
        }
        i++;
    }
    while (flag == 0 && i < 10);
    printf("max=%d, pos=%d\n", a[i - 1], i - 1);
    i = 0;
    flag = 1;
    do
    {
        for (k = 0; k < 10; k++)
        {
            if (a[i] > a[k])
                flag = 0;
        }
        i++;
    }while (flag == 0 && i < 10);
    printf("min=%d, pos=%d\n", a[i - 1], i - 1);

}

6.指數n於[2,50]中梅森尼數共有幾個
形如2^n - 1的素數稱爲梅森尼數。設計求出指數n<50的所有梅森尼數。
**輸出格式要求:”2^%d-1=%.0lf\n” “指數n於[2,50]中梅森尼數共有%d個.”
程序運行示例如下:
2^2-1=3
2^3-1=7
2^5-1=31
2^7-1=127
2^13-1=8191
2^17-1=131071
2^19-1=524287
2^31-1=2147483647
2^49-1=562949953421311
指數n於[2,50]中梅森尼數共有9個.

#include<stdio.h>
#include<math.h>
int sushu(long double n);
main()
{
    int i, j, count = 0;
    long double n = 1;
    for (i = 2; i < 50; i++)
    {
        for (j = 1; j <= i; j++)
        {
            n = n * 2;
        }
        n = n - 1;
        if (sushu(n) == 1)
        {
            printf("2^%d-1=%.0lf\n", i, n);
            count++;
        }
    }
    printf("指數n於[2,50]中梅森尼數共有%d個.", count);
}
int sushu(long double n)
{
    long long int k, t;
    t = (long long int)n;
    for (k = 2; k < t; k++)
    {
        if (t % k == 0)
            return 0;
    }
    return 1;
}

7.
魔術師利用一副牌中的13張紅桃,預先將它們排好後迭在一起,牌面朝下。對觀衆說:“我不看牌”,只數數就可以猜到每張牌是什麼,我大聲數,你們聽,不信?你們就看。魔術師將最上面的那張牌數爲1,把它翻過來正好是紅桃A,將紅桃A放在桌子上,然後按順序從上到下數手中的餘牌,第二次數1、2,將第一張牌放在這迭牌的下面,將第二張牌翻過來,正好是紅桃2,也將它放在桌子上。第三次數1、2、3,將前面兩張依次放在這迭牌的下面,再翻第三張牌正好是紅桃3.這樣依次將13張牌全翻出來,準確無誤。問魔術師手中的牌原始次序是怎樣安排的?
**輸出格式要求:”%d “

#include<stdio.h>
main()
{
    int a[13] = {0};
    int i, j, k = 0;
    for (i = 1; i <= 13; i++)
    {
        if (k > 13)
            k = k - 13;
        for (j = 1; j <= i; j++)
        {
            if (a[k + j-1] != 0)
                j--;
        }
        a[k+i-1] = i;
        k = k + i;
    }
    printf("The original order of cards is:");
    for (i = 0; i < 13; i++)
        printf("%d", a[i]);
}
#include<stdio.h>

int main()
{                        
    int cards[14] = {0};
    int i, j = 1, n;
    for (i = 1 ; i <= 13 ; i++)
    {                        
        n = 1;
        do
        {                        
            if (j > 13)
                j = 1;
            if (cards[j] > 0)
                j++;
            else
            {                        
                if (n == i)
                    cards[j] = i;
                j++;
                n++;
            }
        }
        while (n <= i);
    }
    for (i = 1; i <= 13; i++)
        printf("%d ", cards[i]);
    printf("\n");

    return 0;
}     
#include<stdio.h>
#include<string.h>
main()
{
    int a[14];
    int i , j, n = 0;
    for (i = 1; i <= 13 ; i++) a[i] = 0;
    for (i = 1; i <= 13 ; i++)
    {
        for (j = 1 ; j <= i;)
        {
            n = (n % 13) + 1;
            if (a[n] == 0) j++;
        }
        a[n] = i  ;
    }

    printf("The original order of cards is:");
    for (i = 1; i <= 13; i++)
        printf("%d ", a[i]);
    return 0;
} 

8.最大公約數

int gcd(int a, int b)
{
    if (a < b)
        return gcd(a, b - a);
    else if (a > b)
        return gcd(a - b, b);
    else return a;
}
int MaxCommonFactor(int a, int b)
{
    int r;
    if (a <= 0 || b <= 0)
        return -1;
    do
    {
        r = a % b;
        a = b;
        b = r;
    }
    while (r != 0);
    return  a;
}

9.最小公倍數

int MinCommonMultiple(int a, int b)
{
    int i;

    for (i = 1; i <= a * b; i++)
    {
        if ((i * a) % b == 0)
            return i * a;
    }
    return 0;
}

10.除式還原
給定下列除式,其中包含5和7,其它打X的位置上是任意數字,請加以還原。
X7X ——-商
——– ——-被除數
除數–XX)XXXXX
X77
——–
X7X
X7X
——-
XX
XX
——-
0

**輸出格式要求:”%ld/%d=%d\n”
程序運行示例如下:
51463/53=971

#include <stdio.h>
#include <stdlib.h>
main()
{   long int i;
    int j,k,l;
    for(i=10000;i<=99999;i++)
        if(i%1000-i%100==400)
            for(j=10;j<=99;j++)
                if(i%j==0&&(l=i/j)%100>=70&&i%100<80&&i%10!=0&&l>100&&l<=999)
                    if(j*(l%10)<100&&j*(l%10)>10)
                        if(j*7%100>=70&&j*7%100<80)
                            if(j*(l/100)%100==77&&j*(l/100)>100)
                                printf("%ld/%d=%d\n",i,j,l);
} 

my answer:

#include <stdio.h>
#include <math.h>
main()
{
    int b,c,d,e,f,g,h,i,j,k;
    long a;
    for(a=10000; a<100000; a++)
    {
        c=a/10000;
        d=a/1000%10;
        e=a/100%10;
        f=a/10%10;
        g=a%10;
        for(b=10; b<100; b++)
        {
            if(c*10+d<b)
            {
                if(d*10+e>77){
                if((c*100+77)%b==0&&(c*100+77)/b>=1&&(c*100+77)/b<=9)
                {
                    if((a/100-(c*100+77))%10==7&&(a/100-(c*100+77))<97)
                    {
                        h=a/100-(c*100+77);

                        j=(h*10+f)-b*7;

                        if(b*7/10%10==7&&j<10)
                        {
                            if((j*10+g)%b==0&&(j*10+g)/b>=1&&(j*10+g)/b<=9)
                            {
                                if((float)a/b==a/b&&a/b/10%10==7)

                                    printf("%ld/%d=%d\n",a,b,a/b);
                            }
                        }
                    }
                }
                }
                else if(((c-1)*100+77)%b==0&&((c-1)*100+77)/b>=1&&((c-1)*100+77)/b<=9)
                {
                    if((a/100-((c-1)*100+77))%10==7&&(a/100-((c-1)*100+77))<97)
                    {

                        i=a/100-((c-1)*100+77);

                        k=(i*10+f)-b*7;
                        if(b*7/10%10==7&&k<10)
                        {
                            if((i*10+g)%b==0&&(i*10+g)/b<=9&&(i*10+g)/b>=1)
                            {
                                if((float)a/b==a/b&&a/b/10%10==7)

                                    printf("%ld/%d=%d\n",a,b,a/b);
                            }
                        }
                    }
                }
            }
        }

    }
}
#include<stdio.h>
main()
{
    int b,c,d,e,f,g,h,i,j,k,l,m;
    long a;
    for(a=10000; a<100000; a++)
    {
        c=a/10000;
        d=a/1000%10;
        e=a/100%10;
        f=a/10%10;
        g=a%10;
        for(b=10; b<100; b++)
        {
            if(c*10+d<b)
            {
                for(h=1; h<=9; h++)
                {
                    j=b*h;
                    k=a/100-j;
                    if(j%100==77&&k<b&&k>0)
                    {
                        k=k*10+f;
                        l=b*7;
                        if(l/10%10==7)
                        {
                            if(k-l<10&&l<k)
                            {
                                m=(k-l)*10+g;
                                for(i=1; i<=9; i++)
                                {
                                    if(i*b==m&&(float)a/b==a/b)
                                        printf("%ld/%d=%d\n",a,b,a/b);
                                }
                            }
                        }
                    }

                }


            }
        }
    }
}

11.
和數能表示1~23的5個正整數
已知五個互不相同的正整數之和爲23,且從這五個數中挑選若干個加起來可以表示從1
到23之內的全部自然數,問這五個數都是什麼?
**輸入格式要求:提示信息:”There are following possible result:\n”
**輸出格式要求:”[%d]:%d,%d,%d,%d,%d\n”
程序運行示例如下:
There are following possible result:

#include <stdio.h>
void main()
{
   int a,b,c,d,e,i,j,k,l,m,x,count=0,f=0;  
   printf("There are following possble result:\n");
   for(a=1;a<=23;a++)         
      for(b=1+a;b<=23-a;b++)
         for(c=1+b;c<=23-a-b;c++)
            for(d=1+c;d<=23-a-b-c;d++)
            {
               f=1;
               if((e=23-a-b-c-d)>d)
                  for(f=0,x=1;x<24&&!f;x++)     
                     for(f=1,i=0;i<2&&f;i++)    
                        for(j=0;j<2&&f;j++)
                           for(k=0;k<2&&f;k++)
                              for(l=0;l<2&&f;l++)
                                 for(m=0;m<2&&f;m++)
                                    if(x==a*i+b*j+c*k+d*l+e*m) f=0;
               if(!f) printf("[%d]:%d,%d,%d,%d,%d\n",++count,a,b,c,d,e);
            }
}

12.
用牛頓迭代法求方程2x^3-4x^2+3x-6=0在1.5附近的根。
**輸出格式要求:”方程的根=%6.2f\n”
程序的運行示例如下:
方程的根= 2.00

#include<stdio.h>
#include<math.h>
main()
{
    float f, f1, x0, x1;
    x1 = 1.5;
    do
    {
        x0 = x1;
        f = 2 * x0 * x0 * x0 - 4 * x0 * x0 + 3 * x0 - 6;
        f1 = 6 * x0 * x0 - 8 * x0 + 3;
        x1 = x0 - f / f1;
    }
    while (fabs(x0 - x1) > 1e-5);
    printf("方程的根=%6.2f\n", x1);
}

13.減式還原
編寫程序求解下式中各字母所代表的數字,不同字母代表不同的數學。
**輸出格式要求:
” PEAR %d%d%d%d\n”
” ARA - %d%d%d\n”
“———– —————-\n”
” PEA %d%d%d\n”
程序運行示例如下:
PEAR 1098
ARA - 989
———– —————-
PEA 109

#include <stdio.h>
void main()
{
   int p,e,a,r;
   for(p=1;p<=9;p++)
   {
       for(a=1;a<=9;a++)
       {
           for(e=0;e<=9;e++)
           {
               for(r=0;r<=9;r++)
               {
                   if(p*100+e*10+a+a*100+r*10+a==p*1000+e*100+a*10+r)
                   {
                       printf("    PEAR        %d%d%d%d\n",p,e,a,r);
                       printf("     ARA       -  %d%d%d\n",a,r,a);
                       printf("-----------   ----------------\n");
                       printf("     PEA           %d%d%d\n",p,e,a);
                   }
               }
           }
       }
   }
}

14.乘式還原

A代表數字0到9中的前五個數字,Z代表後五個數字,請還原下列乘式
      AZA
  *  AAZ
  -------
    AAAA
   AAZZ
   ZAA
  -------
   ZAZAA

**輸出格式要求:"\n   %ld\n" "*  %ld\n" "--------------\n" "  %ld\n %ld\n %ld\n" " %ld\n"
程序運行示例如下:
   372
*  246
--------------
  2232
 1488
 744
--------------
 91512
#include <stdio.h>
void main()
{
    int a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,M,N;
    int flag1,flag2,flag3;
    for(a=0; a<=4; a++)
    {
        for(p=5; p<=9; p++)
        {
            for(b=0; b<=4; b++)
            {
                flag1=flag2=flag3=0;
                M=a*100+p*10+b;
                for(q=5; q<=9; q++)
                {
                    if(q*M>1000)
                    {
                        h=q*M%10;
                        e=q*M/1000;
                        f=q*M/100%10;
                        g=q*M/10%10;
                        if(e<=4&&f<=4&&g<=4&&h<=4)
                        {
                            flag1=1;
                            break;
                        }
                    }
                }
                if(flag1)
                {
                    for(d=0;d<=4;d++)
                    {
                        if(d*M>1000)
                        {
                            s=d*M%10;
                        i=d*M/1000;
                        j=d*M/100%10;
                        r=d*M/10%10;
                        if(i<=4&&j<=4&&r>=5&&s>=5)
                        {
                            flag2=1;
                            break;
                        }
                        }
                    }
                }
                if(flag1&&flag2)
                {
                    for(c=0;c<=4;c++)
                    {
                        if(c*M<1000&&c*M>99)
                        {
                            t=c*M/100;
                            k=c*M/10%10;
                            l=c*M%10;
                            if(t>=5&&k<=4&&l<=4)
                            {
                                flag3=1;
                                break;
                            }
                        }
                    }
                }
                if(flag1&&flag2&&flag3)
                {
                    N=(c*100+d*10+q)*M;
                    if(N>10000)
                    {
                        v=N/10000;
                        m=N/1000%10;
                        u=N/100%10;
                        n=N/10%10;
                        o=N%10;
                        if(v>=5&&m<=4&&u>=5&&n<=4&&o<=4)
                        {
                            printf("\n   %ld\n",M);
                            printf("*  %ld\n",c*100+d*10+q);
                            printf("--------------\n");
                            printf("  %ld\n %ld\n %ld\n",e*1000+f*100+g*10+h,i*1000+j*100+r*10+s,t*100+k*10+l);
                            printf("--------------\n");
                            printf(" %ld\n",N);
                        }
                    }
                }
            }
        }
    }
}

15.冒泡法排序

void bubblesort(int a[], int n)
{
    int i, j, temp;
    for (i = 0; i < n - 1; i++)
    {
        for (j = 1; j < n - i; j++)
        {
            if (a[j] < a[j - 1])
            {
                temp = a[j];
                a[j] = a[j - 1];
                a[j - 1] = temp;
            }
        }

    }
}

16.
面程序的功能是從鍵盤輸入一行字符,統計其中有多少單詞。假設單詞之間以空格分開。[提示:判斷是否有新單詞出現的方法是——當前被檢驗的字符不是空格,而前一被檢驗字符是空格,則表示有新單詞出現。]

#include<stdio.h>
#define ARR_SIZE 80; 
main()
{
    char str[ARR_SIZE];
    int i, num;

    gets(str);
    if(str[0] != ' ' && str[0] != '\0')
    {
        num = 1;
    }
    else
    {
        num = 0;
    }
    for(i = 1 ; str[i] != '\0'; i++)
    {
        if(str[i]  != ' ' && str[i-1]  = ' ') 
        {
            num++;
        }
    }
    printf("num=%d\n", num);
}

#include<stdio.h>
#define ARR_SIZE 80
main()
{
    char str[ARR_SIZE];
    int i, num;

    gets(str);
    if (str[0] != ' ' && str[0] != '\0')
    {
        num = 1;
    }
    else
    {
        num = 0;
    }
    for (i = 1 ; str[i] != '\0'; i++)
    {
        if (str[i]  != ' ' && str[i - 1]  == ' ')
        {
            num++;
        }
    }
    printf("num=%d\n", num);
}

17.
輸入一行字符(最長不超過80字符),用函數編程統計用戶的輸入中一共有多少個包含三個字母以上的單詞(包括三個字母)。假設單詞之間以空格分開。判斷新單詞出現的基本思路是:若當前被測字符不是空格,而前一字符是空格,則表示有新單詞出現。對於第一個單詞只要判斷當前字符不是空格即可。【提示:當新單詞出現時,若該單詞中包含的字母數≥3個,即啓動計數器】
函數原型:int CountWords(char str[]);
其中,字符數組str用於存儲用戶輸入的一行字符,函數的返回值爲包含三個字母以上的單詞個數。
**輸入提示信息:”Input a string:\n”
**輸入格式:gets()
**包含三個字母以上的單詞總數輸出格式:”Numbers of words (include 3 or more letters) = %d\n”
程序運行示例1:
Input a string:
i am a good teacher↙
Numbers of words (include 3 or more letters) = 2

程序運行示例2:
Input a string:
a s ff↙
Numbers of words (include 3 or more letters) = 0

注:不能使用指針、結構體、共用體、文件、goto、枚舉類型進行編程。

#include <stdio.h>
int CountWords(char str[]);
int  main()
{                 
    char  str[80];
    printf("Input a string:\n");
    gets(str);
    printf("Numbers of words (include 3 or more letters) = %d\n", CountWords(str));
    return 0;
}                 
int CountWords(char str[])
{                 
    int    i, k;
    int num3 = 0, temp = 0;
    if (str[0] == ' ') //1
    {                 
        num3 = 0;
        temp = 0;
    }
    else
    {                 
        k = 0;
        while (str[k] != ' ')//1
        {                 
            temp++;
            k++;
        }
        if (temp >= 3) num3++;
    }

    for (i = 1; str[i] != '\0'; i++) //1
    {                 
        temp = 0;
        if (str[i] != ' ' && str[i - 1] == ' ') //1
        {                 

            k = i;
            while (str[k] != ' ' && str[k] != '\0')//1
            {                 
                temp++;
                k++;
            }
            if (temp >= 3) num3++;//1
        }
    }

    return num3;//1
}           
#include<stdio.h>
#include<string.h>
int CountWords(char str[])
{
    int count = 0, i = 0, word = 0;
    if (str[0] != ' ' && str[0] != '\0')
    {
        for (i = 0; str[i] != ' '; i++)
        {
            word++;
        }

        if (word >= 3)
            count++;
    }
    for (; str[i] != '\0'; i++)
    {
        word = 0;
        if (str[i] != ' ' && str[i - 1] == ' ')
        {
            for (; str[i] != ' '&&str[i]!='\0'; i++)
            {
                word++;
            }
            i--;
            if (word >= 3)
                count++;
        }
    }
    return count;
}
main()
{
    char a[80];
    printf("Input a string:\n");
    gets(a);
    int n;
    n = CountWords(a);
    printf("Numbers of words (include 3 or more letters) = %d\n", n);
}

18.走臺階
樓梯有10階臺階,上樓可以一步上1階,也可以1步上2階,編程計算10階臺階總共有多少走法.
提示:可以遞推計算,如1階臺階總共一種走法,2階臺階總共2走法,3階臺階總共3種走法,直到計算出10階臺階走法.

#include<stdio.h>
int f(int n);
main()
{
    printf("Result=%d", f(10));
}
int f(int n)
{
    if (n == 1)
        return 1;
    else if (n == 2)
        return 2;
    else return f(n - 1) + f(n - 2);
}

19.
*已知銀行的存款利息如下。某人有2000元錢,要存二十年,問怎樣存才能使二十年後得到的本金和複利合計最多(假定銀行對定期存款過期部分不付利息)?

月利息率=0.63%0.66%0.69%0.75%0.84%期限一年期限二年期限三年期限五年期限八年

**輸出格式要求:”8 year:%d\t 5 year:%d\t 3 year:%d\t2 year:%d\t 1 year:%d\nTotal:%.2f\n”
程序運行示例如下:
8 year:0 5 year:4 3 year:0 2 year:0 1 year:0
Total:8841.01

#include <stdio.h>
#include <math.h>
main()
{                  
    int i8,i5,i3,i2,i1,n8,n5,n3,n2,n1;
    float max=0,term;
    for(i8=0;i8<3;i8++)
        for(i5=0;i5<=(20-8*i8)/5;i5++)
            for(i3=0;i3<=(20-8*i8-5*i5)/3;i3++)
                for(i2=0;i2<=(20-8*i8-5*i5-3*i3)/2;i2++)
                {                  
                    i1=20-8*i8-5*i5-3*i3-2*i2;
                    term=2000.0*pow(1+0.0063*12,(double)i1)
                                *pow(1+2*0.0066*12,(double)i2)
                                *pow(1+3*0.0069*12,(double)i3)
                                *pow(1+5*0.0075*12,(double)i5)
                                *pow(1+8*0.0084*12,(double)i8);
                    if(term>max)
                    {                  
                        max=term;
                        n1=i1;n2=i2;n3=i3;n5=i5;n8=i8;
                    }
                }
    printf("8 year:%d\t 5 year:%d\t 3 year:%d\t",n8,n5,n3);
    printf("2 year:%d\t 1 year:%d\n",n2,n1);
    printf("Total:%.2f\n",max);
}    

20.
對於用戶指定的正整數n,編程計算並輸出滿足下面平方根不等式的最小正整數m。

√m+√(m+1)+·····+√2m>n

輸入提示信息:”Input n:”

輸入數據格式:”%lf”

輸入數據格式和提示信息:”m>=%d\n”

程序運行結果示例1:

Input n:10000↙

m>=407

程序運行結果示例2:

Input n: 100000↙

m>=1888

#include <stdio.h>
#include <math.h>
int main()
{                            
    int i, m;
    double s, n;
    printf("Input n:");
    scanf("%lf", &n);
    for (m=1;; m++)
    {                            
         s = 0;
         for (i=m; i<=2*m; i++)
         {                           
             s = s + sqrt(i);
         }
         if (s > n)   break;
    }
    printf("m>=%d\n", m);
    return 0;
}  

21.迴文數
數值151是一個迴文素數。因爲151既是一個素數也是一個迴文數(迴文數是從前向後讀和從後向前讀都一樣的數)。寫一個程序找出所有在[a,b]區間內的迴文素數(5 <= a < b <= 1000,000,000)。

輸入
第一行:”%d %d”

輸出
符合條件的迴文素數,一個數一行。

輸入樣例
5 500
輸出樣例
5
7
11
101
131
151
181
191
313
353
373
383

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

// Judge if the palindromes that have been found are primes
int primer(int number)
{        
    int i;
    int sqrt_number;
    sqrt_number = sqrt(number);
    for (i = 3; i <= sqrt_number; i += 2)
    {        
        if ((number % i) == 0)
            return 0; //The number is not prime
    }
    return 1; // The number is prime
}        

int main()
{        
    int a, b; // Enter two numbers as the range of prime palindromes
    int x;
    int o, p, q, r, s;

    scanf("%d %d", &a, &b);

    if (a == 5 && 5 <= b)
        printf("%d\n", 5);
    if (a <= 7 && 7 <= b)
        printf("%d\n", 7);
    if (a <= 11 && 11 <= b)
        printf("%d\n", 11);
    // Find the prime palindromes in the range of 100 and 1000
    for (o = 1; o <= 9; o += 2)
        for (p = 0; p <= 9; p++)
        {        
            x = 100 * o + 10 * p + o;
            if (primer(x) && x <= b && x >= a)
                printf("%d\n", x);
        }
    // Find the prime palindromes in the range of 10000 and 100000
    for (o = 1; o <= 9; o += 2)
        for (p = 0; p <= 9; p++)
            for (q = 0; q <= 9; q++)
            {        
                x = 10000 * o + 1000 * p + 100 * q + 10 * p + o;
                if (primer(x) && x <= b && x >= a)
                    printf("%d\n", x);
            }
    // Find the prime palindromes in the range of 1000000 and 10000000
    for (o = 1; o <= 9; o += 2)
        for (p = 0; p <= 9; p++)
            for (q = 0; q <= 9; q++)
                for (r = 0; r <= 9; r++)
                {        
                    x = 1000000 * o + 100000 * p + 10000 * q +
                        1000 * r + 100 * q + 10 * p + o;
                    if (primer(x) && x <= b && x >= a)
                        printf("%d\n", x);
                }
    // Find the prime palindromes in the range of 100000000 and 1000000000
    for (o = 1; o <= 9; o += 2)
        for (p = 0; p <= 9; p++)
            for (q = 0; q <= 9; q++)
                for (r = 0; r <= 9; r++)
                    for (s = 0; s <= 9; s++)
                    {        
                        x = 100000000 * o + 10000000 * p + 1000000 * q +
                            100000 * r + 10000 * s + 1000 * r + 100 * q + 10 * p + o;
                        if (primer(x) && x <= b && x >= a)
                            printf("%d\n", x);
                    }

    return 0;
}  
#include<stdio.h>
#include<string.h>
int hw(int num)
{
    int temp;
    int sum=0;
    temp=num;
    while(num)
    {
        sum = sum*10 + num%10; 
        num /= 10;
    }
    if(temp == sum) 
        return 1;
    else
        return 0;

}
main()
{
    int a, b, i, j, flag = 0, k;
    scanf("%d %d", &a, &b);
    for (i = a; i <= b; i++)
    {
        flag = 1;
        k = 0;
        for (j = 1; j <= i; j++)
        {
            if (i % j == 0)
                flag = 0;
        }
        if (flag == 1)
        {
            k = hw(i);
            if (k == 1)
                printf("%d\n", i);
        }

    }
}

22.
奧運會參賽國國名排序:
請輸入奧運會參賽國的國名,並按照字典序對其進行排序。
要求:參賽國不超過150個,各個國家的名字均不超過9個字符。
提示:‘\0’佔一個字符。

#include <stdio.h>
#include <string.h>
#define N 30
int main( )
{                
    char  str[N], c;
    int  n, i, j;

    printf("Please Enter String1:\n");
    gets(str);              //1
    n = strlen(str) - 1;    //1

    for (i = 0; i <= n / 2; i++)  //1
    {                
        c = str[i];             //1
        str[i] = str[n - i];    //1
        str[n - i] = c;         //1
    }

    printf("Result is:\n%s\n", str);
    return 0;
}  

23.完全數
完全數(Perfect Number),又稱完美數或完數,它是指這樣的一些特殊的自然數。它所有的真因子(即除了自身以外的約數)的和,恰好等於它本身,即m的所有小於m的不同因子(包括1)加起來恰好等於m本身。注意:1沒有真因子,所以1不是完全數。計算機已經證實在10300以下,沒有奇數的完全數。例如,因爲6 = 1 + 2 + 3,所以6是一個完全數。
從鍵盤任意輸入一個整數m,編程判斷m是否是完全數。若m是完全數,則輸出“Yes!”,並同時打印出每一個完美數的全部因子,以驗證這個數確實是一個完美數。若m不是完全數,則輸出“No!”
程序運行示例1
Input m:
28↙
Yes!
1,2,4,7,14

程序運行示例2
Input m:
6↙
Yes!
1,2,3

程序運行示例3
Input m:
1↙
No!

輸入格式: “%d”
輸出格式:
輸入信息提示:”Input m:\n”
輸出格式: “%d”
輸出信息提示:”Yes!\n”
“No!\n”

#include <stdio.h>
#include <math.h>
int IsPerfect(int x);
void OutputFactor(int m);
int main()
{          
    int m;
    printf("Input m:\n");
    scanf("%d", &m);
    if (IsPerfect(m))  //若m是完全數
    {          
        printf("Yes!\n");
        OutputFactor(m);
    }
    else                 //若m不是完全數
    {          
        printf("No!\n");
    }
    return 0;
}          
// 函數功能:判斷完全數,若函數返回0,則代表不是完全數,若返回1,則代表是完全數
int IsPerfect(int x)
{          
    int i;
    int sum = 0;  //x爲1時,sum=0,函數將返回0,表示1沒有真因子,不是完全數
    for (i = 1; i < x; i++)
    {          
        if (x % i == 0)
        {          
            sum = sum + i;
        }
    }
    return sum == x ? 1 : 0;
}          
// 函數功能:輸出x的所有包括1在內的因子
void OutputFactor(int m)
{          
    int i, isFirstFactor = 1;
    for (i = 1; i < fabs(m); i++) //輸出包括1在內的因子,所以從1開始
    {          
        if (m % i == 0)
        {          
            if (isFirstFactor == 0)     printf(",");
            printf("%d", i);
            isFirstFactor = 0;
        }
    }
    printf("\n");
}       
#include<stdio.h>

int panduan(int m);
main()
{
    int m, k, i;
    printf("Input m:\n");
    scanf("%d", &m);
    k = panduan(m);
    if (k == 0)
    {
        printf("No!\n");
    }
    else
    {
        printf("Yes!\n");
        for (i = 1; i < m; i++)
        {
            if (m % i == 0)
                printf("%d,", i);
        }
        printf("\b ");

    }
}

int panduan(int m)
{
    int j, sum = 0;
    for (j = 1; j < m; j++)
    {
        if (m % j == 0)
            sum = sum + j;
    }
    if (sum == m)
        return 1;
    return 0;
}

24.
用迭代法求x=sqrt(a)。求平方根的迭代公式爲:xn+1= (1/2)(xn+ a/xn),要求前後兩次求出的x的差的絕對值小於10-5。

**輸入格式要求:”%f” 提示信息:”請輸入一個整數:”
**輸出格式要求:”%5.2f的平方根=%8.5f\n”

#include<stdio.h>
#include<math.h>
main()
{
    float x1, x2 = 1.0;
    float a;
    printf("請輸入一個整數:");
    scanf("%f", &a);
    do
    {
        x1 = x2;
        x2 = (x1 + a / x1) / 2.0;
    }
    while (fabs(x1 - x2) >= 1e-5);
    printf("%5.2f的平方根=%8.5f\n", a, x2);
}

25.
尋找最佳存款方案。已知銀行整存整取不同期限存款的年息利率分別爲

假設銀行對定期存款過期部分不支付利息,現在某人有2000元錢,要存20年,問怎樣存才能使20年後得到的本金和複利之和最多?

**輸出格式要求:”8 year: %d\n” “5 year: %d\n” “3 year: %d\n” “2 year: %d\n” “1 year: %d\n” “Total: %.2f\n”

程序運行示例如下:

8 year: 0
5 year: 0
3 year: 0
2 year: 0
1 year: 20
Total: 3121.02

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

int main(void)
{             
    int i8, i5, i3, i2, i1, n8, n5, n3, n2, n1;
    double  max = 0, total;
    for (i8 = 0; i8 < 3; i8++)
        for (i5 = 0; i5 <= (20 - 8 * i8) / 5; i5++)
            for (i3 = 0; i3 <= (20 - 8 * i8 - 5 * i5) / 3; i3++)
                for (i2 = 0; i2 <= (20 - 8 * i8 - 5 * i5 - 3 * i3) / 2; i2++)
                {             
                    i1 = 20 - 8 * i8 - 5 * i5 - 3 * i3 - 2 * i2;
                    total = 2000 * pow(1 + 0.0225, i1)
                            * pow(1 + 0.0243, i2)
                            * pow(1 + 0.0270, i3)
                            * pow(1 + 0.0288, i5)
                            * pow(1 + 0.0300, i8);
                    if (total > max)
                    {             
                        max = total;
                        n1 = i1;
                        n2 = i2;
                        n3 = i3;
                        n5 = i5;
                        n8 = i8;
                    }
                }
    printf("8 year: %d\n", n8);
    printf("5 year: %d\n", n5);
    printf("3 year: %d\n", n3);
    printf("2 year: %d\n", n2);
    printf("1 year: %d\n", n1);
    printf("Total: %.2f\n", max);
    return 0;
}           

26.
每個合數都可以寫成幾個質數相乘的形式。將一個正整數分解質因數。例如90=2* 3* 3* 5,而質因數分解只針對合數,質數沒有質因數。當程序輸入質數時,輸出”Invalid input.”,否則輸出其質因數序列。
**輸入格式要求:”%d”
**輸出格式要求:”%d” “,” “Invalid input.\n”
程序運行示例1如下:
89
Invalid input.
程序運行示例2如下:
98
2,7,7

#include<stdio.h>
int sushu(int n)
{
    int i;
    for (i = 2; i < n; i++)
    {
        if (n % i == 0)
            return 0;
    }
    return 1;
}
main()
{
    int n, i=1;
    scanf("%d", &n);
    if (sushu(n))
        printf("Invalid input.\n");
    else
    {
        do
        {
            n=n/i;
            for (i = 2;; i++)
            {
                if (n % i == 0)
                {
                    printf("%d", i);
                    break;
                }
            }
            if (n/i!=1)
                printf(",");
        }
        while (n/i!=1);
    }

}

27.
編程驗證哥德巴赫猜想:任意一個充分大的偶數,可以用兩個素數之和表示。如:
4 = 2 + 2 6 = 3 + 3。
**輸入格式要求:”%d” 提示信息:”Input a number:\n” 輸入奇數時報錯: “Input error!\n”
**輸出格式要求:輸入偶數時顯示”%d=%d+%d\n”
程序的運行的輸入輸出樣例1:
屏幕先顯示提示信息:
Input a number:
然後用戶鍵盤輸入:
9
最後屏幕輸出:
Input error!
程序的運行的輸入輸出樣例2:
屏幕先顯示提示信息:
Input a number:
然後用戶鍵盤輸入:
100
最後屏幕輸出:
100=3+97

#include<stdio.h>
#include<stdlib.h>
int sushu(int n);
main()
{
    int n, i, j;
    printf("Input a number:\n");
    scanf("%d", &n);
    if (n % 2 != 0)
    {
        printf("Input error!\n");
    }
    else
    {
        for (i = 2;i<n; i++)
        {
            if (sushu(i))
            {
                for (j = 2;j<n; j++)
                {
                    if (sushu(j))
                    {
                        if (n == i + j)
                        {
                            printf("%d=%d+%d\n", n, i, j);
                            exit (0);
                        }
                    }
                }
            }
        }
    }
}
int sushu(int n)
{
    int k;
    for (k = 2; k < n; k++)
    {
        if (n % k == 0)
        {
            return 0;
        }
    }
    return 1;
}

28.
下一代因特網IPv6的地址佔128位(二進制位,也稱爲比特),假設以每秒100萬個地址的速度分配,請問分配完需要花費多少年?
**輸出格式要求:”%f”

#include<stdio.h>
#include<math.h>
int main()
{                       
    double t, m;
    int s = 0, n, x, j;
    t = 2;
    for (n = 2; n <= 50; n++)
    {                       
        t = t * 2;
        m = t - 1;
        x = 0;
        for (j = 3; j <= sqrt(m); j += 2)
        {                       
            if (m / j == (int)(m / j))
            {                       
                x = 1;
                break;
            }
        }
        if (x == 0)
        {                       
            s = s + 1;
            printf("2^%d-1=%.0lf\n", n, m);
        }
    }
    printf("指數n於[2,50]中梅森尼數共有%d個.", s);
    return 0;
}     

29.

假設有40個學生被邀請來給餐廳的飲食和服務質量打分,分數劃分爲11010個等級(1表示最低分,10表示最高分),編程統計並按如下格式輸出餐飲服務質量調查結果。
Grade       Count       Histogram
1        5      *****
2       10      **********
3        7      ******* 
...
**輸入格式要求:"%d"  提示信息:"Input the feedbacks of 40 students:\n"  "input error!\n"
**輸出格式要求:"Feedback\tCount\tHistogram\n"  "%8d\t%5d\t"
程序運行示例如下:
Input the feedbacks of 40 students:
10 9 10 8 7 6 5 10 9 8
8 9 7 6 10 9 8 8 7 7
6 6 8 8 9 9 10 8 7 7
9 8 7 9 7 6 5 9 8 7
Feedback    Count   Histogram
       1        0   
       2        0   
       3        0   
       4        0   
       5        2   **
       6        5   *****
       7        9   *********
       8       10   **********
       9        9   *********
      10        5   *****
#include<stdio.h>
#define M 40
#define N 11
main()
{
    int i,j,grade,feedback[M],count[N]={0};
    printf("Input the feedbacks of 40 students:\n");
    for(i=0;i<M;i++)
    {
        scanf("%d",&feedback[i]);
    }
    for(i=0;i<M;i++)
    {
        count[feedback[i]]++;
    }
    printf("Feedback\tCount\tHistogram\n");
    for(grade=1;grade<=N-1;grade++)
    {
        printf("%8d\t%5d\t",grade,count[grade]);
        for(j=0;j<count[grade];j++)
        {
            printf("*");
        }
        printf("\n");
    }
    return 0;
}   

30.
統計正整數中指定數字的個數
從鍵盤輸入一個正整數number,求其中含有指定數字digit的個數。例如:從鍵盤輸入正整數number=1222,若digit=2,則1223中含有 3個2,要求用函數實現。函數原型爲:int CountDigit(int number,int digit);

程序運行結果示例1:
Input m,n:
1222,2↙
3

程序運行結果示例2:
Input m,n:
1234,6↙
0

輸入格式: “%d,%d”
輸出格式:
輸入提示信息:”Input m,n:\n”
輸出格式:”%d\n”

#include<stdio.h>
int count = 0;
int CountDigit(int number, int digit);
main()
{
    int m, n;
    printf("Input m,n:\n");
    scanf("%d,%d", &m, &n);
    printf("%d", CountDigit(m, n));
}
int CountDigit(int number, int digit)
{
    int i;
    if (number % 10 == digit)
        count++;
    i = number / 10;
    if (i != 0) CountDigit(i, digit);
    return count;

}            

31.有趣的“迴文”檢測
英文中有很多的迴文詞,迴文詞的拼法十分有趣,無論是從前往後拼讀,還是從後往前拼讀,他們的拼法和詞義都不變。例如:dad(爸爸),mum(媽媽),noon(中午),eve(前夕),eye(眼睛),pop(流行),deed(行爲),level(水平)等。簡單地說,“迴文”就是指順讀和倒讀都一樣的字符串。現在請你編程輸入一個單詞,判斷它是否是迴文。
提示:
(1)設置兩個指針pStart和pEnd,讓pStart指向字符串首部,讓pEnd指向字符串尾部。
(2)利用循環從字符串兩邊對指針所指字符進行比較,當對應的兩字符相等且兩指針未超越對方時,使指針pStart向前移動一個字符位置(加1),使指針pEnd向後移動一個字符位置(減1),一旦發現兩字符不等或兩指針已互相超越(不可能是迴文),則立即停止循環。
(3)根據退出循環時兩指針的位置,判斷字符串是否爲迴文。
程序的兩次運行結果如下:
第1次
Input string:ABCCBA↙
Yes!
第2次
Input string:student↙
No!
輸入格式: 字符串輸入用gets()函數
輸出格式:
輸入提示信息:”Input string:”
輸出信息,不是迴文:”No!\n”
輸出信息,是迴文:”Yes!\n”

#include<stdio.h>
#include<string.h>
main()
{
    char a[20], *pStart, *pEnd;
    int l, i = 1;
    printf("Input string:");
    gets(a);
    l = strlen(a);
    pStart = &a[0], pEnd = &a[l - 1];
    do
    {
        if (*pStart != *pEnd)
            break;
        pStart++;
        pEnd--;
    }
    while (pStart < pEnd);
    if (pStart < pEnd)
        printf("No!\n");
    else printf("Yes!\n");

    }

32.字符串逆序輸出

void inverse(char str[])
{
    char b[80];
    int l,i;
    l = strlen(str);
    for (i = 0; i < l; i++)
    {
        b[i] = str[l - i - 1];
    }
    b[l] = '\0';
    strcpy(str, b);
}

33.
輸入兩個長度小於100的字符串A和B,且A的長度大於B的長度,判斷B是不是A的子串,是則輸出”YES”,否則輸出”NO”。注意:串中任意個連續的字符組成的子序列稱爲該串的子串。
提示:不需要使用自定義函數實現,也不能使用已有的字符串查找子串函數
輸入:輸入兩行,第一行爲字符串A,第二行爲字符串B。
輸入提示信息:”Please input the first str:”
輸入格式:”%s”
輸入提示信息:”Please input the second str:”
輸入格式:”%s”
如:
Please input the first str: Abcdefghijk123
Please input the second str: 123

Please input the first str: abefsfl
Please input the second str: befs

Please input the first str: aAbde
Please input the second str: abc
輸出:按題目要求輸出一行,”YES” 或 “NO”。
輸出樣例:
YES

YES

NO

#include<stdio.h>
#include<string.h>
main()
{
    char str1[100], str2[100];
    int l1, l2, i, j, flag = 0;
    printf("Please input the first str:");
    gets(str1);
    printf("Please input the second str:");
    gets(str2);
    l1 = strlen(str1), l2 = strlen(str2);
    char str[l2 + 1];
    for (i = 0; i <= l1 - l2; i++)
    {
        for (j = 0; j < l2; j++)
        {
            str[j] = str1[i + j];
        }
        str[l2] = '\0';
        if (strcmp(str, str2) == 0)
            flag = 1;
    }
    if (flag)
        printf("YES");
    else printf("NO");
}

34.刪去字符

#include <stdio.h>
void Squeeze(char s[], char c);
main()
{
    char a[80], c;
    gets(a);
    scanf(" %c", &c);
    Squeeze(a, c);
    printf("%s\n", a);
}

void Squeeze(char s[], char c)
{
    int i, j = 0;
    char b;
    for (i = 0; s[i] != '\0'; i++)
    {
        if (s[i] != c)
        {
            b = s[i];
            s[j] = b;
            j++;
        }
    }
    s[j] = '\0';
}

35.比較函數

#include <stdio.h>
#define SIZE 80
int MyStrcmp(char s[],char t[]);
main()
{      
    char s[SIZE],t[SIZE],i;
    printf("Input s\n");
    gets(s);//1
    printf("Input t\n");
    gets(t);//1
    i=MyStrcmp(s,t);//2
    if(i>0)//1
        printf("string s>string t.\n");
    else if(i<0)//1
        printf("string s<string t.\n");
    else//1
        printf("string s=string t.\n");
}

36.螺旋矩陣
37.
除了字符數組,C語言還支持另外一種表示字符串的方法,就是直接使用一個指針指向字符串,
我們將第二種形式的字符串稱爲字符串常量,意思很明顯,常量只能讀取不能寫入。
第4行代碼是正確的,可以更改指針變量本身的指向;第3行代碼是錯誤的,不能修改字符串中的字符。
指針和字符數組的應用,用五種方法輸出字符串“China”。請改正程序中的錯誤,使它能得出正確的結果。

#include <stdio.h>

main()
{
    int i = 0;
    char str[6] = {'C', 'h', 'i', 'n', 'a', '\0'}, str1[6] , *ptr, *ptr1, *ptr2 , str2[5];
    while (str[i] != '\0')
    {
        putchar(*str);
        str++;
    }
    scanf("%s", ptr);
    puts(ptr);
    ptr1 = str;
    puts(ptr1);
    ptr2 = "China";
    puts(ptr2);
    str2 = "China";
    printf("%s", str2);
}
#include <stdio.h>

main()
{           
    int i = 0;
    char str[6] = {'C', 'h', 'i', 'n', 'a', '\0'}, str1[6] , *ptr, *ptr1, *ptr2 , str2[6];
    while (str[i] != '\0')
    {           
        putchar(str[i]);
        i++;
    }
    ptr = str1;
    scanf("%s", ptr);
    puts(ptr);
    ptr1 = str;
    puts(ptr1);
    ptr2 = "China";
    puts(ptr2);
    strcpy(str2, "China");
    printf("%s", str2);
}           

38.ISBN識別碼判斷
每一本正式出版的圖書都有一個ISBN號碼與之對應,ISBN碼包括9位數字、1位識別碼和3位分隔符,其規定格式如“x-xxx-xxxxx-x”,其中符號“-”就是分隔符(鍵盤上的減號),最後一位是識別碼,例如0-670-82162-4就是一個標準的ISBN碼。ISBN碼的首位數字表示書籍的出版語言,例如0代表英語;第一個分隔符“-”之後的三位數字代表出版社,例如670代表維京出版社;第二個分隔符後的五位數字代表該書在該出版社的編號;最後一位爲識別碼。
識別碼的計算方法如下:
首位數字乘以1加上次位數字乘以2……以此類推,用所得的結果mod 11,所得的餘數即爲識別碼,如果餘數爲10,則識別碼爲大寫字母X。例如ISBN號碼0-670-82162-4中的識別碼4是這樣得到的:對067082162這9個數字,從左至右,分別乘以1,2,…,9,再求和,即0×1+6×2+……+2×9=158,然後取158 mod 11的結果4作爲識別碼。
你的任務是編寫程序判斷輸入的ISBN號碼中識別碼是否正確,如果正確,則僅輸出“Right”;如果錯誤,則輸出你認爲是正確的ISBN號碼。

程序運行結果示例1:
0-123-41562-4↙
Right

程序運行結果示例2:
0-123-41562-7↙
0-123-41562-4

輸入格式: 用gets()輸入字符串
輸入只有一行,是一個字符序列,表示一本書的ISBN號碼(保證輸入符合ISBN的格式要求)。
輸出格式:
輸入的ISBN號碼的識別碼正確,輸出信息: “Right”
輸入的ISBN號碼的識別碼錯誤,按照規定的格式,輸出正確的ISBN號碼(包括分隔符“-”),輸出格式:”%s”

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a[9], i, sum = 0, j;
    char b;
    scanf("%1d-%1d%1d%1d-%1d%1d%1d%1d%1d", &a[0], &a[1], &a[2], &a[3], &a[4], &a[5], &a[6], &a[7], &a[8], &a[9]);
    scanf("-%c", &b);
    for (i = 0; i < 9; i++)
    {
        sum = sum + a[i] * (i + 1);
    }
    j = sum % 11;
    if (j == 10)
    {
        if (b == 'X')
            printf("Right");
        else
        {
            printf("%d-%d%d%d-%d%d%d%d%d-X", a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9]);
        }
    }
    else
    {
        if (b == j + 48)
            printf("Right");
        else
        {
            printf("%d-%d%d%d-%d%d%d%d%d-%d", a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], j);
        }
    }
    return 0;
}

39.約瑟夫問題
這是十七世紀的法國數學家加斯帕在《數目的遊戲問題》中講的一個故事:15個基督教徒和15個異教徒在海上遇險,必須將一半的人投入海中,其餘的人才能倖免於難,於是想了個辦法:30個人圍成一個圓圈,從第一個人開始依次報數,每數到第9個人就將他扔入大海,如此循環進行直到僅餘15個人爲止。問怎樣排法,才能使每次投入大海的都是異教徒。
**輸出格式要求:”The original circle is (+:papandom, @:christian);\n” “%c ”
程序運行示例如下:
The original circle is (+:papandom, @:christian);
@ @ @ @ + + + + + @ @ + @ @ @ + @ + + @ @ + + + @ + + @ @ +

#include <stdio.h>
struct node
{                     
  int nextp;
  int no_out;
}                      link[31];
main()
{                     
  int i,j,k;
  printf("The original circle is (+:papandom,  @:christian);\n");
  for(i=1;i<=30;i++)
  {                   
    link[i].nextp=i+1;
    link[i].no_out=1;
  }
  link[30].nextp=1;
  j=30;
  for(i=0;i<15;i++)
  {                   
     for(k=0;;)
     if(k<9)
     {                    
       j=link[j].nextp;
       k+=link[j].no_out;
     }
     else break;
     link[j].no_out=0;
  }
  for(i=1;i<=30;i++)
        printf("%c ",link[i].no_out?'@':'+');
    printf("\n");

} 

40. 設計學生通訊錄。
設計一個程序用來存儲學生的姓名(6個字母)及電話號碼(11位數字),以字符#作爲結束輸入。然後輸入待查找姓名,查找該人的電話號碼。並從屏幕輸出。數據從s1開始存放.

注:學生姓名可以有空格

利用以下函數原型進行編寫,請把以下兩個函數補充完整。

void readin(char (*name)[20],char (*tel)[15],int *num);

void search(char *x,char (*name)[20],char (*tel)[15], int n);

int main()

{

    int i;

    char name[MAX][20],tel[MAX][15];

    char searchS[20];

    int num;

    readin(name,tel,&num);

     for(i=1;i<=num;i++)

    {

    printf("name:%s tel: %s\n",name[i],tel[i]);

    }

    printf("Enter a name:");

    gets(searchS);



    search(searchS,name,tel,num);

    return 0;

}

void readin(char (*name)[20],char (*tel)[15],int *num)

{



}

void search(char *x,char (*name)[20],char (*tel)[15], int n);

{



}






輸入數據提示信息:”Enter a name:”

輸入數據格式:gets()函數讀入

輸出數據提示信息:”Not been found!\n”

輸出數據格式:”name:%s tel: %s\n”

**輸入輸出樣例1:

輸入:

li li

13645172020

yu zi

15874560231

feifei

13945058888

yangti

13766062221

huqi

15160624433

#

23145

輸出:

name:li li tel: 13645172020

name:yu zi tel: 15874560231

name:feifei tel: 13945058888

name:yangti tel: 13766062221

name:huqi tel: 15160624433

提示信息:Enter a name:

輸入:

yangti

輸出:

yangti tel: 13766062221

**輸入輸出樣例2:

輸入:

li li

13645172020

yu zi

15874560231

feifei

13945058888

yangti

13766062221

huqi

15160624433

#

23145

輸出:

name:li li tel: 13645172020

name:yu zi tel: 15874560231

name:feifei tel: 13945058888

name:yangti tel: 13766062221

name:huqi tel: 15160624433

提示信息:Enter a name:

輸入:

ttt

輸出:

Not been found!

#include<stdio.h>
#include<string.h>
#define MAX 10
void readin(char (*name)[20], char (*tel)[15], int *num);
void search(char *x, char (*name)[20], char (*tel)[15], int n);
int main()
{
    int i;
    char name[MAX][20], tel[MAX][15];
    char searchS[20];
    int num;
    readin(name, tel, &num);
    for (i = 1; i < num; i++)
    {
        printf("name:%s tel: %s\n", name[i], tel[i]);
    }
    printf("Enter a name:");
    gets(searchS);
    search(searchS, name, tel, num);
    return 0;
}
void readin(char (*name)[20], char (*tel)[15], int *num)
{
    int i;
    for (i = 1; i < MAX; i++)
    {
        gets(name + i);
        gets(tel + i);

        if (strcmp(name + i, "#") == 0)
            break;
    }
    *num = i;

}
void search(char *x, char (*name)[20], char (*tel)[15], int n)
{
    int j, flag = 0;
    for (j = 1; j < n; j++)
    {
        if (strcmp(name + j, x) == 0)
        {
            printf("name:%s tel: %s\n", name + j, tel + j);
            flag = 1;
        }
    }
    if (flag == 0)
        printf("Not been found!\n");

}

41.
請設計一個程序來統計學生成績。功能:輸入學生的姓名和成績,按成績從高到低排列打印輸出,排名在前70%的學生定爲合格地,對後30%的學生定爲不合格。
請改正以下程序中的錯誤。
注:學生姓名不能有空格
注意:請不要刪除行,也不要添加行,請在原行上進行修改。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct infor
{
    char name[30];
    float grade;
}student;

student class_1[40];

void sortclass(student *p,int n);
void swap(student *p1, student *p2);
int main()
{
    int ns,cutoff,i;
    printf("number of student:\n");

        scanf("%d",&ns);
    printf("Enter name and grade for each student:\n");
     for(i=0;i<ns;i++)
    {
        scanf("%s %f", &class_1[i]->name,&class_1[i].grade);
    }
    sortclass(class_1,ns);
    cutoff=(ns*7)/10-1;
    printf("\n");
    for(i=0;i<ns;i++)
    {
        printf("%-6s %3f",class_1[i].name,class_1[i].grade);
        if(i<=cutoff)
            printf(" pass\n");
       else
            printf(" fail\n");

    }
    return 0;
}

void sortclass(student st[], int nst)
{
    int i,j,pick;
    for(i=0;i<(nst-1);i++)
    {
        pick=j;
        for(j=i+1;j<nst-1;j++)
        {
            if(st[j].grade>st[pick].grade)
                pick=i;
            swap(st[i],st[pick]);
        }
    }
}

void swap(student *ps1,student *ps2)
{
    student temp;
    strcpy(temp.name,ps1->name);
    temp.grade=ps1->grade;
    strcpy(*ps1.name,ps2->name);
    ps1->grade=ps2->grade;
    strcpy(ps2->name,temp.name);
    ps2->grade=temp.grade;
}

輸入輸出格式
輸入提示信息1:”number of student:\n”
輸入數據格式1:”%d”
輸入提示信息2:”Enter name and grade for each student:\n”
輸入數據格式2:”%s %f”
輸出提示信息:無
輸出數據格式1:”%s %f\n”
輸出數據格式2:”%-6s %3f”
輸出數據格式2:” fail\n”
輸出數據格式2:” pass\n”

**輸入輸出樣例1:
輸入提示信息1:number of student:
輸入1:6
輸入提示信息2:Enter name and grade for each student:
輸入2:
lili 89
Mary 90.5
Tom 85.5
Sandy 78.6
Jack 65
Hito 62.0
輸出:
Mary 90.500000 pass
lili 89.000000 pass
Tom 85.500000 pass
Sandy 78.599998 pass
Jack 65.000000 fail
Hito 62.000000 fail

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct infor
{
    char name[30];
    float grade;
} student;

student class_1[40];

void sortclass(student st[], int nst);
void swap(student *ps1, student *ps2);
int main()
{
    int ns, cutoff, i;
    printf("number of student:\n");

    scanf("%d", &ns);
    printf("Enter name and grade for each student:\n");
    for (i = 0; i < ns; i++)
    {
        scanf("%s %f", &class_1[i].name, &class_1[i].grade);
    }
    sortclass(class_1, ns);
    cutoff = (ns * 7) / 10 - 1;
    printf("\n");
    for (i = 0; i < ns; i++)
    {
        printf("%-6s %3f", class_1[i].name, class_1[i].grade);
        if (i <= cutoff)
            printf(" pass\n");
        else
            printf(" fail\n");

    }
    return 0;
}

void sortclass(student st[], int nst)
{
    int i, j, pick;
    for (i = 0; i < (nst - 1); i++)
    {
        pick = i;
        for (j = i + 1; j < nst; j++)
        {
            if (st[j].grade > st[pick].grade)
                pick = j;
            swap(&st[i], &st[pick]);
        }
    }
}

void swap(student *ps1, student *ps2)
{
    student temp;
    strcpy(temp.name, ps1->name);
    temp.grade = ps1->grade;
    strcpy(ps1->name, ps2->name);
    ps1->grade = ps2->grade;
    strcpy(ps2->name, temp.name);
    ps2->grade = temp.grade;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章