C++ 程序设计 (西北工业大学)

  已过OJ,仅作参考(代码不一定是最优的,可能存在错误)

  NOJ练习一

  1、计算A+B

 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     int a,b;
 7     cin >> a >> b;
 8     cout << a + b;
 9     
10     return 0;
11 }
View Code

  2、面积及体积的计算

 1 #include <iostream>
 2 using namespace std;
 3 
 4 const double PI = 3.1415926;
 5 int main()
 6 {
 7     double r, h;
 8     cin >> r >> h;
 9     printf("%.2f\n", 2*PI*r);
10     printf("%.2f\n", PI*r*r);
11     printf("%.2f\n", 4*PI*r*r);
12     printf("%.2f\n", 4.0/3*PI*r*r*r);
13     printf("%.2f\n", PI*r*r*h);
14     return 0;
15 }
View Code

  3、总成绩和平均成绩

#include <iostream>
using namespace std;

int main()
{
    double m,l,e;
    cin >> m >> l >> e;
    printf("%.6f\n", m+l+e);
    printf("%.6f\n", (m+l+e)/3);
    return 0;
}
View Code

  NOJ练习二

  1、找最大数

#include <cstdio>

int main()
{
    int a,b,c;
    scanf("%d%d%d",&a,&b,&c);
    
    int max=a;
    if(b>max)
        max=b;
    if(c>max)
        max=c;
    
    printf( "%d\n", max );
        
    return 0;
}
View Code

  2、发奖金

 1 #include <cstdio>
 2 
 3 int main()
 4 {
 5     double i,b;
 6     scanf("%lf",&i);
 7     
 8     if(i<=10){
 9         b=i*0.1;
10     }
11     else if(i<20){
12         b=1+(i-10)*0.075;
13     }
14     else if(i<40){
15         b=1.75+(i-20)*0.05;
16     }
17     else if(i<60){
18         b=2.75+(i-40)*0.03;
19     }
20     else if(i<100){
21         b=3.35+(i-60)*0.015;
22     }
23     else{
24         b=3.95+(i-100)*0.01;
25     }
26     
27     printf( "%f\n", b );
28         
29     return 0;
30 }
View Code

  3、第几天

 1 #include <cstdio>
 2 
 3 int main()
 4 {
 5     int y,m,d,t=0;
 6     scanf("%d-%d-%d",&y,&m,&d);
 7     
 8     int day[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
 9     if(y%4==0&&y%10!=0||y%400==0)
10         day[2]++;
11     
12     for(int i=1; i<m; ++i)
13         t += day[i];
14     t+=d;
15     
16     printf("%d\n",t);
17         
18     return 0;
19 }
View Code

  4、成绩转换

 1 #include <cstdio>
 2 
 3 int main()
 4 {
 5     int score,ch;
 6     scanf("%d",&score);
 7     
 8     switch(score/10){
 9         case 10:
10         case 9:
11             ch='A';break;
12         case 8:
13             ch='B';break;
14         case 7:
15             ch='C';break;
16         case 6:
17             ch='D';break;
18         default:
19             ch='E';        
20     }
21     
22     printf("%c\n",ch);
23         
24     return 0;
25 }
View Code

  5、出租车费

 1 #include <cstdio>
 2 
 3 int main()
 4 {
 5     double d,m;
 6     scanf("%lf",&d);
 7     if(d<=2){
 8         m=7;
 9     }        
10     else if(d<=15){
11         if(d-2==(int)(d-2))
12             m=7+(d-2)*1.5;
13         else
14             m=7+((int)(d-2)+1)*1.5;
15     }
16     else if(d-15==(int)(d-15)){
17         m=26.5+(d-15)*2.1;
18     }
19     else
20         m=26.5+((int)(d-15)+1)*2.1;
21     
22     printf("%f\n",m);
23     
24     return 0;
25 }
View Code

  NOJ练习三

  1、完数

 1 #include <stdio.h>
 2 
 3 #define N 100
 4 int main()
 5 {
 6     int n;
 7     scanf("%d",&n);
 8 
 9     for(int k=1; k<=n;++k )
10     {
11         int a[100] = {0},cnt = 0;
12         int sum = 0;
13         for(int i=1;i<k;++i){
14             if(k%i==0){
15                 sum += i;
16                 a[cnt++] = i; //因子
17             }
18         }
19         if(sum==k){ 
20             printf("%d=",sum);
21             for(int j=0;j<cnt;++j){
22                   if(j!=0){
23                      printf("+");
24                   }
25                   printf("%d",a[j]);
26             }
27             printf("\n");
28         }
29     }
30     
31     return 0;
32 }
View Code

  2、羽毛球比赛

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     for(char a='X'; a<='Z'; ++a)
 6     {
 7         for(char b='X'; b<='Z'; b++){
 8             for(char c='X'; c<='Z'; c++){
 9                 if(a==b||a==c||b==c||  //重复
10                    a=='X'||c=='X'||c=='Z')//条件
11                 continue;
12                 printf("A=%c\nB=%c\nC=%c\n", a, b, c);
13             }
14         }
15     }   
16     return 0;
17 }
View Code

  3、求素数

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     int a,b,t;
 6     scanf("%d%d", &a,&b);
 7     if(a>b)
 8         t=a,a=b,b=t;
 9     
10     for(;a<b;a++){             // a<b
11         for(t=2;t<a;t++){
12             if(a%t==0)
13                 break;
14         }
15         if(a==t)
16             printf("%d ",a);
17     }
18         
19     return 0;
20 } 
View Code

  4、数列之和

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     int n,a1=1,a2=1,t;
 6     double sum=0.0;
 7     
 8     scanf("%d",&n);
 9     
10     for(int i=0; i<n; ++i){
11         sum += 1.0*(a1+a2)/a2;
12         t=a1+a2;
13         a1=a2;
14         a2=t;
15     }
16     printf("%f\n",sum);
17     
18     return 0;
19 }
View Code

  5、自然数立方和

 1 #include <cstdio>
 2 
 3 int main()
 4 {
 5     int n,t,sum=0,i,j;
 6     scanf("%d",&n);
 7 
 8     for(i=1; sum!=n*n*n;  i+=2)//结论不成立 i递增
 9     {
10         t=0,sum=0;
11         for( j=i; t<n; j+=2, t++)//第一个奇数 i 最后一个奇数 j
12         {
13             sum+=j;                 //累加n次奇数
14         }
15     }
16 
17     printf("%d*%d*%d=%d=",n,n,n,n*n*n);
18     for( i-=2;  i<j-2;  i+=2 ) //i,j都多累加2
19         printf( "%d+",i );
20     printf( "%d\n",i );
21 
22     return 0;
23 }
View Code

  6、整数次方

 1 #include <cstdio>
 2 
 3 int main()
 4 {
 5     int x,a;
 6     scanf("%d%d",&x,&a);
 7     
 8     int s=x;  //1次方
 9     for(int i=2; i<=a; ++i){
10         s*=x; //x保持x值
11         s%=1000;        
12     }
13     printf("%d\n",s);
14         
15     return 0;
16 }
View Code

  7、韩信点兵

 1 #include <cstdio>
 2 
 3 int main()
 4 {
 5     int a,b,c,i,flag=0;
 6     scanf("%d%d%d",&a,&b,&c);
 7     
 8     for( i=10; i<=100; ++i ){
 9         if(i%3==a && i%5==b && i%7==c)
10         {
11             flag=1;
12             break;
13         }
14     }
15     if(flag)
16         printf("%d\n",i);
17     else
18         printf("-1\n");
19         
20     return 0;
21 }
View Code

  NOJ练习四

  1、逆序数

 1 #include <cstdio>
 2 
 3 void print( long int n);
 4 
 5 int main()
 6 {
 7     long int n;
 8     scanf( "%ld", &n );
 9     
10     print( n );
11     
12     return 0;
13 }
14 
15 void print( long int n)
16 {
17     if(n==0)
18         return;
19     printf("%d",n%10);
20     print( n/10 );    
21 }
View Code

  2、组合数

 1 #include <cstdio>
 2 
 3 int output( int n, int m);
 4 
 5 int main()
 6 {
 7     int n, m;
 8     scanf( "%d%d", &n, &m );
 9     
10     if( n < m )
11         printf("wrong\n");
12     else
13         printf( "%d\n", output( n, m ) );
14     
15     return 0;
16 }
17 
18 int output( int n, int m)
19 {
20     int a=1,b=1;
21     for(int i=1; i<=m; ++i){
22         a *= n--;
23         b *= i;
24     }
25     return a/b;
26 }
View Code

  3、梯形法求积分

  4、ack函数

 1 #include <cstdio>
 2 int ack( int m, int n ) ; //!
 3 int main()
 4 {
 5     int m,n;
 6     scanf( "%d%d",&m,&n );
 7     printf("%d\n", ack( m, n ) );
 8     
 9     return 0;
10 }
11 int ack( int m, int n ) {
12     if(m==0)
13         return n+1;
14     if(n==0)
15         return ack(m-1,1);
16     return ack(m-1,ack(m,n-1));
17 }
View Code

  5、数字加密

 1 #include <cstdio>
 2 
 3 int encryption(int n);
 4 
 5 int main()
 6 {
 7     int n=1998;
 8     scanf( "%d",&n );
 9     printf("%d\n", encryption( n ) );
10 
11     return 0;
12 }
13 
14 int encryption(int n){
15     int one,two,three,four;
16     one   =       (n/1000+5)%10;             //4->1
17     two   = 10 *  ( (n/100%10+5)%10 );      //3->2
18     three = 100 * ( (n/10%10+5)%10 );       //2->3
19     four  = 1000 *( (n%10+5)%10 );          //1->4
20     return one+two+three+four;
21 }
View Code

  6、最小整数

 1 #include <cstdio>
 2 
 3 int fceil(double x);
 4 
 5 int main()
 6 {
 7     double x;
 8     scanf( "%lf",&x );
 9     printf("%d\n", fceil( x ) );
10 
11     return 0;
12 }
13 
14 int fceil(double x){
15     if(x<0)
16         return (int)x;
17     return x+0.5;
18 }
View Code

  7、发工资

 1 #include <cstdio>
 2 
 3 int salary( int s );
 4 
 5 int main()
 6 {
 7     int count=0,n,s;    
 8     scanf( "%d", &n );
 9     
10     while(n--){
11         scanf("%d",&s);
12         count+=salary(s);
13     }
14     
15     printf("%d\n", count );
16 
17     return 0;
18 }
19 
20 int salary( int s )
21 {
22     /* int CNY[] = {100,50,10,5,2,1};
23     int count = s/100;
24     for(int i=0; i<sizeof(CNY)/sizeof(int); ++i)
25     {
26         s%=CNY[i];
27         count += (s%CNY[i])/CNY[i+1];
28     }
29     return count; */
30     return
31         s/100+(s%=100)/50+(s%=50)/10+(s%=10)/5+(s%=5)/2+(s%=2)/1;
32 }
View Code

  8、时间求和

 1 #include <cstdio>
 2 
 3 struct Time{
 4     int hour;
 5     int minute;
 6     int second;
 7 };
 8 
 9 void sum(struct Time a, struct Time b);
