杭电2006~2009计算机学院笔试真题详解

1、输入一个十进制的数,把它转成八进制。类似的把十进制转成16进制,把十六进制转变为十进制等。

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<fstream>
using namespace std;
int main(){
    int n;
    char s[100];
    while(cin>>n){
        int cnt=0;
        do{
            s[cnt++]=n%8+'0';
            n/=8;
        }while(n);
        for(int i=cnt-1;i>=0;i--)
            cout<<s[i];
        cout<<endl;
    }
    return 0;
}

2、输入两个非常大的整数(完全超出了int、long的表示范围),这个整数的长度可能超过100位,计算并输出这两个数相加的结果。(HDU acm 1002 用string处理比较好)
思路:
1、使用三个数组,两个存储加上,最后一个存储答案
2、先让位数相同的部分进行运算。每次加的和放进进位d里面, 然后d%10存入数组,d=d/10,更新进位。
3、计算完之后,很可能有一方没有运算完毕,我们将没有运算完毕的数组继续运算。直到都运算完为止
4、按照题目要求格式输出

#include<stdio.h>
#include<string.h>
#include<iostream>
#define MAX 1001
using namespace std;
char a[MAX],b[MAX];
int c[MAX];//用来存储计算的结果 
int c_cnt;//记录数组c的长度 
int main(){
    int n;
    int i,j,k;//分别为a,b,c三个数组的指针 
    cin>>n;
    for(int cnt=1;cnt<=n;cnt++){
        cin>>a>>b;
        int d=0;//初始化进位为0;
        for(i=strlen(a)-1,j=strlen(b)-1,k=0;i>=0&&j>=0;i--,j--,k++){
            d=a[i]-'0'+b[j]-'0'+d;
            c[k]=d%10;//大数的每一位只存模10的余数 
            d=d/10;//算一下进位是多少 
        } 
        while(i>=0&&j<0){//如果a组数据还没有计算 完毕 
            d=a[i--]-'0'+d;
            c[k++]=d%10;
            d=d/10;
        }
        while(j>=0&&i<0){//如果b组数据还没有计算完毕 
            d=b[j--]-'0'+d;
            c[k++]=d%10;
            d=d/10;
        }
        if(d)
            c[k++]=d;
        cout<<"Case "<<cnt<<":"<<endl;//以下都是控制输出格式 
        cout<<a<<" + "<<b<<" = ";
        for(int i=k-1;i>=0;i--)
            cout<<c[i];
        cout<<endl;
        if(cnt!=n)
            cout<<endl;
    }
    return 0;
}

3、“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。请写一个程序判断读入的字符串是否是“回文”。

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<fstream>
#define MAX 1010
using namespace std;
int main(){
    char s[MAX];
    cin>>s;
    bool flag=true;
    for(int i=0,j=strlen(s)-1;i<strlen(s)&&j>=i;i++,j--){
        //左右各安排一个指针,左边的字符串一直等于右边,那就是回文 
        if(s[i]!=s[j]){
            flag=false;
            break;
        }
    }
    if(flag)    
        cout<<"是回文字符串"<<endl;
    else
        cout<<"不是回文字符串"<<endl;
    return 0;
}

4、输入n个数,按从小到大进行排序并输出。

#include <iostream>  
#include <algorithm>  
using namespace std;  

int main(void)  
{  
      int n, i;  

      scanf("%d", &n);  
      int *p = new int[n];  
      for(i = 0; i < n; ++i)  
             scanf("%d", &p[i]);  
      sort(p, p + n);  
      for(i = 0; i < n; ++i)  
             printf("%d ", p[i]);  
      printf("\n");  
      return 0;  
}  

5、输入一个长整型的数,从低位起取出奇数位组成一个新的数输出。

#include <stdio.h>  
#include<string.h>
#include<iostream>
using namespace std;
int main(){
    long n;
    int ans=0,cnt=1,value=1,i=1;//cnt表示答案的第几位,value表示当前该位置的权值 
    cin>>n;
    while(n){
        if(i%2){
            ans+=n%10*value;
            cnt++;
            value*=10;      
        } 
        n/=10;
        i++;
    } 
    cout<<ans<<endl;
    return 0;
} 

6、输入n个字符串,将它们按字母由小到大的顺序排列并输出。

#include <stdio.h>  
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
bool cmp(string a ,string b ){
    return a<b;
}
int main(){
    int n;
    cin>>n;
    string p[1010];
    for(int i=0;i<n;i++)
        cin>>p[i];
    sort(p,p+n,cmp);
    for(int i=0;i<n;i++)
        cout<<p[i]<<endl;
    return 0;
} 

7、输入两个正整数,求出这两个数的最大公约数。

#include <stdio.h>  
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
int gcd(int a,int b){
    if(b==0)    
        return a;//递归出口
    else
        return gcd(b,a%b);
}
int main(){
    int a,b;
    cin>>a>>b;
    cout<<gcd(a,b)<<endl;
    return 0;
}

8、“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3,输入一个整数,判断它是否是水仙花数。

#include <stdio.h>  
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
bool judge(int num){
    int n=num;//n用来最后做判断 
    int temp[3],i=0,sum=0;
    while(num){//这个时候,num会变化,所以最后不能用来做判断。 
        temp[i++]=num%10;
        num/=10;
    }
    for(int j=0;j<3;j++)
        sum+=temp[j]*temp[j]*temp[j];
    if(sum==n)
        return true;
    return false;   
}
int main(){
    int n;
    cin>>n;
    if(judge(n))
        cout<<"是水仙花数";
    else
        cout<<"不是水仙花数";
    return 0;
}

9、完数的定义:如果一个大于1的正整数的所有因子之和等于它的本身,则称这个数是完数,比如6,28都是完数:6=1+2+3;28=1+2+4+7+14。输入一个整数,判断它是否是完数。

#include <stdio.h>  
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
int main(){
    int n;
    cin>>n;
    int sum=0;
    for(int i=1;i<=n/2;i++){
        if(n%i==0)
            sum+=i;
    }
    if(sum==n)
        cout<<"是完数"<<endl;
    else
        cout<<"不是完数"<<endl; 
    return 0;
}
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值