10 
11 int main()
12 {
13     struct Time a,b;
14     scanf( "%d%d%d%d%d%d", 
15             &a.hour,&a.minute,&a.second,
16             &b.hour,&b.minute,&b.second);
17     sum( a, b );
18 
19     return 0;
20 }
21 
22 void sum(struct Time a, struct Time b){
23     struct Time c;
24     c.second = a.second + b.second;
25     c.minute = a.minute + b.minute;
26     c.hour = a.hour + b.hour;
27     if(c.second>=60)
28     {
29         c.second -= 60;
30         c.minute++;
31     }
32     if(c.minute>=60)
33     {
34         c.minute-=60;
35         c.hour++;
36     }
37     printf("%d %d %d\n", c.hour,c.minute,c.second);
38 }
View Code
 1 #include <cstdio>
 2 
 3 void sum(int AH,int AM,int AS,int BH,int BM,int BS);
 4 
 5 int main()
 6 {
 7     int AH, AM, AS, BH, BM, BS;
 8     scanf( "%d%d%d%d%d%d", 
 9             &AH, &AM, &AS,
10             &BH, &BM, &BS);
11     sum( AH, AM, AS, BH, BM, BS );
12 
13     return 0;
14 }
15 
16 void sum(int AH,int AM,int AS,int BH,int BM,int BS){
17     int CS = AS + BS;
18     int CM = AM + BM;
19     int CH = AH + BH;
20     if(CS>=60)
21     {
22         CS -= 60;
23         CM++;
24     }
25     if(CM>=60)
26     {
27         CM-=60;
28         CH++;
29     }
30     printf("%d %d %d\n", CH,CM,CS);
31 }
View Code

  NOJ练习五

  1、数组“赋值”

 1 #include <cstdio>
 2 
 3 int main()
 4 {
 5     int a[100],b[100];
 6     int n;
 7     scanf("%d", &n );
 8     for(int i=0; i<n; ++i)
 9     {
10         scanf("%d",&a[i]);
11         b[i] = a[i];
12     }
13     for(int j=0; j<n; ++j)
14         if(j%2)
15             printf("%d ",b[j]);
16     printf("\n");
17     
18     return 0;
19 }
View Code

  2、左上角

 1 #include <cstdio>
 2 
 3 int main()
 4 {
 5     int arr[100][100];
 6     int n;
 7     scanf("%d", &n );
 8     
 9     for(int i=0; i<n; ++i)
10     {
11         for(int j=0; j<n; ++j){
12             scanf("%d",&arr[i][j]);
13         }
14     }
15     
16     for(int i=0; i<n; ++i)
17     {
18         for(int j=0; j<n-i; ++j){
19             printf("%d ",arr[i][j]);
20         }
21         printf("\n");
22     }
23             
24     return 0;
25 }
View Code

  3、边沿与内芯的差

 1 #include <cstdio>
 2 
 3 int main()
 4 {
 5     int arr[100][100];
 6     int n,m,s1=0,s2=0;
 7     scanf("%d%d", &n,&m );
 8     
 9     for(int i=0; i<n; ++i)
10     {
11         for(int j=0; j<m; ++j){
12             scanf("%d",&arr[i][j]);
13             if(i==0||i==n-1||j==0||j==m-1)
14                 s1+=arr[i][j];
15             else
16                 s2+=arr[i][j];            
17         }
18     }
19         
20     printf("%d\n",s1-s2);
21             
22     return 0;
23 }
View Code

  4、平均值

 1 #include <cstdio>
 2 
 3 double avg(int A[],int s,int e);
 4 
 5 int main()
 6 {
 7     int a[100];
 8     int n,s,e;
 9     scanf("%d", &n);
10     
11     for(int i=0; i<n; ++i)
12         scanf("%d",&a[i]);
13     
14     scanf("%d%d",&s,&e);
15     printf("%f\n",avg(a,s,e));
16             
17     return 0;
18 }
19 
20 double avg(int A[],int s,int e)
21 {
22     double sum=0.0;
23     for(int j=s; j<=e; ++j)//!
24         sum+=A[j];        
25     return sum/(e-s+1);    //!
26 }
View Code

  5、冒泡排序

 1 #include <cstdio>
 2 
 3 void BubbleSort(int A[],int s,int m);
 4 
 5 int main()
 6 {
 7     int a[100];
 8     int n,s,m;
 9     scanf("%d", &n);
10     
11     for(int i=0; i<n; ++i)
12         scanf("%d",&a[i]);
13     
14     scanf("%d%d",&s,&m);
15     BubbleSort(a,s,m);
16     
17     for(int i=0; i<n; ++i)
18         printf("%d ",a[i]);
19             
20     return 0;
21 }
22 
23 void BubbleSort(int A[],int s,int m)
24 {
25     for( ; m>0; m--)  //连续m个元素,s是开始元素,m不是结束元素
26     {
27         for(int j=s; j<s+m-1; ++j) //s+m<=100 j最大98即<99,保证j+1最大99的边界
28             if(A[j]<A[j+1])
29             {
30                 int t=A[j];
31                 A[j]=A[j+1];
32                 A[j+1]=t;
33             }
34     }
35 }
View Code

  6、选择排序

 1 #include <cstdio>
 2 
 3 void SelectionSort(int a[],int s,int m);
 4 
 5 int main()
 6 {
 7     int a[100];
 8     int n;
 9     scanf( "%d", &n );
10     
11     for(int i=0; i<n; ++i)
12         scanf("%d", &a[i]);
13     
14     int s,m;
15     scanf("%d%d",&s,&m);
16     
17     SelectionSort( a, s, m );
18     
19     for(int j=0; j<n; ++j)
20         printf("%d ", a[j]);
21     
22     return 0;
23 }
24 void SelectionSort(int a[],int s,int m)
25 {
26     
27     for(int i=s; i<s+m-1; ++i)
28     {            
29         int index=i;    
30         for( int j=i+1; j<s+m; ++j){    
31             if(a[index]<a[j]){
32                 index = j;
33             }
34         }        
35         if(index!=i){        
36             int t=a[i];
37             a[i]=a[index];
38             a[index]=t;
39         }        
40     }            
41 }
View Code

  7、插入排序

 1 #include <cstdio>
 2 
 3 void InsertionSort(int A[],int s,int m);
 4 
 5 int main()
 6 {
 7     int a[100];
 8     int n;
 9     scanf( "%d", &n );
10     
11     for(int i=0; i<n; ++i)
12         scanf("%d", &a[i]);
13     
14     int s,m;
15     scanf("%d%d",&s,&m);
16     
17     InsertionSort( a, s, m );
18     
19     for(int j=0; j<n; ++j)
20         printf("%d ", a[j]);
21     
22     return 0;
23 }
24 void InsertionSort(int A[],int s,int m)
25 {    
26     int i;
27     for(i=s+1; i<s+m; ++i) //!
28     {
29         int j=i-1,key=A[i];/*保存第i个元素,左边的元素i-1*/
30         while( j>=s && key>A[j] ) //!
31         {/*保存的元素key与之前的元素从右向左逐个比较*/
32             A[j+1]=A[j];/*移动(向右赋值)*/
33             j--;
34         }
35         A[j+1]=key;/*j--退出,恢复正确值j+1*/
36     }    
37 }
View Code

  8、恐怖水母

 1 #include <cstdio>
 2 
 3 void InsertionSort(int A[],int s,int m);
 4 
 5 int main()
 6 {
 7     int d[100],p[100]; //d是n个触手的直径,p是m个海绵宝宝的能力值
 8     int n,m; //n个触手,m个海绵宝宝
 9     scanf( "%d%d", &n,&m );
10     
11     for(int i=0; i<n; ++i)
12         scanf("%d", &d[i]);    
13     for(int j=0; j<m; ++j)
14         scanf("%d", &p[j]);
15     
16     InsertionSort(d,0,n);
17     InsertionSort(p,0,m);
18     
19     int x=0; //x是金币
20     for(int i=0; i<n; ++i)
21     {
22         for(int j=0; j<m; ++j){
23             if( p[j] >= d[i] ){ //找到能力值大于等于触手直径
24                 x += p[j];
25                 break;
26             }                
27         }
28     }
29     
30     if(x==0) //无解
31         printf("NULL\n");
32     else    
33         printf("%d\n",x);
34     
35     return 0;
36 }
37 void InsertionSort(int A[],int s,int m)
38 {    
39     int i;
40     for(i=s+1; i<s+m; ++i) 
41     {
42         int j=i-1,key=A[i];
43         while( j>=s && key<A[j] ) //!
44         {
45             A[j+1]=A[j];
46             j--;
47         }
48         A[j+1]=key;
49     }    
50 }
View Code

  9、山迪的麻烦

#include <cstdio>

int BubbleSort(int A[],int n);

int main()
{
    int card[100];
    int n; 
    scanf( "%d", &n );
    
    for(int i=0; i<n; ++i)
        scanf("%d", &card[i]);    
    
    printf("%d\n", BubbleSort(card,n) );
    
    return 0;
}

int BubbleSort(int A[],int n)
{
    int count=0;
    for(int i=0; i<n; ++i) 
    {
        for(int j=0; j<n-1; ++j) 
            if(A[j]>A[j+1])
            {
                int t=A[j];
                A[j]=A[j+1];
                A[j+1]=t;
                count++;
            }
    }
    return count;
}
View Code

  10、二分查找

 1 #include <cstdio>
 2 
 3 int BinarySearch(int A[],int n, int m);
 4 
 5 int main()
 6 {
 7     int a[100];
 8     int n,m;
 9     scanf("%d", &n);
10     
11     for(int i=0; i<n; ++i)
12         scanf("%d",&a[i]);
13     
14     scanf("%d", &m);
15 
16     int i = BinarySearch(a,n,m);
17     if(-1==i)
18         printf("null\n");
19     else
20         printf("%d\n", i);
21             
22     return 0;
23 }
24 
25 int BinarySearch(int A[],int n, int m)
26 {
27     int left = 0;
28     int right = n-1;
29     while( left<=right )
30     {
31         int mid =  left + (right-left)/2;
32         if(A[mid]==m) 
33             return mid;
34         if( A[mid]>m ) 
35             right = mid-1;
36         else
37             left = mid+1;
38     }
39     return -1;
40 }
View Code

  NOJ练习六

  1、字符串左中右

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 void Left(char src[],int n,char dest[]);
 5 void Right(char src[],int n,char dest[]);
 6 void Mid(char src[],int loc,int n,char dest[]);
 7 
 8 int main()
 9 {
10     char src[128] = "www.nwpu.edu.cn";
11     char dest[128] = "";
12     int n,loc;
13     scanf("%s%d%d", src, &n, &loc);
14     Left( src, n, dest);
15     Right( src, n, dest );
16     Mid( src, loc, n, dest );
17     return 0;
18 }
19 
20 void Left(char src[],int n,char dest[]){
21     int i=0;
22     for( ; i<n; ++i)
23         dest[i] = src[i];
24     dest[i] = '\0';
25     printf("%s\n", dest);
26 }
27 
28 void Right(char src[],int n,char dest[]){
29     int j=n, i=strlen(src)-1;
30     dest[j] = '\0';    
31     while(n--){
32         dest[--j] = src[i--];
33     }    
34     printf("%s\n", dest);
35 }
36 
37 void Mid(char src[],int loc,int n,char dest[]){
38     int j=0;
39     for(; j<n; ++j)
40         dest[j] = src[loc++];
41     dest[j] = '\0';
42     printf("%s\n", dest);
43 }
View Code

  2、字符串替换

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 int main()
 5 {
 6     char src[1000] = "";    
 7     gets( src );
 8     char* p = src;
 9     char* pre = p;
10     
11     while(*p){
12         if( !strncmp(p,"you",3) )
13         {
14             *pre++ = 'w';
15             *pre++ = 'e';
16              p+=3;
17         }
18         *pre++ = *p++;
19     }
20     *pre='\0';
21     
22     puts(src);
23     
24     return 0;
25 }
View Code

  3、字符串比较

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 int stringcompare(char S1[],char S2[]);
 5 
 6 int main()
 7 {
 8     char s1[128],s2[128];
 9     gets(s1);
10     gets(s2);
11     printf("%d\n",stringcompare(s1,s2));
12     
13     return 0;
14 }
15 
16 int stringcompare(char S1[],char S2[]){
17     int ret=0;
18     while(!(ret=*(unsigned char*)S1-*(unsigned char*)S2) && S2){
19         S1++, S2++; //两字符串对应字符不等了 或者 S2到字符串尾部了
20     }                //'\0'与其他字符不等 也相当于S1到尾部了
21     return ret;        
22 }
View Code

  4、字符串复制

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 char* stringcopy(char S1[],char S2[],int m);
 5 
 6 int main()
 7 {
 8     char s1[128]="",s2[128]="";
 9     int m;
10     gets(s2);
11     scanf("%d",&m);
12     printf("%s\n",stringcopy(s1,s2,m));
13     
14     return 0;
15 }
16 
17 char* stringcopy(char S1[],char S2[],int m){
18     char *p = (char*)S1;
19     char *q = (char*)S2+m;
20     while( *p++ = *q++ );
21     return (char*)S1; 
22 }
View Code

  5、字符串排序

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 void stringsort(char s[][32]);
 5 
 6 int main()
 7 {
 8     char s[10][32];
 9     for( int i=0; i<10; ++i ){
10         scanf("%s",s[i]);
11     }
12     stringsort( s );
13     for(int i=0; i<10; ++i)
14         printf("%s ",s[i]);
15     
16     return 0;
17 }
18 //冒泡排序
19 void stringsort(char s[][32]){
20     char t[32];
21     for(int i=0; i<10-1; ++i){
22         for(int j=0; j<10-i-1; ++j){
23             if(strcmp(s[j],s[j+1])>0){
24                 strcpy(t,s[j]);
25                 strcpy(s[j],s[j+1]);
26                 strcpy(s[j+1],t);
27             }
28         }
29     }
30 }
View Code

  6、“摘”数字

 1 #include <cstdio>
 2 #include <cstdlib>
 3 
 4 int main()
 5 {
 6     int arr[32];
 7     char s[128];
 8     char* p = s;
 9     int i=0,flag=1;
10     
11     gets( s );
12     
13     while( *p )
14     {
15         if( *p>='0'&&*p<='9' )
16         {
17             if(flag)
18                 arr[i++]=atoi(p);
19             flag=0;
20         }
21         else{
22             flag=1;
23         }
24         p++;
25     }
26     printf("%d\n", i );
27     for(int j=0; j<i; ++j)
28         printf("%d ",arr[j]);
29     
30     return 0;
31 }
View Code

  7、字符串逆序

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 int main()
 5 {
 6     char s[128];    
 7     gets( s );    
 8     
 9     int i,j=0;
10     while(s[j]!='=')
11         j++;
12     s[j]='\0';
13         
14     for(i=0,j--; i<j; i++,j--)
15     {
16         char t=s[i];
17         s[i]=s[j];
18         s[j]=t;
19     }
20     
21     printf( "%s\n", s );
22     
23     return 0;
24 }
View Code

  8、合并字符串

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 void stringmerge(char S1[],char S2[]);
 5 
 6 int main()
 7 {
 8     char s1[128],s2[128];    
 9     gets( s1 );    
10     gets( s2 );    
11     
12     stringmerge( s1, s2);
13     //strcat(s1,s2);
14     
15     printf( "%s\n", s1 );
16     
17     return 0;
18 }
19 
20 void stringmerge(char S1[],char S2[]){
21     while( *(char*)S1 )
22         (char*)S1++;
23     while( *(char*)S1++ = *(char*)S2++ );    
24 }
View Code

  9、删除字符

 1 #include <cstdio>
 2 
 3 void deletechar(char S[],char c);
 4 
 5 int main()
 6 {
 7     char s[128],c;
 8     gets( s );
 9     c = getchar();
10 
11     deletechar( s, c);
12 
13     printf( "%s\n", s );
14 
15     return 0;
16 }
17 
18 void deletechar(char S[],char c){
19     char *p1=S, *p2=S;
20     while(*p2){
21         if(*p2!=c)  //!!!  
22             *p1++ = *p2;  
23         p2++;
24     }
25     *p1='\0';  //!!!
26 }
View Code

  10、文章统计

 1 #include <cstdio>
 2 
 3 int cletter,sletter,digit,space,other;
 4 void count(char *s);
 5 
 6 int main()
 7 {
 8     char s[128];
 9     
10     int n=3;
11     while( n-- ){
12         gets( s );    
13         count( s );    
14     }
15     
16     printf("%d %d %d %d %d\n",
17         cletter,sletter,digit,space,other);    
18         
19     return 0;
20 }
21 
22 void count(char *s)
23 {    
24     while( *s )
25     {        
26         if(*s>='A'&&*s<='Z')
27             cletter++;
28         else if(*s>='a'&&*s<='z')
29             sletter++;
30         else if(*s>='0'&&*s<='9')
31             digit++;
32         else if(*s==' ')
33             space++;
34         else
35             other++;
36         s++;
37     }    
38 }
View Code

  11、分离单词

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 int main()
 5 {
 6     char s1[128]="",s2[128]="";        
 7     gets( s1 );
 8     
 9     int len = strlen(s1);
10     char* p1=s1+len-1; //字符串尾部指针
11     
12     int flag =0;//不是字母
13     int count=0;//字母个数
14 
15     for(int i=0; i<=len; ++i)
16     {
17         if( *p1>='a'&&*p1<='z' || 
18              *p1>='A'&&*p1<='Z' ) //如果是字母
19         {
20             count++;  //记录字母个数
21             flag = 1; //是字母
22         }    
23         else {
24             flag=0;   //不是字符        
25         }
26                 
27         if(!flag && count) //出现不是字母且字母个数不为0,进行单词连接
28         {                                        
29             strncat(s2,p1+1,count); //连接单词
30             if(i!=len) //最后一个单词没有空格
31                 strcat(s2," ");
32             
33             flag = 1;  //设定是字母
34             count = 0; //字母个数统计归0
35         }
36         p1--; //移动字符串指针        
37     }
38     
39     printf("%s\n",s2); //有回车
40         
41     return 0;
42 }
View Code

  12、特殊要求的字符串

 1 #include <cstdio>
 2 #include <cstring>
 3 int main()
 4 {
 5     char a[10000],b[5000],c[5000],t,k;
 6     int n,i,j;
 7     gets(a);
 8     n=strlen(a);
 9     if(n%2==0)
10     {
11         for(i=0;i<n/2;++i)
12             b[i]=a[i];
13         for(i=n/2;i<n;++i)
14             c[i-n/2]=a[i];
15         for(i=1;i<n/2;++i)
16             for(j=0;j<n/2-i;++j)
17                 if(b[j]<b[j+1])
18                     t=b[j],b[j]=b[j+1],b[j+1]=t;
19         for(i=1;i<n/2;i++)
20             for(j=0;j<n/2-i;j++)
21                 if(c[j]>c[j+1])
22                     t=c[j],c[j]=c[j+1],c[j+1]=t;
23         strcat(c,b);
24         puts(c);
25     }
26     else{
27         for(i=0;i<n/2;i++)
28             b[i]=a[i];
29         for(i=n/2+1;i<n;i++)
30             c[i-(n/2+1)]=a[i];
31         for(i=1;i<n/2;i++)
32             for(j=0;j<n/2-i;j++)
33                 if(b[j]<b[j+1])
34                     t=b[j],b[j]=b[j+1],b[j+1]=t;
35         for(i=1;i<n/2;i++)
36             for(j=0;j<n/2-i;j++)
37                 if(c[j]>c[j+1])
38                     t=c[j],c[j]=c[j+1],c[j+1]=t;
39         printf("%s",c);
40         putchar(a[n/2]);
41         printf("%s",b);
42     }
43     return 0;
44 }
View Code
 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 int  lessthan(char a,char b);
 5 int  greaterthan(char a,char b);
 6 void bubble(char* s, int n, int(*compare)(char,char));
 7 
 8 int main()
 9 {
10     char a[10000],b[5000],c[5000];
11     int n,i;
12     gets(a);
13     n=strlen(a);
14     if(n%2==0)
15     {
16         for(i=0;i<n/2;++i)
17             b[i]=a[i];
18         for(i=n/2;i<n;++i)
19             c[i-n/2]=a[i];
20         bubble(b,n/2,lessthan);
21         bubble(c,n/2,greaterthan);
22         strcat(c,b);
23         puts(c);
24     }
25     else{
26         for(i=0;i<n/2;i++)
27             b[i]=a[i];
28         for(i=n/2+1;i<n;i++)
29             c[i-(n/2+1)]=a[i];
30         bubble(b,n/2,lessthan);
31         bubble(c,n/2,greaterthan);
32         printf("%s",c);
33         putchar(a[n/2]);
34         printf("%s",b);
35     }
36     return 0;
37 }
38 int  lessthan(char a,char b){
39     return  a < b;
40 }
41 int  greaterthan(char a,char b){
42     return  a > b;
43 }
44 void bubble(char* s, int n, int(*compare)(char,char))
45 {
46     int i,j;
47     char t;
48     for(i=1;i<n;i++){
49         for(j=0;j<n-i;j++){
50             if(compare(s[j],s[j+1]))
51                 t=s[j],s[j]=s[j+1],s[j+1]=t;
52         }            
53     }            
54 }
View Code
 1 //不知道为什么过不了OJ
 2 #include <cstdio>
 3 #include <cstring>
 4 
 5 void stringsort1(char *s,int start, int end);
 6 void stringsort2(char *s,int start, int end);
 7 
 8 int main()
 9 {
10     char s[10000]="";
11     char t[10000]="";
12     gets( s );
13     //分割
14     int n=strlen( s );
15     int left=n/2,right=n/2;
16     if(n%2){
17         right++;
18     }
19     //排序
20     stringsort1(s,0,left);
21     stringsort2(s,right,n);    
22     //交换 
23     strncpy(t,s,left);    
24     strncpy(s,s+right,left);
25     strncpy(s+right,t,left);
26     //输出
27     printf("%s\n", s );
28     
29     return 0;
30 }
31 //降序
32 void stringsort1(char *s,int start, int end)
33 {
34     int key[256]={0},index=start;//!!!
35     for(int i=start; i<end; ++i)
36     {    
37         key[s[i]]++;        
38     }
39     for(int j=256;j>=0; --j)
40     {
41         if(key[j]){
42             s[index++] = j;
43             key[j]--;
44             j++;
45         }
46     }
47 }
48 //升序
49 void stringsort2(char *s,int start, int end)
50 {
51     int key[256]={0},index=start;//!!!
52     for(int i=start; i<end; ++i)
53     {    
54         key[s[i]]++;        
55     }
56     for(int j=0;j<=256; ++j)
57     {
58         if(key[j]){
59             s[index++] = j;
60             key[j]--;
61             j--; //!!!
62         }
63     }
64 }
View Code
 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 int  lessthan(char a,char b);
 5 int  greaterthan(char a,char b);
 6 void bubble(char* s, int start,int end, int(*compare)(char,char));
 7 
 8 int main()
 9 {
10     char s[10000]="";
11     char t[10000]="";
12     gets( s );
13     //分割
14     int n=strlen( s );
15     int left=n/2,right=n/2;
16     if(n%2){
17         right++;
18     }
19     //排序
20     bubble(s,0,left,lessthan);
21     bubble(s,right,n,greaterthan);    
22     //交换 
23     strncpy(t,s,left);    
24     strncpy(s,s+right,left);
25     strncpy(s+right,t,left);
26     //输出
27     printf("%s\n", s );
28     
29     return 0;
30 }
31 int  lessthan(char a,char b){
32     return  a < b;
33 }
34 int  greaterthan(char a,char b){
35     return  a > b;
36 }
37 void bubble(char* s, int start, int end, int(*compare)(char,char))
38 {
39     int i,j;
40     char t;
41     for(i=start+1;i<end;i++){
42         for(j=start;j<start+end-i;j++){
43             if(compare(s[j],s[j+1]))
44                 t=s[j],s[j]=s[j+1],s[j+1]=t;
45         }            
46     }    
47 }
View Code

  NOJ练习七

  1、分数加减法

 1 #include <stdio.h>
 2 
 3 int gcd(int a,int b);
 4 
 5 int main()
 6 {
 7     int a,b,c,d;
 8     int up,down;
 9     char op;
10     
11     scanf("%d/%d%c%d/%d",&a,&b,&op,&c,&d);
12     
13     up = (op=='+') ? a*d+c*b : a*d-c*b;
14     down = b*d;
15     
16     if(!up){
17         printf("0\n");
18     }    
19     else{
20         int reduce = gcd(up,down);
21         printf("%d/%d\n",up/reduce,down/reduce);
22     }
23     
24     return 0;
25 }
26 
27 int gcd(int a,int b){
28     return b==0?a:gcd(b,a%b);
29 }
View Code

  2、二进制

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     int n, cnt=32;
 6     char binary[33]="";
 7     
 8     scanf("%d",&n);
 9     
10     while(n){
11         binary[--cnt] = n&0x1 ? '1' : '0';
12         n>>=0x1;
13     }
14         
15     printf("%s\n",binary+cnt);
16     
17     return 0;
18 }
View Code

  3、字符串加密

 1 #include <stdio.h>
 2 
 3 void strencode(char *s);
 4 
 5 int main()
 6 {
 7     char str[128]="";
 8     scanf("%s",str);
 9     
10     strencode(str);    
11     printf("%s\n",str);    
12         
13     return 0;
14 }
15 
16 void strencode(char *s){
17     while(*s){
18         if( (*s>='A'&&*s<='Z') && (*s+=3)>'Z' ){
19             *s-=26;
20         }
21         else if( (*s>='a'&&*s<='z') && (*s-=3)<'a' ){
22             *s+=26;            
23         }
24         s++;
25     }
26 }
View Code

  4、计算成绩表

 1 #include <iostream>
 2 using namespace std;
 3 
 4 struct student{
 5     long no;
 6     char name[128];
 7     int age;
 8     //double english,maths,chinese,politics,physics,chemistry,computer;
 9     double achievement[7];
10     /* double total;//题目要求 无输出
11     double ave;  //题目要求 无输出 
12     bool operator < (const student& s){    
13         return total<s.total;
14     } */
15 };
16 int main()
17 {
18     student stu[10],max;
19     /* max.total=0.0; */
20     double total=0.0;
21     int i=0;
22     while(i<10)
23     {
24         int j=0;
25         double t=0.0;
26         scanf("%ld%s%d",&stu[i].no,stu[i].name,&stu[i].age);
27         while(j<7){
28             scanf("%lf",&stu[i].achievement[j]);
29             t+=stu[i].achievement[j];
30             j++;
31         }
32         /* stu[i].total = t;
33         stu[i].ave   = stu[i].total/7; 
34         if(max.total<stu[i].total) //if(max<stu[i]) 
35             max=stu[i];    */        
36         if(total<t){
37             total=t;
38             max = stu[i];
39         }        
40         i++;
41     }
42     printf("%ld %s %d %.2f %.2f %.2f %.2f %.2f %.2f %.2f ", //注意:最后有个空格
43         max.no,
44         max.name,
45         max.age,
46         max.achievement[0],
47         max.achievement[1],
48         max.achievement[2],
49         max.achievement[3],
50         max.achievement[4],
51         max.achievement[5],
52         max.achievement[6]
53     );
54     return 0;
55 }
View Code

  5、复数

 1 #include <iostream>
 2 using namespace std;
 3 
 4 typedef struct complex {
 5     double r;
 6     double i;
 7 }COMPLEX;
 8 
 9 //和 (a+bi)+(c+di)=(a+c)+(b+d)i
10 void sum(const COMPLEX& c1, const COMPLEX& c2){
11     //(-1.00+5.00i)+(4.00+3.00i)=(3.00+8.00i)
12     char op = '+';
13     printf("(%.2f%+.2fi)%c(%.2f%+.2fi)=(%.2f%+.2fi)\n",
14             c1.r,c1.i,op,c2.r,c2.i,
15        (c1.r+c2.r),
16        (c1.i+c2.i)
17     );
18 }
19 
20 //差 (a+bi)-(c+di)=(a-c)+(b-d)i
21 void difference(const COMPLEX& c1, const COMPLEX& c2){
22     //(-1.00+5.00i)-(4.00+3.00i)=(-5.00+2.00i)    
23     char op = '-';
24     printf("(%.2f%+.2fi)%c(%.2f%+.2fi)=(%.2f%+.2fi)\n",
25             c1.r,c1.i,op,c2.r,c2.i,
26         (c1.r-c2.r),
27         (c1.i-c2.i)
28     );
29 }
30 
31 //积 (a+bi)*(c+di)=(ac-bd)+(bc+ad)i
32 void product(const COMPLEX& c1, const COMPLEX& c2){
33     //(-1.00+5.00i)*(4.00+3.00i)=(-19.00+17.00i)
34     char op = '*';
35     printf("(%.2f%+.2fi)%c(%.2f%+.2fi)=(%.2f%+.2fi)\n",
36             c1.r,c1.i,op,c2.r,c2.i,
37        (c1.r*c2.r-c1.i*c2.i),
38        (c1.i*c2.r+c1.r*c2.i)
39     );    
40 }
41 
42 //商 (a+bi)/(c+di)=(ac+bd)/(c^2+d^2) +((bc-ad)/(c^2+d^2))i
43 void quotient(const COMPLEX& c1, const COMPLEX& c2){
44     //(-1.00+5.00i)/(4.00+3.00i)=(0.44+0.92i)
45     char op = '/';
46     printf("(%.2f%+.2fi)%c(%.2f%+.2fi)=(%.2f%+.2fi)\n",
47             c1.r,c1.i,op,c2.r,c2.i,
48        (c1.r*c2.r+c1.i*c2.i)/(c2.r*c2.r+c2.i*c2.i),
49        (c1.i*c2.r-c1.r*c2.i)/(c2.r*c2.r+c2.i*c2.i)
50     );    
51 }
52 
53 int main()
54 {
55     COMPLEX c1,c2;
56     scanf("%lf%lf%lf%lf",&c1.r,&c1.i,&c2.r,&c2.i);
57     //和 sum  
58     sum(c1,c2);
59     //差 difference
60     difference(c1,c2);
61     //积 product 
62     product(c1,c2);
63     //商 quotient 
64     quotient(c1,c2);    
65     return 0;
66 }
View Code

  6、删除链表的节点

 1 #include <iostream>
 2 using namespace std;
 3 
 4 struct student{
 5     int no;
 6     char name[12];
 7     int age;
 8 };
 9 
10 typedef struct node *linkedList; 
11 struct node{            //链表结点
12     struct student stu; //学生信息
13     struct node *next;  //结点指针
14 };
15 
16 linkedList createLinkedListNode()//创建链表结点 
17 {
18     linkedList l;
19     l = (linkedList)malloc(sizeof (struct node) );
20     l->next = NULL;
21     return l;
22 }
23 
24 linkedList createLinkedList()//建立一个链表
25 {  
26     linkedList head,p;
27     head = p = createLinkedListNode();
28     
29     struct student stu;
30     while(true)
31     {
32         scanf("%d",&stu.no);
33         if(!stu.no){
34             break;
35         }
36         scanf("%s%d",stu.name,&stu.age);
37         p->next = createLinkedListNode();//尾插法
38         p->next->stu = stu;
39         p = p->next; //P指向新结点
40     }
41     
42     return head;    
43 }
44 
45 void deleteNode(linkedList& head, int no)
46 {
47     linkedList p1=head->next , p2=head ;
48     while(p1&&p1->stu.no!=no)
49     {
50         p2=p1;
51         p1=p1->next;
52     }
53     p2->next = p1->next; //删除结点
54     free(p1); 
55 }
56 
57 void printLinkedList(linkedList head)
58 {
59     linkedList p = head->next;
60     
61     while(p)
62     {
63         printf("%d ",p->stu.no);
64         p = p->next;
65     }
66     printf("\n");
67 }
68 
69 int main()
70 {
71     linkedList head = createLinkedList();
72     printLinkedList(head);
73     
74     int no;
75     scanf("%d",&no);
76     deleteNode(head,no);
77     
78     printLinkedList(head);
79     return 0;
80 }
View Code

  7、链表插入节点

 1 #include <iostream>
 2 using namespace std;
 3 
 4 typedef struct node *linkedList; 
 5 struct node{            //链表结点
 6     int no;                //职工号
 7     struct node *next;  //结点指针
 8 };
 9 
10 linkedList createLinkedListNode()//创建链表结点 
11 {
12     linkedList l;
13     l = (linkedList)malloc(sizeof (struct node) );
14     l->next = NULL;
15     return l;
16 }
17 
18 void insert( linkedList& head )
19 {
20     int no;
21     scanf("%d",&no);
22     linkedList p=head,s;
23     
24     while( p->next && no>p->next->no ){//升序
25         p=p->next;
26     }
27     
28     s = createLinkedListNode(); //创建一个结点
29     s->no = no;                 //数据
30     
31     s->next=p->next; //插入
32     p->next=s;
33 }
34 
35 linkedList create()//建立一个链表
36 {  
37     linkedList head;
38     head = createLinkedListNode();
39     
40     int n;
41     scanf("%d",&n);
42     
43     while(n--)
44     {                
45         insert( head );
46     }
47     
48     return head;    
49 }
50 
51 void list(linkedList head)
52 {
53     linkedList p = head->next;    
54     while(p)
55     {
56         printf("%d ",p->no);
57         p = p->next;
58     }
59     printf("\n");
60 }
61 
62 int main()
63 {
64     linkedList head = create();
65     insert(head);
66     list(head);
67 
68     return 0;
69 }
View Code

  8、链表动态增长或缩小

 1 #include <iostream>
 2 using namespace std;
 3 
 4 int ageArr[100] = {0};
 5 
 6 typedef struct node *linkedList; 
 7 struct node{            //链表结点
 8     int age;                //职工号
 9     struct node *next;  //结点指针
10 };
11 
12 linkedList createLinkedListNode()//创建链表结点 
13 {
14     linkedList l;
15     l = (linkedList)malloc(sizeof (struct node) );
16     l->next = NULL;
17     return l;
18 }
19 
20 void deleteNode(linkedList& head, int age)
21 {
22     linkedList p1=head->next , p2=head ;
23     while(p1&&p1->age!=age)
24     {
25         p2=p1;
26         p1=p1->next;
27     }
28     p2->next = p1->next; //删除结点
29     free(p1); 
30 }
31 
32 void insert( linkedList& head )
33 {
34     int age;
35     scanf("%d",&age);
36     if(ageArr[age]){
37         deleteNode(head,age);//删除
38         ageArr[age]--;
39         return;
40     }
41     ageArr[age]++;
42     
43     linkedList p=head,s;
44     while( p->next ){//最后一个结点
45         p=p->next;
46     }
47     s = createLinkedListNode(); //创建一个结点
48     s->age = age;                 //数据
49     
50     s->next=p->next; //插入
51     p->next=s;
52 }
53 
54 linkedList create()//建立一个链表
55 {  
56     linkedList head;
57     head = createLinkedListNode();
58     
59     int n;
60     scanf("%d",&n);
61     
62     while(n--)
63     {                
64         insert( head );
65     }
66     
67     return head;    
68 }
69 
70 void list(linkedList head)
71 {
72     linkedList p = head->next;    
73     while(p)
74     {
75         printf("%d ",p->age);
76         p = p->next;
77     }
78     printf("\n");
79 }
80 
81 int main()
82 {
83     linkedList head = create();
84     list(head);
85 
86     return 0;
87 }
View Code

  9、大数加法

  1 #include <iostream>
  2 #include <cstring>
  3 using namespace std;
  4 
  5 const int N = 100;
  6 
  7 class Number
  8 {
  9     int digit[N];//数组指针
 10     int length;//长度
 11     bool sign; //负数为1
 12     
 13 public:    
 14     
 15     Number():length(0), sign(0)
 16     {
 17         memset(digit,0,sizeof(digit));
 18     }
 19     
 20     Number(const char* s)//构造,类型转换
 21     {    
 22         memset(digit,0,sizeof(digit));
 23         if(s[0]=='-'){      //符号
 24             sign=1;
 25             s++;
 26         }
 27         else sign =0;
 28         
 29         length = strlen(s); //长度
 30         
 31         int j=length-1;    
 32         while( *s )         //数组
 33              digit[j--] = *s++ -'0';
 34     }
 35     
 36     int compare( const Number&t )const{ //对象比较
 37         if(this->length==t.length){
 38             int i=t.length-1;
 39             for( ; i>=0; i-- ){
 40                 if(this->digit[i]<t.digit[i])
 41                     return -1; //长度相等字符小返回-1
 42                 else if(this->digit[i]>t.digit[i])
 43                     return 1;  //长度相等字符大返回1
 44             }
 45             if(i<0) //长度字符相等返回0
 46                 return 0;            
 47         }
 48         else if( this->length< t.length )    
 49             return -1; //长度小返回-1
 50         else
 51             return 1;  //长度大返回1
 52     }
 53     
 54     Number add(const Number &t)const  //对象数组相加
 55     {
 56         Number result;        
 57         int len = compare(t)<0 ? t.length: length;
 58         result.length=len;
 59         
 60         for(int i=0; i<len; i++)
 61         {
 62             result.digit[i] += digit[i]+t.digit[i];
 63             result.digit[i+1] += result.digit[i]/10;      //进位
 64             result.digit[i] %= 10;                      //取余
 65         }
 66         if(result.digit[length]!=0) //最高位不是0,长度加1
 67             result.length++;
 68         return result;
 69     }
 70     
 71     Number subtract(const Number &t) const//对象数组相减
 72     {
 73         Number result;
 74         int len = compare(t)<0 ? t.length: this->length;
 75         result.length=len;
 76         
 77         for(int i=0; i<len; i++)
 78         {
 79             result.digit[i] += this->digit[i]-t.digit[i];
 80             if(result.digit[i]<0){
 81                 result.digit[i] += 10; //借位
 82                 result.digit[i+1]--;   //退一
 83             }
 84         }
 85         while( result.length>1 && result.digit[result.length-1]==0 )
 86             result.length--; //最高位为0 长度减1,直到最高位不是0且长度大于1(考虑到结果等于0的情况)
 87         return result;
 88     }
 89     
 90     Number operator+(const Number &t){
 91         Number result;
 92         if(this->sign==t.sign){ //符号一样 直接加
 93             result = add(t);
 94             result.sign= this->sign;
 95         }
 96         else{ //符号不一样
 97             if(compare(t)==0){//相等        
 98                 result = subtract(t);//result.digit[0] = 0;result.length = 1;            
 99                 result.sign= 0;
100             }
101             else {
102                 if(compare(t)<0){
103                     result = t.subtract(*this);
104                     result.sign = t.sign;
105                 }
106                 else if(compare(t)>0){
107                     result = subtract(t);
108                     result.sign = sign;
109                 }
110             }
111         }
112         return result;
113     } 
114     friend ostream& operator << (ostream& o, const Number& t) {
115         if(t.sign) 
116             o << '-';
117         for(int i=t.length-1; i>=0; i--)
118         {
119             o << t.digit[i];
120         }        
121         return o;
122     }
123 };
124 
125 int main()
126 {
127     char str[N];
128     cin >> str;
129     Number a(str);
130     cin >> str;
131     Number b(str);
132     
133     cout << a + b << endl;
134     
135     return 0;
136 }
View Code

  10、大数减法

  1 #include <iostream>
  2 #include <cstring>
  3 using namespace std;
  4 
  5 const int N = 100;
  6 
  7 class Number
  8 {
  9     int digit[N];//数组指针
 10     int length;//长度
 11     bool sign; //负数为1
 12     
 13 public:    
 14     
 15     Number():length(0), sign(0)
 16     {
 17         memset(digit,0,sizeof(digit));
 18     }
 19     
 20     Number(const char* s)//构造,类型转换
 21     {    
 22         memset(digit,0,sizeof(digit));
 23         if(s[0]=='-'){      //符号
 24             sign=1;
 25             s++;
 26         }
 27         else sign =0;
 28         
 29         length = strlen(s); //长度
 30         
 31         int j=length-1;    
 32         while( *s )         //数组
 33              digit[j--] = *s++ -'0';
 34     }
 35     
 36     int compare( const Number&t )const{ //对象比较
 37         if(this->length==t.length){
 38             int i=t.length-1;
 39             for( ; i>=0; i-- ){
 40                 if(this->digit[i]<t.digit[i])
 41                     return -1; //长度相等字符小返回-1
 42                 else if(this->digit[i]>t.digit[i])
 43                     return 1;  //长度相等字符大返回1
 44             }
 45             if(i<0) //长度字符相等返回0
 46                 return 0;            
 47         }
 48         else if( this->length< t.length )    
 49             return -1; //长度小返回-1
 50         else
 51             return 1;  //长度大返回1
 52     }
 53     
 54     Number add(const Number &t)const  //对象数组相加
 55     {
 56         Number result;        
 57         int len = compare(t)<0 ? t.length: length;
 58         result.length=len;
 59         
 60         for(int i=0; i<len; i++)
 61         {
 62             result.digit[i] += digit[i]+t.digit[i];
 63             result.digit[i+1] += result.digit[i]/10;      //进位
 64             result.digit[i] %= 10;                      //取余
 65         }
 66         if(result.digit[length]!=0) //最高位不是0,长度加1
 67             result.length++;
 68         return result;
 69     }
 70     
 71     Number subtract(const Number &t) const//对象数组相减
 72     {
 73         Number result;
 74         int len = compare(t)<0 ? t.length: this->length;
 75         result.length=len;
 76         
 77         for(int i=0; i<len; i++)
 78         {
 79             result.digit[i] += this->digit[i]-t.digit[i];
 80             if(result.digit[i]<0){
 81                 result.digit[i] += 10; //借位
 82                 result.digit[i+1]--;   //退一
 83             }
 84         }
 85         while( result.length>1 && result.digit[result.length-1]==0 )
 86             result.length--; //最高位为0 长度减1,直到最高位不是0且长度大于1(考虑到结果等于0的情况)
 87         return result;
 88     }
 89     
 90     Number operator-(const Number &t){ //重载-
 91         Number result;
 92         //1.符号一样
 93         if(this->sign==t.sign){ 
 94             if(t.sign==1)
 95             { //都为负数                
 96                 if( compare(t)<0 ||compare(t)==0){                    
 97                     result = t.subtract(*this);
 98                     result.sign = 0;
 99                 }
100                 else{
101                     result = subtract(t);
102                     result.sign = 1;
103                 }        
104             }
105             else//都为正数
106             {
107                 if(compare(t)<0){
108                     result = t.subtract(*this);
109                     result.sign = 1;
110                 }
111                 else{
112                     result = subtract(t);
113                     result.sign= 0;
114                 }                
115             }            
116         }
117         //2.符号不一样
118         else{               
119             result = add(t);
120             result.sign = this->sign;
121         }
122             
123         return result;
124     }
125     
126     friend ostream& operator << (ostream& o, const Number& t) {
127         if(t.sign) 
128             o << '-';
129         for(int i=t.length-1; i>=0; i--)
130         {
131             o << t.digit[i];
132         }        
133         return o;
134     }
135 };
136 
137 int main()
138 {
139     char str[N];
140     cin >> str;
141     Number a(str);
142     cin >> str;
143     Number b(str);
144     
145     cout << a - b << endl;
146     
147     return 0;
148 }
View Code

  NOJ练习八

  1、三角形

 1 #include <iostream>
 2 #include <cmath>
 3 using namespace std;
 4 
 5 class Point{
 6     double x;
 7     double y;
 8 public:
 9     Point(double x = 0.0, double y = 0.0){
10         this->x = x;
11         this->y = y;
12     }
13     double getX()const{
14         return x;
15     }
16     double getY()const{
17         return y;
18     }
19 };
20 
21 class Triangle{
22     Point p1,p2,p3;
23     double lengthOfTwoPoint(const Point& p1, const Point& p2){
24         return sqrt((p1.getX()-p2.getX())*(p1.getX()-p2.getX()) + 
25             (p1.getY()-p2.getY())*(p1.getY()-p2.getY()) );
26     }
27 public:
28     Triangle(const Point& p1, const Point& p2, const Point& p3){
29         if(isTriangle(p1,p2,p3))
30         {
31             this->p1 = p1;
32             this->p2 = p2;
33             this->p3 = p3;
34         }        
35     }
36     bool isTriangle(const Point& p1, const Point& p2, const Point& p3){
37         if( lengthOfTwoPoint(p1,p2)+lengthOfTwoPoint(p1,p3)>lengthOfTwoPoint(p2,p3)&&
38             lengthOfTwoPoint(p2,p1)+lengthOfTwoPoint(p2,p3)>lengthOfTwoPoint(p1,p3)&&
39             lengthOfTwoPoint(p3,p1)+lengthOfTwoPoint(p3,p2)>lengthOfTwoPoint(p1,p2)
40             ){
41             cout << "YES" << endl;    
42             return true;
43         }
44         cout << "NO" << endl;    
45         return false;
46     }
47 };
48 
49 int main()
50 {
51     double x1,y1,x2,y2,x3,y3;
52     cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
53     Point p1(x1,y1),p2(x2,y2),p3(x3,y3);
54     Triangle t(p1,p2,p3);    
55     return 0;
56 }
View Code

  2、薪酬

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 
 5 const int N = 128;
 6 class Employee{
 7     char no[N];
 8     char name[N];
 9     int salary;
10 public:
11     Employee(const char* no,const char* name,int salary):
12         salary(salary){                
13         strcpy(this->no,no);
14         strcpy(this->name,name); 
15     }
16     const char* getNo()const{
17         return no;
18     }
19     const char* getName()const{
20         return name;
21     }
22     const int getSalary()const{
23         return salary;
24     }
25 };
26 class Salesman:public Employee{
27 public:
28     Salesman(const char* no,const char* name,int salary):Employee(no,name,salary){}
29     void print(){
30         cout << getNo() << " " << getName() << " " << getSalary() << endl;
31     }
32 };
33 class Salesmanager:public Salesman{
34     int com;
35 public:
36     Salesmanager(const char* no,const char* name,int salary,int com):
37         Salesman(no,name,salary+com/100),com(com){  }
38     void print(){
39         Salesman::print();
40     }
41 };
42 
43 int main()
44 {
45     char no[N];
46     char name[N];
47     int salary;
48     int com;
49     
50     scanf("%s%s%d",&no,&name,&salary);
51     Salesman sman(no,name,salary);
52     scanf("%s%s%d%d",&no,&name,&salary,&com);
53     Salesmanager smanager(no,name,salary,com);
54     
55     sman.print();
56     smanager.print();
57     return 0;
58 }
View Code

  3、时间间隔

 1 #include <iostream>
 2 #include <cmath>
 3 using namespace std;
 4 
 5 class Time{
 6     int hour;
 7     int minute;
 8     int second;
 9 public:
10     Time(int hour=0, int minute=0, int second=0){
11         this->hour = hour;
12         this->minute = minute;
13         this->second = second;
14     }
15     void setTime(int hour, int minute, int second){
16         this->hour = hour;
17         this->minute = minute;
18         this->second = second;
19     }
20     void showTime(){
21         printf("%02d:%02d:%02d\n",hour, minute, second);
22     }
23     int getHour()const{
24         return hour;
25     }
26     int getMinute()const{
27         return minute;
28     }
29     int getSecond()const{
30         return second;
31     }
32 };
33 
34 class Interval{
35     Time t1;
36     Time t2;
37 public:
38     Interval(const Time&t1,const Time&t2):t1(t1),t2(t2){}
39     void showInerval(){     
40         int s1 = t1.getHour()*3600+t1.getMinute()*60+t1.getSecond() ;
41         int s2 = t2.getHour()*3600+t2.getMinute()*60+t2.getSecond();
42         
43         int s = abs(s2-s1); //两个时间相差的秒数
44         
45         int hour = s/3600;
46         int minute = s%3600/60;
47         int second = s%3600%60;
48         
49         Time(hour,minute,second).showTime();
50     }
51 };
52 int main()
53 {
54     int h,m,s;
55     Time t1,t2;
56     
57     scanf("%d:%d:%d",&h,&m, &s);
58     t1.setTime(h,m,s);
59     scanf("%d:%d:%d",&h,&m, &s);
60     t2.setTime(h,m,s);
61     
62     Interval i(t1,t2);
63     i.showInerval();
64     return 0;
65 }
View Code

  4、面积

 1 #include <iostream>
 2 using namespace std;
 3 
 4 const double PI = 3.1415926;
 5 
 6 class Shape{
 7 public:
 8     virtual double area() = 0;
 9     virtual~Shape(){}
10 };
11 
12 class Circle:public Shape{
13     double r;
14 public:
15     Circle(double r):r(r){ }
16     double area(){
17         return PI*r*r;
18     }
19 };
20 
21 class Rectangle:public Shape{
22     double l,w;
23 public:
24     Rectangle(double l,double w):l(l),w(w){ }
25     double area(){
26         return l*w;
27     }
28 };
29 
30 class Trapezoid:public Shape{
31     double l,w,h;
32 public:
33     Trapezoid(double l,double w,double h):l(l),w(w),h(h){ }
34     double area(){
35         return (l+w)*h/2;
36     }
37 };
38 
39 class Triangle:public Shape{
40     double s,h;
41 public:
42     Triangle(double s,double h):s(s),h(h){ }
43     double area(){
44         return 0.5*s*h;
45     }
46 };
47 
48 void shapeArea( Shape* sp )
49 {
50     if(sp){
51         printf( "%.2f\n",sp->area() );
52         delete sp;
53     }    
54 }
55 
56 int main()
57 {
58     double r,l,w,h;
59     
60     scanf("%lf",&r);
61     shapeArea( new Circle(r));
62     
63     scanf("%lf%lf", &l,&w);
64     shapeArea( new Rectangle(l,w) );
65     
66     scanf("%lf%lf%lf", &l,&w,&h);
67     shapeArea ( new Trapezoid(l,w,h));
68     
69     scanf("%lf%lf", &l,&h);
70     shapeArea( new Triangle(l,h));
71     
72     return 0;
73 }
View Code

  5、时钟

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class Clock{
 5     int hour;
 6     int minute;
 7     int second;
 8 public:
 9     Clock& operator++(){
10         if(++second >= 60){
11             second -= 60;
12             minute++;
13         }
14         if(minute >= 60){
15             minute -= 60;
16             hour++;
17         }
18         hour %= 24;
19         return *this;
20     }
21     Clock operator++(int){ //后置++
22         Clock c = *this;
23         if(++second >= 60){
24             second -= 60;
25             minute++;
26         }
27         if(minute >= 60){
28             minute -= 60;
29             hour++;
30         }
31         hour %= 24;
32         return c;
33     }
34         Clock& operator--(){
35         if(--second <0){
36             second += 60;
37             minute--;
38         }
39         if(minute < 0){
40             minute += 60;
41             hour--;
42         }
43         if(hour < 0)
44             hour += 24;
45         return *this;
46     }
47     Clock operator--(int){ //后置--
48         Clock c = *this;
49         if(--second <0){
50             second += 60;
51             minute--;
52         }
53         if(minute < 0){
54             minute += 60;
55             hour--;
56         }
57         if(hour < 0)
58             hour += 24;
59         return c;
60     }
61     void SetTime(int hour, int minute, int second){
62         this->hour = hour;
63         this->minute = minute;
64         this->second = second;
65     }
66     void ShowTime(){
67         printf("%02d:%02d:%02d\n",hour, minute, second);
68     }
69 };
70 
71 int main()
72 {
73     int n;
74     int h,m,s;
75     scanf("%d:%d:%d",&h,&m, &s);
76     
77     Clock t1,t2;
78     t1.SetTime(h,m,s);
79     
80     scanf("%d",&n);
81     switch(n){
82         case 1: t2=t1++; t1.ShowTime(); t2.ShowTime();break;
83         case 2: t2=t1--; t1.ShowTime(); t2.ShowTime();break;
84         case 3: t2=++t1; t1.ShowTime(); t2.ShowTime();break;
85         case 4: t2=--t1; t1.ShowTime(); t2.ShowTime();break;        
86     }    
87     return 0;
88
  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
西北工业大学NOJC程序设计习题答案(非本人制作,侵删) 1.“1“的传奇 2.A+B 3.A+BⅡ 4.AB 5.ACKERMAN 6.Arithmetic Progressions 7.Bee 8.Checksum algorithm 9.Coin Test 10.Dexter need help 11.Double 12.Easy problem 13.Favorite number 14.Graveyard 15.Hailstone 16.Hanoi Ⅱ 17.Houseboat 18.Music Composer 19.Redistribute wealth 20.Road trip 21.Scoring 22.Specialized Numbers 23.Sticks 24.Sum of Consecutive 25.Symmetric Sort 26.The Clock 27.The Ratio of gainers to losers 28.VOL大学乒乓球比赛 29.毕业设计论文打印 30.边沿与内芯的差 31.不会吧,又是A+B 32.不屈的小蜗 33.操场训练 34.插入链表节点 35.插入排序 36.插入字符 37.成绩表计算 38.成绩转换 39.出租车费 40.除法 41.创建与遍历职工链表 42.大数乘法 43.大数除法 44.大数加法 45.单词频次 46.迭代求根 47.多项式的猜想 48.二分查找 49.二分求根 50.发工资的日子 51.方差 52.分离单词 53.分数拆分 54.分数化小数 55.分数加减法 56.复数 57.高低交换 58.公园喷水器 59.韩信点兵 60.行程编码压缩算法 61.合并字符串 62.猴子分桃 63.火车站 64.获取指定二进制位 65.积分计算 66.级数和 67.计算A+B 68.计算PI 69.计算π 70.计算成绩 71.计算完全数 72.检测位图长宽 73.检查图像文件格式 74.奖金发放 75.阶乘合计 76.解不等式 77.精确幂乘 78.恐怖水母 79.快速排序 80.粒子裂变 81.链表动态增长或缩短 82.链表节点删除 83.两个整数之间所有的素数 84.路痴 85.冒泡排序 86.你会存钱吗 87.逆序整数 88.排列 89.排列分析 90.平均值函数 91.奇特的分数数列 92.求建筑高度 93.区间内素数 94.三点顺序 95.山迪的麻烦 96.删除字符 97.是该年的第几天 98.是该年的第几天? 99.数据加密 100.搜索字符 101.所有素数 102.探索合数世纪 103.特殊要求的字符串 104.特殊整数 105.完全数 106.王的对抗 107.危险的组合 108.文件比较 109.文章统计 110.五猴分桃 111.小型数据库 112.幸运儿 113.幸运数字”7“ 114.选择排序 115.寻找规律 116.循环移位 117.延伸的卡片 118.羊羊聚会 119.一维数组”赋值“ 120.一维数组”加法“ 121.勇闯天涯 122.右上角 123.右下角 124.圆及圆球等的相关计算 125.圆及圆球等相关计算 126.程序员添加行号 127.找出数字 128.找幸运数 129.找最大数 130.整数位数 131.重组字符串 132.子序列的和 133.子字符串替换 134.自然数立方的乐趣 135.字符串比较 136.字符串复制 137.字符串加密编码 138.字符串逆序 139.字符串排序 140.字符串替换 141.字符串左中右 142.组合数 143.最次方数 144.最大乘积 145.最大整数 146.最小整数 147.最长回文子串 148.左上角 149.左下角

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值